zoukankan      html  css  js  c++  java
  • 浅析union/union all/distinct的区别和用途、distinct如何进行排序优化

    一、union、union all 、distinct 的区别和用途

    1、从用途上讲:它们都具有去重的效果

    2、从效率上讲:distinct 通常不建议使用,效率较低。union all 和 union 而言,union all 效率更高。

      原因是:union 相当于多表查询出的数据,进行去重,然后再进行排序后返回,而 union all 是多表查询合并后就直接返回

    3、从单表还是多表上讲:单表上有重复记录只能使用distinct,多表查询建议用 union all

    二、distinct 排序优化(避免排序)- union all 代替 union、exists 代替 distinct

      大家都知道数据库有些命令会对结果进行排序,当数据量较大时,排序会非常耗时。

    1、会进行排序的SQL 命令 - 下面列举会排序的代表性运算:

    GROUP BY 子句

    ORDER BY 子句

    聚合函数(SUM,COUNT,AVG,MAX,MIN)

    DISTINCT

    集合运算(UNICON,INTERSECT,EXCEPT)

    窗口函数(RANK,ROW_NUMBER等)

    2、实例一:尽可能使用 union all 代替 union

    SELECT * FROM TABLE_A UNION ALL SELECT * FROM TABLE_B;

      如果不在乎结果中存在重复数据,或预先知道结果中不会有重复数据。请使用 union all 代替 union,这样就不会进行排序。

    3、实例二:尽可能使用 exists 代替 distinct

      示例数据说明,下面有商品表 Items 和销售记录表 SalesHistory。

      需求:查找有销售记录的商品。

      可以使用 in 方式实现,但因为 in 会产生子查询,不如使用连接查询效率高。

    SELECT DISTINCT I.item_no FROM Items I 
    INNER JOIN SalesHistory S ON I.item_no = S.item_no;

      因为是一对多查询,会产生重复记录,所有使用DISTINCT过滤重复记录。但更好的做法是使用exists方式:

    SELECT DISTINCT I.item_no FROM Items I 
    WHERE EXISTS ( SELECT * FROM SalesHistory S WHERE I.item_no = S.item_no);

      说明:因为使用 exists 查询时不会进行排序,而且使用 exists 和使用连接效率一样高。

    三、union distinct - 当面试官问你UNION 和UNION ALL之间的区别时该怎么答

      MySQL数据库支持两种集合操作:UNION DISTINCT和UNION ALL。

      UNION DISTINCT组合两个输入,并应用DISTINCT过滤重复项,一般可以直接省略DISTINCT关键字,直接使用UNION。

      在多个SELECT语句中,对应的列应该具有相同的字段属性,且第一个SELECT语句中被使用的字段名称也被用于结果的字段名称。

    1、union distinct:其实 union 相当于 union distinct,个人觉得写全比较好,不要偷懒。

      当A查询中有数据a,B查询中有数据a,对两个查询使用union distinct方法,那么查询结果只有一条数据a记录。

    2、union all:当A查询中有数据a,B查询中有数据a,对两个查询使用 union all 方法,那么查询结果会出现两条数据a。

    3、说明:

    (1)当A查询中有数据a,B查询中有数据a,不管对两个查询使用union all/distinct方法,查询结果的字段展示是根据union all/distinct前的查询结果字段展示的。

    -- 例如前面union all,查询语句为:
    (SELECT * from name2 where agend2 = '1') 
    UNION ALL 
    (select * from name where name = 'ck1' AND agend = '1');
    
    -- 那么展示的字段是 name2 表中的字段。

    (2)在使用UNION DISTINCT的时候,由于向临时表中添加了唯一索引,插入的速度显然会因此而受到影响。如果确认进行UNION操作的两个集合中没有重复的选项,最有效的办法应该是使用UNION ALL。

    (3)union 会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。

      Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序。

      Union 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。

      Union All:对两个结果集进行并集操作,包括重复行,不进行排序。

  • 相关阅读:
    构建简单的二叉树(C)
    C指針淺析(3)
    C語言函數
    C# 細節(2)
    如何做好软件架构设计
    C# 細節(1)
    .NET Framework格式化字符串
    Windows下通过删除硬盘分区直接强行移除Fedora后恢复Windows启动项的方法
    DreamWeaver使用技巧学习心得
    MyEclipse使用心得、快捷键、设置
  • 原文地址:https://www.cnblogs.com/goloving/p/15224556.html
Copyright © 2011-2022 走看看