目录
并集
union
union all
区别
交集
intersect
差集
minus
错误操作
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
常用的数学集合有:交集、并集、差集、补集
每一次查询实际上都会返回数据集合,所以返回的结果可以使用 union、union all、minus、intsect实现集合操作,此时的语法为以下形式,即把若干个查询操作结果融合实现集合
select [distinct] * | 列 [ 别名 ] , 列 [ 别名 ] ...
from 表名称 [ 别名 ], 表名称 [ 别名 ],...
[where 限定条件 (s)]
[order by 排序字段 [asc | desc], 排序字段 [asc | desc],...]
union | union all | intersect | minus
select [distinct] * | 列 [ 别名 ] , 列 [ 别名 ] ...
from 表名称 [ 别名 ], 表名称 [ 别名 ],...
[where 限定条件 (s)]
[order by 排序字段 [asc | desc], 排序字段 [asc | desc],...]
并集
union
SQL> select * from emp
2 union
3 select * from emp where deptno=10;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
8989 HELLO
此时的查询结果已经连接在一起了,但是union的处理过程是取消重复元素。因为在这个查询中,查询语句“select * from emp where deptno=10 ”的查询结果全部包含在查询语句“select * from emp”的查询结果中,所以还是显示“select * from emp”的查询结果
union all
SQL> select * from emp
2 union all
3 select * from emp where deptno=10;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
8989 HELLO
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7934 MILLER CLERK 7782 23-1月 -82 1300 10
可以发现,这个查询语句的运行结果和union的运行结果不一样,union all将两个查询结果合并到一起,而 union的运行结果会把重复的结果取消
区别
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
交集
intersect
SQL> select * from emp
2 intersect
3 select * from emp where deptno=10;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7934 MILLER CLERK 7782 23-1月 -82 1300 10
我们可以看出,运行结果是两个查询共有的结果,也就是两个集合的交集
差集
minus
SQL> select * from emp
2 minus
3 select * from emp where deptno=10;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
8989 HELLO
可以看出这次的查询结果返回的是查询语句“select * from emp”有而查询语句“select * from emp where deptno=10”没有的结果,即二者之间的差集
在使用集合操作时有一件非常重要的注意事项,由于集合的操作最终需要将若干个查询结果合并为 一个查询,所以要求这若干个查询结果所返回的数据结构必须相同
错误操作
select ename,job from emp where deptno=10;
intersect
select empno,sal from emp;
此时执行必定出现问题,大家可以自行试试
这个错误的出现是因为两个查询结果所返回的数据结构不相同