FROM 子句可以为 SELECT 语句指定一个或多个源表。

语法

FROM source [, ...]

source 可以是以下元素之一:

参数 说明
table_name[@dblink ] 现有表或视图的名称(可能是 schema 限定的)。dblink 是标识远程数据库的 database link 名称。有关 database link 的信息,请参见 CREATE DATABASE LINK 命令。
alias 包含别名的 FROM 项的替代名称。别名既可用于实现简洁目的,又可用于消除自联接的歧义(在自联接中将多次扫描同一个表)。提供别名时,它会完全隐藏表或函数的实际名称;例如,在给定 FROM foo AS f 时,SELECT 的其余部分必须将此 FROM 项引用为 f 而非 foo
select SELECT 可出现在 FROM 子句中。这就像在此单一 SELECT 命令持续时间内将其输出创建为临时表一样。请注意,子 SELECT 必须用括号括起来,并且必须为它提供别名。
join_type 该参数为以下项之一:
  • [ INNNER ] JOIN
  • LEFT [ OUTER ] JOIN
  • RIGHT [ OUTER ] JOIN
  • FULL [ OUTER ] JOIN
  • CROSS JOIN

对于INNEROUTER 联接类型,必须指定联接条件,即恰好是 NATURALON join_conditionUSING (join_column [, ...] ) 之一。有关含义,请参见以下内容。对于 CROSS JOIN,这些子句可能不会出现。

JOIN 子句组合了两个 FROM 项。如果需要,可使用括号来确定嵌套的顺序。在没有括号的情况下,JOIN 从左到右嵌套。在任何情况下,JOIN 比分隔 FROM 项的逗号结合得更紧密。

CROSS JOININNER JOIN 生成一个简单的笛卡尔积,与在 FROM 的顶层列出这两个项得到的结果相同,但受联接条件(如果有)的限制。CROSS JOIN 等同于 INNER JOIN ON (TRUE),即不通过限定条件删除任何行。这些联接类型只是为了提供符号方便,因为对于您无法使用纯 FROMWHERE 执行的操作,它们也无法完成。

LEFT OUTER JOIN 返回限定笛卡尔积中的所有行(即,传递其联接条件的所有组合行),以及左侧表中的每行(其右侧行未传递联接条件)的一个副本。通过为右侧列插入 null 值,将此左侧行扩展到联接表的整个宽度。请注意,在确定哪些行具有匹配项时,仅考虑 JOIN 子句自身的条件,然后应用外部条件。

相反,RIGHT OUTER JOIN 返回所有联接的行,每个不匹配的右侧行加一行(左侧用 null 值扩展)。这只是为了提供符号方便,因为您通过转换左侧和右侧输入将它转换为 LEFT OUTER JOIN

FULL OUTER JOIN 返回所有联接的行,每个不匹配的左侧行加一行(右侧用 null 值扩展),每个不匹配的右侧行加一行(左侧用 null 值扩展)。

ON join_condition join_condition 是一个表达式,它产生一个 BOOLEAN 类型的值(类似于 WHERE 子句),该值指定联接中的哪些行被视为是匹配的。
USING (join_column [, ...] ) 格式 USING (a, b, ... ) 的子句是 ON left_table.a = right_table.a AND left_table.b = right_table.b ... 的简写形式。此外,USING 意味着联接输出中只包含每对等效列中的一个,而不是包含这两个列。
NATURAL NATURALUSING 列表的简写形式,其中提到两个表中具有相同名称的所有列。

如果指定了多个源,则结果是所有源的笛卡尔积(交叉联接)。通常会添加限定条件以将返回的行限制为笛卡尔积的一个小子集。

示例

以下示例选择 dept 表中的所有条目:

SELECT * FROM dept;
deptno |  dname      |  loc
-------+-------------+-----------
    10 |  ACCOUNTING |  NEW YORK
    20 |  RESEARCH   |  DALLAS
    30 |  SALES      |  CHICAGO
    40 | OPERATIONS  |  BOSTON
 (4 rows)