Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询和修改数据 » 连接:从多个表检索数据 » 内连接和外连接

 

外连接

通常,您创建的连接只返回满足连接条件的行;这些连接称为内连接,它们是查询时使用的缺省连接。但是,您有时可能想保留一个表中的所有行。若要实现此目的,您可以使用外连接

两个表的左或右外连接将保留一个表的所有行,并为另一个表中不满足连接条件的行提供空值。左外连接保留左侧表中的每一行,右外连接保留右侧表中的每一行。在完全外连接中,保留两个表的所有行。

左外连接或右外连接的左右两侧的表表达式称作保留的提供空值的。在左外连接中,左侧表表达式是保留的,右侧表表达式是提供空值的。

有关使用 Transact-SQL 语法创建外连接的信息,请参见Transact-SQL 外连接(*= 或 =*)

示例

以下语句包括了所有客户。如果某个特定的客户没有下订单,则结果中对应于订单信息的每一列都包含 NULL 值。

SELECT Surname, OrderDate, City
FROM Customers LEFT OUTER JOIN SalesOrders
   ON Customers.ID = SalesOrders.CustomerID
WHERE Customers.State = 'NY'
ORDER BY OrderDate;
Surname OrderDate City
Thompson (NULL) Bancroft
Reiser 2000-01-22 Rockwood
Clarke 2000-01-27 Rockwood
Mentary 2000-01-30 Rockland
... ... ...

此语句中的外连接可解释如下。请注意,这只是概念上的说明,并不表示 SQL Anywhere 实际就是这样计算结果集的。

  • 为客户下的每一份销售订单返回一行。由于为每一个销售订单都返回一行,因此,如果客户下了两个或两个以上的销售订单,就会返回多行。此结果与内连接的结果相同。使用 ON 条件来匹配客户和销售订单行。在此步骤中不使用 WHERE 子句。

  • 为没有下任何销售订单的每一位客户包含一行。这确保包括 Customers 表中的每一行。对于所有这些行,都用空值填充来自 SalesOrders 表的列。因为使用了关键字 OUTER,所以加上这些行,如果是内连接就不会有这些行。在此步骤中既不使用 ON 条件也不使用 WHERE 子句。

  • 使用 WHERE 子句,排除客户不居住在纽约的每一行。


外连接和连接条件
理解复杂外连接
视图和派生表的外连接