SQL中 UNION 和 UNION ALL 操作符小结

1、UNION 和 UNION ALL 操作符用于合并两个或多个 SELECT 语句的结果集【适用场景】
2、UNION 和 UNION ALL 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型,即数据类型必须兼容。同时,每条 SELECT 语句中的列的顺序必须相同。
3、UNION 和 UNION ALL 结果集中的列名总是等于 UNION(ALL)中第一个 SELECT 语句中的列名
4、UNION 和 UNION ALL 这两者从使用和效率上来说都有所不同。如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用union all
   1)对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录
   2)对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回
   3)从效率上说: UNION ALL 要比 UNION 快很多
5、UNION 其实执行的实质逻辑应该是先将某一子结果集进行排序,然后再判断是否有重复的数据,若有则删除掉重复的数据

简单总结: UNION 对两个结果集进行并集操作,不包括重复行去重,同时进行默认规则的排序
          UNION ALL 对两个结果集进行并集操作,包括重复行,不进行排序; 

          由于Union需要对查询结果集进行排序操作,当数据量较大时,若非特殊需要,尽量不要使用Union操作,而改用Union All操作,
          然后对Union All出来的结果执行去重操作即可,这样会使得查询的效率大大的增强

注意:bolb类型,oracle union查询中BLOB字段出错问题(谢谢网友moon的补充)

前言

学习到此内容是因为做事上的要求而接触到的,早先是对单表进行操作,必要对某一字段下的值举办分组总结次数并排序,排序规则从次数逆序更改为钦点分组顺序。在阅读资料以及同事的指引下,精通了UNION和UNION
ALL的用法。此文不止会将工作上的供给已案例的花样提交,而且会将知识点扩展开来,以便本人加强记念,同样有益各位朋友参谋。

Union:对三个结果集实行并集操作,不包涵重复行,同时拓展暗中同意规则的排序;
Union All:对七个结实集进行并集操作,包涵重复行,不开始展览排序;

     select blobf from table1

工具

MySQL

4503.com,     union

案例

有一张学生选课表(部分音信)

4503.com 1

学生选课表

渴求如下:

  • 总括同一个人学员选了略微门科目,依据姓名(学生1,学生三,学生贰,学生5,学生四)的逐条排序;
    select blobf from table2

   出错:ora-00932:数据类型不一致

    因为:union会对字段类型进行比较(相等和不等判断),oracle不支持对大数据类型的比较操作。 

    解决办法:使用union all就可以了

UNION

率先看望 UNION 的用法

SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '学生1'
UNION
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '学生3'
UNION
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '学生2'
UNION
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '学生5'
UNION
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '学生4';

结果如图所示:

4503.com 2

依附特定组名排序

UNION ALL

SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '学生1'
UNION ALL
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '学生3'
UNION ALL
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '学生2'
UNION ALL
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '学生5'
UNION ALL
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '学生4';

结果如图所示:

4503.com 3

与上结果同样

有鉴于此,对于每条查询都钦赐条件的操作,UNION 和 UNION
ALL的职能是壹律的。