什么是组合查询
把多个select语句的结果作为单个查询的结果集返回,就称为并(union)或复合查询(compound query)
有两种情况需要使用组合查询
- 在单个查询中从不同的表返回类似结构的数据
- 对单个表执行多个查询, 按单个查询返回结果
任何具有多个where子句的select语句,都可以作为一个组合查询给出.
创建组合查询
使用union
需要查询价格小于等于5的所有物品的一个列表,而且还想包括供应商1001和1002生产的所有物品(不考虑价格)。
如果是用两条where查询 那么语句如下
SELECT vend_id,prod_id,prod_price from products WHERE prod_price<=5;
SELECT vend_id,prod_id,prod_price from products WHERE vend_id in (1001,1002);
第一条select语句的结果如下,为4条记录
第二条select语句的结果如下, 为5条记录
使用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);
运行的结果如下图, 为8条记录. 去除掉了重复的一条记录
如果是使用一条select语句的where查询,那么语句如下
SELECT vend_id,prod_id,prod_price from products WHERE prod_price<=5 or vend_id in (1001,1002);
其运行的结果如下, 也是八条数据
使用union的规则
- UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔(因此,如果组合4条SELECT语句,将要使用3个UNION关键字)。
- UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)。
- 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如,不同的数值类型或不同的日期类型)。
union all的使用
在上面使用union的过程中,自动去除了重复的数据. 那么如果需要把重复的数据也显示出来, 就需要用到union all了.
sql语句如下
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);
结果如下为9条数据. 画圈的为重复的两条数据
由此可以得知, union all 与union的区别就在于 union all不会去除掉相同的数据, 而union就会去除相同的数据.
而且使用where和union的效果相同, 也会去除相同的数据
组合查询的结果的排序
在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。
对于结果集,不存在用一种方式排序一部分,而又用另一种方式排序另一部分的情况,因此不允许使用多条ORDER BY子句。
组合查询的sql语句的示例
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 vend_id,prod_price;
运行的结果如下
UNION在最后一条SELECT语句后使用了ORDER BY子句。虽然ORDER BY子句似乎只是最后一条SELECT语句的组成部分,但实际上MySQL将用它来排序所有SELECT语句返回的所有结果。
总结
利用UNION,可把多条查询的结果作为一条组合查询返回. 使用UNION可极大地简化复杂的WHERE子句,简化从多个表中检索数据的工作。