联合运算使用 UNION 运算符将两个查询组合成单个复合查询。可以在两个或多个 SELECT 语句之间使用 UNION 运算符来产生一个临时表,它包含存在于任何一个原始表 或所有原始表中的行。还可以在视图的定义中使用 UNION 运算符。 不能在下列上下文的子查询内使用 UNION 运算符
GBase 8s SQL 指南:教程 南大通用数据技术股份有限公司 - 149 - 在 SELECT 语句的 Projection 子句中 在 SELECT 、INSERT 、DELETE 或 UPDATE 语句的 WHERE 子句中 然而, UNION 运算符在 SELECT 语句的 FROM 子句中的子查询中是有效的, 如下所示: SELECT * FROM (SELECT col1 FROM tab1 WHERE col1 = 100) AS vtab1(c1), (SELECT col1 FROM tab2 WHERE col1 = 10 UNION ALL SELECT col1 FROM tab1 WHERE col1 < 50 ) AS vtab2(vc1); GBase 8s 不支持对 ROW 类型进行排序。 由于 UNION 操作需要排序以除去重复值, 所以 当联合运算中的任一查询包括 ROW 类型数据时,不能使用 UNION 操作符。但是,数据 库服务器确实支持具有 ROW 类型数据的 UNION ALL,这是因为此类运算无需排序。 下图举例说明了 UNION 集合运算。 图: 联合集合运算
GBase 8s SQL 指南:教程 南大通用数据技术股份有限公司 - 150 - UNION SELECT stock_num, manu_code FROM items WHERE quantity > 3; 该查询选择单价小于 $25.00 或预订数量大于三的那些商品并列出 其 stock_num 和 manu_code,如下所示。 图: 查询结果 stock_num manu_code
5 ANZ 5 NRG 5 SMT 9 ANZ 103 PRC 106 PRC 201 NKL 301 KAR 302 HRO 302 KAR
将 ORDER BY 子句与 UNION 一起使用 如下列查询所示, 当包括 ORDER BY 子句时, 该子句必须跟在最后的 SELECT 语句后面, 并使用整数(而不是标识)来引用排序的列。排序在集合运算完成之后发生。 图: 查询 SELECT DISTINCT stock_num, manu_code FROM stock WHERE unit_price < 25.00 UNION SELECT stock_num, manu_code FROM items WHERE quantity > 3 ORDER BY 2; 之前的复合查询选择与图 2相同的行但以制造商代码的顺序显示它们,如下所示。 图: 查询结果 stock_num manu_code
UNION ALL 关键字 缺省情况下,UNION 关键字排除重复的行。要保留重复值,添加可选关键字 ALL,如下 所示。 图: 查询 SELECT stock_num, manu_code FROM stock WHERE unit_price < 25.00 UNION ALL SELECT stock_num, manu_code FROM items WHERE quantity > 3 ORDER BY 2 INTO TEMP stock item; 该查询使用 UNION ALL 关键字联合两个 SELECT 语句并在最后一个 SELECT 后面添 加 INTO TEMP 子句来将结果放置到临时列表中。它返回与图 1相同的行,但还包括重复 的值。 图: 查询结果 stock_num manu_code
使用不同的列名 组合查询的 Projection 子句中相应的列必须具有兼容的数据类型,但各列不需要使用相同 的列名。 下列查询从 customer 表中选择 state 列及 state 表中的相应 code 列。 图: 查询 SELECT DISTINCT state FROM customer WHERE customer_num BETWEEN 120 AND 125 UNION SELECT DISTINCT code FROM state WHERE sname MATCHES '*a'; 该查询返回客户号 120 至 125 的州代码缩写以及其 sname 以 a 结束的州的州代码缩写。 图: 查询结果 state
AK AL AZ CA DE ⋮ SD VA WV 在复合查询中, 第一个 SELECT 语句中的列名或显示标注就是出现在结果中的列名或显示 标注。因此,在此查询中,使用第一个 SELECT 语句中的列名 state 而不是第一个语句中 的列名 code。
将 UNION 与多个表配合使用 以下查询对三个表执行联合运算。最大联合数取决于应用程序的实用性和任何内存限制。 图: 查询
GBase 8s SQL 指南:教程 南大通用数据技术股份有限公司 - 153 - SELECT stock_num, manu_code FROM stock WHERE unit_price > 600.00 UNION ALL SELECT stock_num, manu_code FROM catalog WHERE catalog_num = 10025 UNION ALL SELECT stock_num, manu_code FROM items WHERE quantity = 10 ORDER BY 2; 该查询选择 stock 表中的 unit_price 大于 $600、catalog 表中的 catalog_num 为 10025 或 items 表中的 quantity 为 10 的商品;查询按manu_code 对数据进行排序。该结果显示了 返回值。 图: 查询结果 stock_num manu_code
在 Projection 子句中使用文字 下列查询在投影列表中使用文字来标记联合操作的部分输出,以便今后可以区分它。为该 标记提供标号 sortkey。查询使用 sortkey 来对检索到的行进行排序。 图: 查询 SELECT '1' sortkey, lname, fname, company, city, state, phone FROM customer x WHERE state = 'CA' UNION SELECT '2' sortkey, lname, fname, company,
GBase 8s SQL 指南:教程 南大通用数据技术股份有限公司 - 154 - city, state, phone FROM customer y WHERE state <> 'CA' INTO TEMP calcust; SELECT * FROM calcust ORDER BY 1; 该查询创建一个列表,在该列表中,来自 California 的客户首先显示。 图: 查询结果 sortkey 1 lname Baxter fname Dick company Blue Ribbon Sports city Oakland state CA phone 415-655-0011
sortkey 1 lname Beatty fname Lana company Sportstown city Menlo Park state CA phone 415-356-9982 ⋮ sortkey 2 lname Wallack fname Jason company City Sports city Wilmington state DE phone 302-366-7511
使用 FIRST 子句 可以使用 FIRST 子句来选择由联合查询的产生的前几行。以下查询使用 FIRST 子句返 回 stock 和 items 表之间的联合的前五行。
GBase 8s SQL 指南:教程 南大通用数据技术股份有限公司 - 155 - 图: 查询 SELECT FIRST 5 DISTINCT stock_num, manu_code FROM stock WHERE unit_price < 55.00 UNION SELECT stock_num, manu_code FROM items WHERE quantity > 3; 图: 查询结果 stock_num manu_code