FROM 子句
查询中的 FROM 子句列出从中选择数据的表引用(表、视图和子查询)。如果列出多个表引用,则必须在 FROM 子句或 WHERE 子句中使用适当的语法来联接表。如果未指定联接条件,则系统将查询作为交叉联接(笛卡尔乘积)进行处理。
语法
FROM table_reference [, ...]
其中,table_reference 是下列项之一:
with_subquery_table_name [ table_alias ] table_name [ * ] [ table_alias ] ( subquery ) [ table_alias ] table_reference [ NATURAL ] join_type table_reference [ ON join_condition | USING ( join_column [, ...] ) ] table_reference PIVOT ( aggregate(expr) [ [ AS ] aggregate_alias ] FOR column_name IN ( expression [ AS ] in_alias [, ...] ) ) [ table_alias ] table_reference UNPIVOT [ INCLUDE NULLS | EXCLUDE NULLS ] ( value_column_name FOR name_column_name IN ( column_reference [ [ AS ] in_alias ] [, ...] ) ) [ table_alias ] UNPIVOT expression AS value_alias [ AT attribute_alias ]
可选的 table_alias 可用于为表和复杂表引用指定临时名称,如果需要,也可以为其列指定临时名称,如下所示:
[ AS ] alias [ ( column_alias [, ...] ) ]
参数
- with_subquery_table_name
-
WITH 子句中的子查询定义的表。
- table_name
-
表或视图的名称。
- alias
-
表或视图的临时备用名称。必须为派生自子查询的表提供别名。在其他表引用中,别名是可选的。AS 关键字始终是可选的。表别名提供了用于标识查询的其他部分(例如 WHERE 子句)中的表的快捷方法。例如:
select * from sales s, listing l where s.listid=l.listid
- column_alias
-
表或视图中的列的临时备用名称。
- subquery
-
一个计算结果为表的查询表达式。表仅在查询的持续时间内存在,并且通常会向表提供一个名称或别名。但别名不是必需的。您也可以为派生自子查询的表定义列名称。如果您希望将子查询的结果联接到其他表并且希望在查询中的其他位置选择或约束这些列,则指定列的别名是非常重要的。
子查询可以包含 ORDER BY 子句,但在未指定 LIMIT 或 OFFSET 子句的情况下,该子句可能没有任何作用。
- NATURAL
-
定义一个联接,该联接自动将两个表中同名列的所有配对用作联接列。不需要显式联接条件。例如,如果 CATEGORY 和 EVENT 表都具有名为 CATID 的列,则这两个表的自然联接为基于其 CATID 列的联接。
注意
如果指定 NATURAL 联接,但表中没有要联接的同名列配对,则查询默认为交叉联接。
- join_type
-
指定下列类型的联接之一:
-
[INNER] JOIN
-
LEFT [OUTER] JOIN
-
RIGHT [OUTER] JOIN
-
FULL [OUTER] JOIN
-
CROSS JOIN
交叉联接是未限定的联接;它们返回两个表的笛卡尔乘积。
内部联接和外部联接是限定的联接。它们的限定方式包括:隐式(在自然联接中);在 FROM 语句中使用 ON 或 USING 语法;或者使用 WHERE 子句条件。
内部联接仅基于联接条件或联接列的列表返回匹配的行。外部联接返回与内部联接相同的所有行,还返回“左侧”表和/或“右侧”表中的非匹配行。左侧表是第一个列出的表,右侧表是第二个列出的表。非匹配行包含 NULL 值以填补输出列中的空白。
-
- ON join_condition
-
联接规范的类型,其中将联接列声明为紧跟 ON 关键字的条件。例如:
sales join listing on sales.listid=listing.listid and sales.eventid=listing.eventid
- USING ( join_column [, ...] )
-
联接规范的类型,其中用圆括号将列出的联接列括起来。如果指定多个联接列,则用逗号将它们分隔开。USING 关键字必须在列表之前。例如:
sales join listing using (listid,eventid)
- PIVOT
-
将输出由行转换为列,以便以易于阅读的格式表示表格数据。在多个列中水平表示输出。PIVOT 类似于带有聚合的 GROUP BY 查询,它使用聚合表达式来指定输出格式。但是,与 GROUP BY 不同的是,它以列而非行的形式返回输出。
有关演示如何使用 PIVOT 和 UNPIVOT 查询的示例,请参阅 PIVOT 和 UNPIVOT 示例。
- UNPIVOT
-
使用 UNPIVOT 将列旋转为行 – 此运算符将输入表或查询结果中的结果列转换为行,以使输出更易于阅读。UNPIVOT 将其输入列的数据合并为两个结果列:名称列和值列。名称列包含输入中的列名称,例如行条目。值列包含输入列中的值,例如聚合结果。例如,不同类别中的项目计数。
使用 UNPIVOT (SUPER) 反转置对象 - 您可以执行对象反转置,其中 expression 是引用另一个 FROM 子句项的 SUPER 表达式。有关更多信息,请参阅 对象逆透视。它还提供了一些示例,展示如何查询半结构化数据,例如 JSON 格式的数据。
使用说明
联接列必须具有可比较的数据类型。
NATURAL 或 USING 联接仅将每对联接列中的一个联接列保留在中间结果集中。
使用 ON 语法的联接会将两个联接列都保留在其中间结果集中。
另请参阅 WITH 子句。