在Oracle中,可供使用的集合运算有:
- 联合运算:从两个查询返回的结果集去掉重复值后合并后的结果,使用UNION操作符。
- 全联合运算:与联合运算相似,返回两个查询结果的并集,但是包括所有重复值。使用UNION ALL操作符。
- 相交运算:返回多个查询结果中的相同的行,使用INTERSECT操作符 。
- 相减运算:返回在第一个查询中存在而第二个查询中不存在的行,使用MINUS操作符。
联合与全联合运算
联合与全联合用于合并两个表中的数据,二者的区别在于联合不包含重复值。
如:
SELECT empno, ename, sal, hiredate, deptno
FROM emp
WHERE deptno = 20
UNION
SELECT empno, ename, sal, hiredate, deptno
FROM emp_history
WHERE deptno = 20;
SELECT empno, ename, sal, hiredate, deptno
FROM emp
WHERE deptno = 20
UNION ALL
SELECT empno, ename, sal, hiredate, deptno
FROM emp_history
WHERE deptno = 20;
使用联合运算UNION具有如下一些原则:
- 被选择的列数和列数据类型必须与所有用在查询中的SELECT语句一致。列名可以不相同。
- 联合运算在做重复检查的时候不忽略NULL值。
- 默认情况下,输出以SELECT子句的第一列的升序排序。
- IN运算有比UNION运算高的优先级。
- 联合运算在所有被选择的列上进行。
UNION ALL与UNION类似,只是UNION ALL不消除重复行,并且默认情况下不输出排序,不能使用DISTINCT关键字。
相交运算
INTERSECT返回多个查询中的相同的行,使用原则如下:
- 在查询中被SELECT语句选择的列数和数据类型必须与在查询中使用的所有的SELECT语句中的一样,但列名可以不同。
- 相交的表的倒序排序不改变结果。
- 相交不忽略NULL值。
如:
SELECT empno, ename, sal, hiredate, deptno
FROM emp
WHERE deptno = 20
INTERSECT
SELECT empno, ename, sal, hiredate, deptno
FROM emp_history
WHERE deptno = 20;
相减运算
使用原则和INTERSECT完全相同。
如:
SELECT empno, ename, sal, hiredate, deptno
FROM emp
WHERE deptno = 20
MINUS
SELECT empno, ename, sal, hiredate, deptno
FROM emp_history
WHERE deptno = 20;
可以在一个查询中使用多个集合运算符。在使用ORDER BY时,ORDER BY只能出现在语句的最后,并且排序的列名是从第一个SELECT语句接受列名、别名或位置记号里选。