读书笔记《MySQL必知必会》之第十七章组合查询

2018-11-25  本文已影响0人  359afe052eac

什么是组合查询

把多个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 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子句,简化从多个表中检索数据的工作。

上一篇 下一篇

猜你喜欢

热点阅读