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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33229669/article/details/84501160

什么是组合查询

把多个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语句的示例

扫描二维码关注公众号,回复: 4320672 查看本文章
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子句,简化从多个表中检索数据的工作。

猜你喜欢

转载自blog.csdn.net/qq_33229669/article/details/84501160