连接表的查询
如果 FROM 子句指定多个表引用,则该查询可从几个表或视图连接行。
连接条件指定来自要被连接的每一表的至少一列之间的关系。由于要对连接条件中的列进行比较,
因此它们必须有可兼容的数据类型。
注: 在缺省情况下,数据库服务器连接表和视图所依的顺序不依赖于它们在 FROM 子句中被引用
的顺序。要强制被连接的表的顺序与 FROM 子句顺序相匹配,则您可在 SELECT 关键字之后指定
ORDERED 优化器伪指令。要获取更多信息.
在关系模型的文献中最后四个类别统称为“连接类型”;CROSS JOIN 忽略在被连接的表中特定的数
据值,返回笛卡尔积作为它的结果集:每个可能的行的对,其中,每一对中的一行来自每一表。
在内(或简单的)连接中,结果仅包含满足连接条件的行的组合。外连接保留可能会被内连接废弃
的那些行。在外连接中,结果包含满足连接条件的行的组合以及来自主表的可能会被废弃的那些
行。在来自从表选择的列中,来自主表但在从表中没有相匹配的行的那些行包含 NULL 值。
GBase 8s 对于左外连接支持两种不同的语法:
GBase 8s 扩展 OUTER 连接语法
符合 ANSI 的语法
对于外连接,数据库服务器的较早版本仅支持 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 语法组合在一起。