如果两个select语句的结果必须作为一个整体显示,则必须使用union或union all关键字。 union (或称为联合)的作用是将多个结果一起显示。
union和union all的区别在于,union会自动压缩多个结果集合中重复的结果,union all会显示所有结果,无论是否存在重复。
并行union两个结果集,同时对缺省规则进行排序,不包含重复行; union通过表链接过滤重复的记录,因此在表链接后对结果集进行排序,然后删除重复的记录并返回结果。 在实际的大多数APP应用中是不重复的记录,最一般的是工艺表和历史表union。 union all对两个结果集执行并行处理。 包含重复行,不进行排序。 如果返回的两个结果集包含重复数据,则返回的结果集包含重复数据。
Intersect交叉两个结果集的操作。 不包含重复的行,也进行默认规则的排序。
对Minus两个结果集执行不含重复行的差分操作,同时对缺省规则进行排序。
可以通过在最后一个结果集中指定Order by子句来更改排序方法。
例如:
select employee_id,job_id from employees
union
select employee_id,job_id from job_history
将以上两个表的结果合并在一起。 这两个示例压缩两个select语句结果的重复值。 也就是说,结果数据不是两个结果数量之和。 要允许union all在显示重复结果时仍可用,请执行以下操作:
oracle的scott用户具有表emp
select * from emp where deptno=20
全部合并
select * from emp where deptno=30
这里的结果有很多重复值。
关于union和union all关键字需要注意的问题如下。
union和union all不仅可以连接两个结果集,还可以连接多个结果集。
要使用union和union all,必须确保每个选择集合的结果中有相同数量的列,并且每列类型相同。 但是,列名称不必相同。 oracle使用第一个结果的列名作为结果集的列名。
例如,以下是一些例子。
select empno,ename from emp
union
select deptno,dname from dept
不必在每个select结果集中使用order by子句进行排序。 最后,可以使用order by对整个结果进行排序。 例如:
select empno,ename from emp
union
select deptno,dname from dept
order by ename;