本节我们学习如何使用 UNION
操作符将多条 SELECT
语句组合成一个结果集返回,即组合查询。下面是两种使用组合查询的场景:
- 在一个查询中,从不同的表返回结构数据;
- 对一个表执行多个查询,按一个查询返回数据。
注:任何具有多个
WHERE
子句的 SELECT 查询都可以作为一个组合查询。
使用 UNION 创建组合查询
UNION 操作符用来组合多条 SQL 查询,只需要在各条 SELECT 语句之间放上关键字 UNION 。
比如,第一条 SQL 查询客户所在州为 IL
IN
和 MI
的顾客信息:
SELECT
cust_name,
cust_contact,
cust_email
FROM
Customers
WHERE
cust_state IN ( 'IL', 'IN', 'MI' );
运行结果:

第二条 SQL 则检索姓名为 Fun4All
的顾客:
SELECT
cust_name,
cust_contact,
cust_email
FROM
Customers
WHERE
cust_name = 'Fun4All';
运行结果:

组合上述两条 SQL 即为:
SELECT
cust_name,
cust_contact,
cust_email
FROM
Customers
WHERE
cust_state IN ( 'IL', 'IN', 'MI' ) UNION
SELECT
cust_name,
cust_contact,
cust_email
FROM
Customers
WHERE
cust_name = 'Fun4All';
运行结果:

上述两条 SELECT 语句使用 UNION 关键字分隔,UNION 指示 DBMS 执行这两条 SELECT 语句,并把输出组合成一个查询结果。
并且,从组合查询的结果我们发现,UNION 并不仅仅是简单地将两个查询结果拼接在一起,而是对组合结果进行了去重。比如:Fun4All Jim Jones
在两条 SQL 中都有返回,而组合结果中却只有一条。
注:对于复杂的过滤条件,或者从多个表中检索数据的情形,使用 UNION 会更加简洁。
当然,你可以使用包含多个 WHERE 条件的 SQL 实现相同的检索目标:
SELECT
cust_name,
cust_contact,
cust_email
FROM
Customers
WHERE
cust_state IN ( 'IL', 'IN', 'MI' )
OR cust_name = 'Fun4All';
注意事项 1 UNION 中每个查询必须包含相同的列、表达式或聚集函数,字段(列)的顺序可以不同;列的数据类型不必完全一致,但必须是 DBMS 可以隐式转换的。
注意事项 2 UNION 关键字组合的 SQL 如果字段的名称不同,比如第一条 SQL 返回
SELECT prod_name
第二条 SQL 返回SELECT productname
,则查询结果返回的名字为第一条 SQL 的字段名。
UNION ALL 组合查询
在上文实践 UNION 时,我们发现 UNION 会对查询结果进行去重,重复的行会被自动取消。如果想返回所有的行时,可以使用 UNION ALL。
SELECT
cust_name,
cust_contact,
cust_email
FROM
Customers
WHERE
cust_state IN ( 'IL', 'IN', 'MI' ) UNION ALL
SELECT
cust_name,
cust_contact,
cust_email
FROM
Customers
WHERE
cust_name = 'Fun4All';
使用 UNION ALL
组合查询的运行结果:

使用 UNION ALL
DBMS 不会取消重复的行,因此这里返回 5 条记录。
对组合查询结果排序
SELECT 语句的输出用 ORDER BY 子句进行排序。不过,在用 UNION 组合查询时,只能使用一条 ORDER BY 子句,它必须位于最后一条 SELECT 语句之后。
下面的 SQL 对上文 UNION 返回的结果进行排序:
SELECT
cust_name,
cust_contact,
cust_email
FROM
Customers
WHERE
cust_state IN ( 'IL', 'IN', 'MI' ) UNION
SELECT
cust_name,
cust_contact,
cust_email
FROM
Customers
WHERE
cust_name = 'Fun4All'
ORDER BY
cust_name;
排序检索结果:

注意事项 1 对于
UNION
结果集,不存在用一种方式排序一部分,用另一种方式排序另一部分的情况,因此不允许使用多条ORDER BY
子句。
注意事项 2 UNION 关键字组合的 SQL 如果字段的名称不同,如果想要排序,排序依据的字段名必须是第一条 SQL 语句中的字段名或其别名。
总结
本节我们学习了如何使用 UNION 来组合SELECT 语句,利用 UNION 可以将多条 SELECT 语句查询的结果作为一条组合查询返回,并且自动去除结果集中重复的行。
使用 UNION
可以极大地简化复杂的 WHERE
子句,此外,UNION 在组合多个工作表时也很有用,即使是有不匹配列名的表,在这种情况下,可以将 UNION 与别名组合,检索出一个结果集。
网友评论