美文网首页
读书笔记《MySQL必知必会》之第十七章组合查询

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

作者: 359afe052eac | 来源:发表于2018-11-25 19:11 被阅读0次

    什么是组合查询

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

    相关文章

      网友评论

          本文标题:读书笔记《MySQL必知必会》之第十七章组合查询

          本文链接:https://www.haomeiwen.com/subject/ecupqqtx.html