FROM 子句 (SQL Server Compact)

指定要从中检索行的表。在 SQL Server Compact 中,FROM 子句是可选的。

备注

SQL Server Compact 不支持表值函数。

语法

  [ FROM { < table_source > } [ ,...n ]  
< table_source > ::= 
      table_name [ [ AS ] table_alias ] 
   | < joined_table > 
| <derived_table> [ [ AS ] table_alias ]
< joined_table > ::= 
   < table_source > < join_type > < table_source > ON < search_condition > 
| <table_source> CROSS JOIN <table_source>
| <left_table_source> { CROSS | OUTER } APPLY <right_table_source>
   | ( < joined_table > )
< join_type > ::= 
   [ INNER | { { LEFT | RIGHT } [ OUTER ] } ] JOIN ]
left_table_source::= table_source
right_table_source::=table_source

参数

  • < table_source>
    指定 SELECT 语句的表和联接表。

  • table_name [ [ AS ] table_alias]
    指定表名和可选的别名。

    当使用派生表、行集或表值函数时,子句末尾必需的 table_alias 是返回的所有列(包括分组的列)的替代表名。

  • < joined_table >
    结果集是两个或更多表的联接。

    对于多个联接,可以使用括号来指定联接的顺序。

  • derived_table
    从数据库检索行的子查询。derived_table 用作外部查询的输入。

  • < join_type >
    指定联接操作的类型。

  • left_table_source { CROSS | OUTER } APPLY right_table_source
    指定根据 left_table_source 的每行计算 APPLY 运算符的 right_table_source。当 right_table_source 取决于 left_table_source 的值并且很难使用联接操作表示查询时,此功能很有用。

    CROSS 或 OUTER 必须与 APPLY 一起指定。指定 CROSS 并根据 left_table_source 的指定行计算 right_table_source 时,不会生成行,并返回空结果集。

    指定 OUTER 时,为 left_table_source 的每行生成一行,即使根据该行计算 right_table_source 并返回空结果集。

  • left_table_source
    在以前的参数中定义的表源。有关详细信息,请参阅本文档结尾处的“备注”部分。

  • right_table_source
    在以前的参数中定义的表源。有关详细信息,请参阅本文档结尾处的“备注”部分。

  • CROSS JOIN
    指定两个表的叉积。

  • INNER
    指定返回所有匹配的行对。丢弃两个表中的不匹配的行。这是未指定联接类型时的默认设置。

  • LEFT [ OUTER ]
    指定除了内部联接返回的所有行外,左表中不满足指定条件的所有行也将包括在结果集中。左表中的输出列设置为 NULL。

  • RIGHT [ OUTER ]
    指定除了内部联接返回的所有行外,右表中不满足指定条件的所有行也将包括在结果集中。右表中的输出列设置为 NULL。

  • JOIN
    指示将联接指定的表。

  • ON < search_condition >
    指定联接所基于的条件。虽然经常使用列和比较运算符,但该条件可以指定任何有效的谓词。

注释

当可以使用 JOIN 或 APPLY 编写相同的查询时,应使用 JOIN,因为这样速度更快。

如果 right_table_source 中存在未绑定到出现在 right_table_source 中的任何表的任何表引用,则它应该 (i) 与 left_table_source 公开的表名或表别名匹配,或者 (ii) 与外部 FROM 子句公开的表名或别名匹配(如果 APPLY 出现在 WHERE 子句或 SELECT 列表的子查询中)。如果 i 和 ii 中存在匹配的引用,则 i 优先。

APPLY 运算符具有与 JOIN 运算符相同的优先级。如果缺少圆括号,则从左到右计算 JOIN 和 APPLY 运算符的序列。

有关更多信息,请参阅 SQL Server 联机丛书主题:使用 FROM 子句使用 APPLY

示例

下面的示例提供了有关使用 FROM 子句的详细信息。

SELECT [Order ID], [Unit Price]
FROM [Order Details]

使用简单 FROM 子句

下面的示例从 Northwind 示例数据库的 Employees 表中检索 Employee ID 和 Last Name 列。

SELECT [Employee Id], [Last Name]
FROM Employees
ORDER BY [Employee Id]

使用 CROSS JOIN

下面的示例返回 Employees 和 Orders 这两个表的叉积。将返回 Employee ID 行和所有 Order ID 行的所有可能组合的列表。

SELECT E.[Employee ID], O.[Order Id]
FROM Employees E
CROSS JOIN Orders O
ORDER BY E.[Employee ID], O.[Order Id];

使用 LEFT OUTER JOIN

下面的示例根据 Product ID 联接两个表,并保留左表中不匹配的行。Products 表和 Order Details 表的 Product ID 列互相匹配。所有已订购和未订购的产品都将显示在结果集中。

SELECT p.[Product Name], od.[Order ID]
FROM Products p
LEFT OUTER JOIN [Order Details] od
ON p.[Product ID] = od.[Product ID]
ORDER BY p.[Product Name];

下面是结果集:

        Product Name            Order ID
        --------------------------------
        Alice Mutton               10000
        Alice Mutton               10045
        Alice Mutton               10093
        Alice Mutton               10124
        Alice Mutton               10166
(2820 rows affected)

使用 INNER JOIN

下面的示例返回所有产品名和销售订单 ID。

-- By default, SQL Server Compact performs an INNER JOIN if only  
-- the JOIN keyword is specified.
SELECT p.[Product Name], od.[Order ID]
FROM Products p
INNER JOIN [Order Details] od
ON p.[Product ID] = od.[Product ID]
ORDER BY p.[Product Name];

使用 RIGHT OUTER JOIN

下面的示例根据 Product ID 联接两个表,并保留右表中不匹配的行。Products 表和 Order Details 表的 Product ID 列互相匹配。所有已订购和未订购的产品都将显示在结果集中。

SELECT p.[Product Name], od.[Order ID]
FROM Products p
RIGHT OUTER JOIN [Order Details] od
ON p.[Product ID] = od.[Product ID]
ORDER BY p.[Product Name];

使用派生表

下面的示例使用派生表(FROM 子句后的 SELECT 语句),返回所有雇员的名字和姓氏以及有业务往来的客户的联系人姓名和所在城市。

SELECT RTRIM(e.[First Name]) + ' ' + LTRIM(e.[Last Name]) AS [Employee Name], C.[Contact Name], C.City
FROM Employees e
INNER JOIN Orders O 
ON O.[Employee ID] = e.[Employee ID]
INNER JOIN (SELECT [Contact Name], City, [Customer Id] 
FROM Customers) AS C
ON O.[Customer Id] = C.[Customer Id]
ORDER BY e.[Last Name], e.[First Name];

使用 APPLY

CROSS APPLY 将源数据指定为表结果的值而不是表名。CROSS APPLY 可以在为外部查询中的每行飞速生成数据子集的情况下使用。CROSS APPLY 允许用户指定根据外部查询中的行构造子集的方式。下面是使用 CROSS APPLY 对每行执行操作的查询的示例。

示例:

SELECT
FROM
  Orders AS O CROSS APPLY
  (
    SELECT TOP(2) * --for each row in Orders there will be at most 2 customers
    FROM Customers C
    WHERE C.[Customer ID] = O.[Customer ID]
    ORDER BY C.[Customer ID]
  ) AS theOrdersTopCustomers

OUTER APPLY 将源数据指定为表结果的值而不是表名。OUTER APPLY 可以在为外部查询中的每行飞速生成数据子集的情况下使用。与 CROSS APPLY 不同,OUTER APPLY 还保留外部查询中与内部查询不匹配的行。下面的示例显示一个还包括无匹配项的结果的查询。

示例:

SELECT
FROM
  Customers AS C OUTER APPLY
  (
    SELECT TOP(1) *
    FROM Orders O
    WHERE O.[Customer ID] = C.[Customer ID]
    ORDER BY O.[Customer ID]
  ) AS topCustomerID

前面的示例显示 OUTER APPLY 结果包括客户 ID“PARIS”,原因是 Orders 表不包含“PARIS”的任何记录。因此,内部查询返回 NULL,原因是 TOP 客户 ID 与 Orders 表中的“PARIS”匹配。将 OUTER 更改为 CROSS 会从结果中排除“PARIS”。

备注

在 SQL Server Compact 中,APPLY 不支持用户定义的函数。