如果 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 继续支持这种传统语法,但在 SQL 语言中对于连接查询使用符合 ISO/ANSI 标准的语法,提供更大的灵活性。然而,在视图定义中, GBase 8s 扩展语法不要求具体化的视图,因此它可能导致性能劣势。
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 扩展外连接 部分。