本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
FROM 子句
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 子句 (滑动窗口)在 Window 语句下。
<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
关系
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 子句子句(WHERE子句),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 子句
如果 FROM 子句包含多个以逗号分隔的关系,则查询会构造这些关系的笛卡尔乘积;也就是说,它将每个关系中的每一行与其他每个关系中的每一行合并。
因此,FROM 子句中的逗号等同于 CROSS JOIN 运算符。
关联名
FROM 子句中的每个关系都可以使用 AS 关联名分配一个相关名。此名称是一种备用名称,在整个查询的表达式中都可以通过该名称来引用关系。(尽管该关系可能是子查询或流,但通常将其称为 “表别名”,以便将其与 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 子句
OVER 子句仅适用于串流联接。欲了解更多详情,请参阅主题加入子句。