浅析unionunionalldistinct的区别和⽤途、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,这样就不会进⾏排序。sql中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:对两个结果集进⾏并集操作,包括重复⾏,不进⾏排序。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。