连接表的查询

如果 FROM 子句指定多个表引用,则该查询可从几个表或视图连接行。

连接条件指定来自要被连接的每一表的至少一列之间的关系。由于要对连接条件中的列进行比较,因此它们必须有可兼容的数据类型。

注: 在缺省情况下,数据库服务器连接表和视图所依的顺序不依赖于它们在 FROM 子句中被引用的顺序。要强制被连接的表的顺序与 FROM 子句顺序相匹配,则您可在 SELECT 关键字之后指定 ORDERED 优化器伪指令。要获取更多信息,请参阅 连接顺序伪指令 部分。
SELECT 语句的 FROM 子句可指定几种连接类型。
FROM 子句关键字 相应的结果集
CROSS JOIN

笛卡尔积(所有可能的行的对)

INNER JOIN

仅来自满足连接条件的 CROSS 的行

LEFT OUTER JOIN

一表的满足条件的行,和另一表的所有行

RIGHT OUTER JOIN

与 LEFT 相同,但两表的角色互换

FULL OUTER JOIN 来自两表的 INNER 连接的所有行的并集,以及在其他表中没有匹配的每一表的所有行(在其他的表的被选择的行中使用 NULL 值)

在关系模型的文献中最后四个类别统称为“连接类型”;CROSS JOIN 忽略在被连接的表中特定的数据值,返回笛卡尔积作为它的结果集:每个可能的行的对,其中,每一对中的一行来自每一表。

在内(或简单的)连接中,结果仅包含满足连接条件的行的组合。外连接保留可能会被内连接废弃的那些行。在外连接中,结果包含满足连接条件的行的组合以及来自主表的可能会被废弃的那些行。在来自从表选择的列中,来自主表但在从表中没有相匹配的行的那些行包含 NULL 值。

GBase 8s 对于左外连接支持两种不同的语法:

对于外连接,数据库服务器的较早版本仅支持 GBase 8s 扩展语法。 GBase 8s 继续支持这种传统语法,但在 SQL 语言中对于连接查询使用符合 ISO/ANSI 标准的语法,提供更大的灵活性。然而,在视图定义中, GBase 8s 扩展语法不要求具体化的视图,因此它可能导致性能劣势。

如果您使用符合 ANSI 的语法来指定 FROM 子句中的连接,则对于同一查询块中的所有外连接,还必须使用符合 ANSI 的语法。因此,您不可仅以 OUTER 关键字开启另一外连接。例如,下列查询不是有效的:
SELECT * FROM customer, OUTER orders RIGHT JOIN cust_calls
        ON (customer.customer_num = orders.customer_num)
        WHERE customer.customer_num = 104);

这会返回错误,因为它尝试对外连接将 GBase 8s 扩展 OUTER 语法与符合 ANSI 的 RIGHT JOIN 语法组合在一起。

要了解 GBase 8s 扩展对 LEFT OUTER 外连接的语法,请参阅 GBase 8s 扩展外连接 部分。