

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# FROM 子句
<a name="sql-reference-from-clause"></a>

FROM 子句是查询的行源。

```
 <from-clause> :=
    FROM <table-reference> { , <table-reference> }...
 <table-reference> :=
    <table-name> [ <table-name> ] [ <correlation> ]
| <joined-table>
 <table-name> :=  <identifier>
 <table-over> :=  OVER <window-specification>
 <window-specification> :=
 (   <window-name>
| <query_partition_clause>
| ORDER BY <order_by_clause>
| <windowing_clause>
    )
 <windowing-clause> :=
    { ROWS | RANGE }
    { BETWEEN
    { UNBOUNDED PRECEDING
      | CURRENT ROW
      | <value-expression> { PRECEDING | FOLLOWING }
    }
       AND
    { UNBOUNDED FOLLOWING
      | CURRENT ROW
      | <value-expression> { PRECEDING | FOLLOWING }
    }
    | { UNBOUNDED { PRECEDING | FOLLOWING }
      | CURRENT ROW
      | <value-expression> { PRECEDING | FOLLOWING }
    }
    }
```

有关 window-specification 和 windowing-clause 图表，请参阅 Window 语句下的 [WINDOW 子句 (滑动窗口)](sql-reference-window-clause.md)。

```
 <correlation> :=
    [ AS ] <correlation-name> [ '(' <column> { , <column> }... ')' ]
 <joined-table> :=
    <table-reference> CROSS JOIN <table-reference>
  | <table-reference> NATURAL <join-type> JOIN <table-reference>
  | <table-reference> <join-type> JOIN <table-reference>
       [ USING '(' <column> { , <column>}... ')'
       | ON <condition>
       ]
 <join-type> :=
    INNER
  | <outer-join-type> [ OUTER ]
 <outer-join-type> :=
    LEFT
  | RIGHT
  | FULL
```
<a name="SELRELATIONS"></a>
**关系**  
FROM 子句中可以出现多种类型的关系：
+ 命名关系（表、流）。
+ 用圆括号括起来的子查询。
+ 合并两种关系的联接（请参阅本指南中的 JOIN 主题）。
+ 转换表达式。

本指南中的“查询”主题对子查询进行了更详细的介绍。

下面是子查询的一些示例：

```
// set operation as subquery
// (finds how many departments have no employees)
SELECT COUNT(*)
FROM (
  SELECT deptno FROM Dept
  EXCEPT
  SELECT deptno FROM Emp);
// table-constructor as a subquery,
// combined with a regular table in a join
SELECT *
FROM Dept AS d
  JOIN (VALUES ('Fred', 10), ('Bill', 20)) AS e (name, deptno)
  ON d.deptno = e.deptno;
```

与 SELECT 语句其他部分 [例如 [WHERE 子句](sql-reference-where-clause.md) 子句 (WHERE [条件子句](sql-reference-conditions.md))] 中的子查询不同，FROM 子句中的子查询不能包含关联变量。例如：

```
// Invalid query. Dept.deptno is an illegal reference to
// a column of another table in the enclosing FROM clause.
SELECT *
FROM Dept,
  (SELECT *
   FROM Emp
   WHERE Emp.deptno = Dept.Deptno)
```

## 包含多种关系的 FROM 子句
<a name="sqlrf-from-clause-multiple-relations"></a>

如果 FROM 子句包含多种以逗号分隔的关系，则查询将构成这些关系的笛卡尔乘积；也就是说，它会将每种关系中的每一行与所有其他关系中的每一行合并。

因此，FROM 子句中的逗号等同于 CROSS JOIN 运算符。

## 关联名称
<a name="sqlrf-from-clause-correlation-names"></a>

可以使用 AS 关联名称为 FROM 子句中的每种关系分配一个关联名称。此名称是备用名称，在整个查询过程中，可以使用此名称在表达式中引用相应关系。（尽管关系可能是子查询或流，但通常将其称为“表别名”，以与 SELECT 子句中定义的列别名区分开来。）

如果没有 AS 子句，则命名关系的名称将成为其默认别名。（在流式查询中，OVER 子句不会阻止这种默认分配的发生。）

如果查询多次使用同一命名关系，或者任何关系是子查询或表表达式，则需要使用别名。

例如，在以下查询中，命名关系 EMPS 被使用了两次；一次使用其默认别名 EMPS，另一次使用分配的别名 MANAGERS：

```
SELECT EMPS.NAME || ' is managed by ' || MANAGERS.NAME
FROM LOCALDB.Sales.EMPS,
  LOCALDB.Sales.EMPS AS MANAGERS
WHERE MANAGERS.EMPNO = EMPS.MGRNO
```

可以选择在别名后面加上列的列表：

```
SELECT e.empname,
FROM LOCALDB.Sales.EMPS AS e(empname, empmgrno)
```

## OVER 子句
<a name="sqlrf-from-clause-over"></a>

OVER 子句仅适用于流式联接。有关更多详细信息，请参阅本指南中的 [JOIN 子句](sql-reference-join-clause.md)主题。