

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

# FROM 子句
<a name="FROM_clause30"></a>

查询中的 FROM 子句列出从中选择数据的表引用（表、视图和子查询）。如果列出多个表引用，则必须在 FROM 子句或 WHERE 子句中使用适当的语法来联接表。如果未指定联接条件，则系统将查询作为交叉联接（笛卡尔乘积）进行处理。

**Topics**
+ [语法](#FROM_clause30-synopsis)
+ [参数](#FROM_clause30-parameters)
+ [使用说明](#FROM_clause_usage_notes)

## 语法
<a name="FROM_clause30-synopsis"></a>

```
FROM table_reference [, ...]
```

其中，*table\_reference* 是下列项之一：

```
with_subquery_table_name | table_name | ( subquery ) [ [ AS ] alias ]
table_reference [ NATURAL ] join_type table_reference [ USING ( join_column [, ...] ) ]
table_reference [ INNER ] join_type table_reference ON expr
```

## 参数
<a name="FROM_clause30-parameters"></a>

 *with\_subquery\_table\_name*   
[WITH 子句](WITH_clause.md)中的子查询定义的表。

 *table\_name*   
表或视图的名称。

 *alias*   
表或视图的临时备用名称。必须为派生自子查询的表提供别名。在其他表引用中，别名是可选的。AS 关键字始终是可选的。表别名提供了用于标识查询的其他部分（例如 WHERE 子句）中的表的快捷方法。  
例如：  

```
select * from sales s, listing l
where s.listid=l.listid
```
如果定义了表别名，则必须使用该别名在查询中引用该表。  
例如，如果查询是 `SELECT "tbl"."col" FROM "tbl" AS "t"`，则查询将失败，因为表名现在基本上已被覆盖。在这种情况下，有效的查询是 `SELECT "t"."col" FROM "tbl" AS "t"`。

 *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)
```

## 使用说明
<a name="FROM_clause_usage_notes"></a>

联接列必须具有可比较的数据类型。

NATURAL 或 USING 联接仅将每对联接列中的一个联接列保留在中间结果集中。

使用 ON 语法的联接会将两个联接列都保留在其中间结果集中。

另请参阅 [WITH 子句](WITH_clause.md)。