今天简单介绍一下union 和union all 的不同用法,仅供参考:
先说一下 UNION 和 UNION ALL 共同的使用规范:
(1) 内部的每个 SELECT 语句必须拥有相同数量的列;
(2) 同一列也必须拥有相似的数据类型;
(3) 每个 SELECT 语句中的列的顺序必须相同;
另外:结果集中的列名总是等于 UNION 或者 UNION ALL 中第一个 SELECT 语句中的列名。
然后,我们再来对比看一下不同情况下使用 UNION 或者 UNION ALL 查询出来的效果:
union:
1. 每一行的数据不完全相同
select '张三' as 姓名, '男' as 性别, 18 as 年龄, '五道口职业技术学院' as 学校 from dual
union
select '张三' as 姓名, '男' as 性别, 20 as 年龄, '五道口职业技术学院' as 学校 from dual
union
select '李四' as 姓名, '女' as 性别, 19 as 年龄, '五道口职业技术学院' as 学校 from dual
union
select '王五' as 姓名, '男' as 性别, 21 as 年龄, '五道口职业技术学院' as 学校 from dual
查询结果如下:
2.存在两行一模一样的数据:
select '张三' as 姓名, '男' as 性别, 18 as 年龄, '五道口职业技术学院' as 学校 from dual
union
select '张三' as 姓名, '男' as 性别, 18 as 年龄, '五道口职业技术学院' as 学校 from dual
union
select '李四' as 姓名, '女' as 性别, 19 as 年龄, '五道口职业技术学院' as 学校 from dual
union
select '王五' as 姓名, '男' as 性别, 21 as 年龄, '五道口职业技术学院' as 学校 from dual
查询结果:
对比上面两个SQL和查询结果可知:
使用union进行连接的时候,会去除重复的数据,只保留一行
union all:
1.每一行的数据不完全相同
select '张三' as 姓名, '男' as 性别, 18 as 年龄, '五道口职业技术学院' as 学校 from dual
union all
select '张三' as 姓名, '男' as 性别, 20 as 年龄, '五道口职业技术学院' as 学校 from dual
union all
select '李四' as 姓名, '女' as 性别, 19 as 年龄, '五道口职业技术学院' as 学校 from dual
union all
select '王五' as 姓名, '男' as 性别, 21 as 年龄, '五道口职业技术学院' as 学校 from dual
查询结果:
此时,与使用 "union" 的第一种情况相比,并没有什么不一样的,在这种情况下,"union" 和 "union all" 的效果是一样的
2.存在两行一模一样的数据:
select '张三' as 姓名, '男' as 性别, 18 as 年龄, '五道口职业技术学院' as 学校 from dual
union all
select '张三' as 姓名, '男' as 性别, 18 as 年龄, '五道口职业技术学院' as 学校 from dual
union all
select '李四' as 姓名, '女' as 性别, 19 as 年龄, '五道口职业技术学院' as 学校 from dual
union all
select '王五' as 姓名, '男' as 性别, 21 as 年龄, '五道口职业技术学院' as 学校 from dual
查询结果:
此时,对比 "union all" 自身的第一种情况,可以看到查询结果并没有发生什么改变,即使有重复数据,也会保留下来;但是,对比 "union" 的第二种情况,可以看出明显的区别:"union all" 会保留重复数据