本文主要介绍如何利用
UNION
操作符将多条SELECT
语句组合成一个结果集。
I、组合查询基础
1、MySQL也允许执行多个查询(多条SELECT
语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或组合查询。
2、通常情况下,组合相同表的两个查询完成的工作与具有多个WHERE
子句条件的单条查询完成的工作相同。
II、创建组合查询
1、使用UNION
来创建组合查询。
2.1 使用UNION
UNION
的使用非常简单,我们通过一个实例来说明:
我们要组合下面两个SELECT
语句:
# SELECT 1
> SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5;
# SELECT 2
> SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001, 1002);
# UNION
> SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001, 1002);
2、如果所用UNION
的列出现不同,则会报错:The used SELECT statements have a different number of columns
。
3、可以看出UNION
关键字的作用就是并,其相当于:
# SELECT OR
> SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
OR vend_id IN (1001, 1002);
2.2 UNION使用规则
1、UNION
必须由两条或两条以上的SELECT
语句组成,语句之间,用关键字UNION
分割;
2、每个查询中必须包含相同的列、表达式或聚集函数,不过各个列不需要以相同的次序列出。
3、列数据类型必须兼容:不必完全相同,但必须是DBMS可以隐含地转换的类型。
2.3 包含或取消重复的行
1、UNION
的查询结果是并,即完成了一个去重操作,而UNION ALL
则会输出重复查询结果。
# UNION ALL
> SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION ALL
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001, 1002);
对比与之前UNION
的输出结果,这里UNION ALL
会将1002 FU1 3.42
一行重复输出。
2.4 查询结果排序
1、同样使用ORDER BY
对查询结果进行排序,但需要注意的是UNION
组合查询中只能使用一个ORDER BY
子句,其作用域整体的查询结果。
# UNION ORDER BY
> SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001, 1002)
ORDER BY prod_price;
【参考】
[1] 《MySQL必知必会》