1.问题:一条SQL的查询结果集不能得到想要的查询结果;
2.思路:将两条SQL的结果集进行拼接,从而得到想要的查询结果;
3.工具:使用Union 或 Union All;
4.前提:两条结果集需要求有相同的列名且个数一致;
5.Union 和 Union All 的区别:
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序; (去重且排序)
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;(不去重不排序)
可以在最后一个结果集中指定Order by子句改变排序方式。
举例:两张表格,一张员工表emp,一张部门表dept,将两张表格的部门编号,合并起来.
使用:Union All
select deptno from emp
union all
select did from dept;
// 1 2 2 3 3 3 4 5
得到8个结果.
使用计数查询验证:
select count(*) from select deptno from emp
union all
select did from dept rel;
// 8
确实是8个结果.
使用:Union
select deptno from emp
union
select did from dept;
// 1 2 3 4 5
得到5个结果,因为去重了.
6.Union All 和 Union效率对比:
Union All 和 Union 关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同.
对重复结果的处理:Union在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录.
对排序的处理:Union将会按照字段的顺序进行排序;Union All 只是简单的将两个结果合并后就返回.
从效率上说,Union All 要比Union快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用Union All.