数据集合

目录

并集

union

union all

区别

交集 

intersect

差集

minus

错误操作


Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645

常用的数学集合有:交集并集差集补集

每一次查询实际上都会返回数据集合,所以返回的结果可以使用 unionunion allminusintsect实现集合操作,此时的语法为以下形式,即把若干个查询操作结果融合实现集合

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 emp2  union3  select * from emp where deptno=10;EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------7369 SMITH                CLERK                    7902 17-12月-80            800                    207499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300         307521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500         307566 JONES                MANAGER                  7839 02-4月 -81           2975                    207654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400         307698 BLAKE                MANAGER                  7839 01-5月 -81           2850                    307782 CLARK                MANAGER                  7839 09-6月 -81           2450                    107839 KING                 PRESIDENT                     17-11月-81           5000                    107844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0         307900 JAMES                CLERK                    7698 03-12月-81            950                    307902 FORD                 ANALYST                  7566 03-12月-81           3000                    207934 MILLER               CLERK                    7782 23-1月 -82           1300                    108989 HELLO

此时的查询结果已经连接在一起了,但是union的处理过程是取消重复元素。因为在这个查询中,查询语句“select * from emp where deptno=10 ”的查询结果全部包含在查询语句“select * from emp”的查询结果中,所以还是显示“select * from emp”的查询结果

union all

SQL> select * from emp2  union all3  select * from emp where deptno=10;EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------7369 SMITH                CLERK                    7902 17-12月-80            800                    207499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300         307521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500         307566 JONES                MANAGER                  7839 02-4月 -81           2975                    207654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400         307698 BLAKE                MANAGER                  7839 01-5月 -81           2850                    307782 CLARK                MANAGER                  7839 09-6月 -81           2450                    107839 KING                 PRESIDENT                     17-11月-81           5000                    107844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0         307900 JAMES                CLERK                    7698 03-12月-81            950                    307902 FORD                 ANALYST                  7566 03-12月-81           3000                    207934 MILLER               CLERK                    7782 23-1月 -82           1300                    108989 HELLO7782 CLARK                MANAGER                  7839 09-6月 -81           2450                    107839 KING                 PRESIDENT                     17-11月-81           5000                    107934 MILLER               CLERK                    7782 23-1月 -82           1300                    10

可以发现,这个查询语句的运行结果和union的运行结果不一样union all将两个查询结果合并到一起,而 union的运行结果会把重复的结果取消

区别

Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

交集 

intersect

SQL> select * from emp2  intersect3  select * from emp where deptno=10;EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------7782 CLARK                MANAGER                  7839 09-6月 -81           2450                    107839 KING                 PRESIDENT                     17-11月-81           5000                    107934 MILLER               CLERK                    7782 23-1月 -82           1300                    10

我们可以看出,运行结果是两个查询共有的结果,也就是两个集合的交集

差集

minus

SQL> select * from emp2  minus3  select * from emp where deptno=10;EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------7369 SMITH                CLERK                    7902 17-12月-80            800                    207499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300         307521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500         307566 JONES                MANAGER                  7839 02-4月 -81           2975                    207654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400         307698 BLAKE                MANAGER                  7839 01-5月 -81           2850                    307844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0         307900 JAMES                CLERK                    7698 03-12月-81            950                    307902 FORD                 ANALYST                  7566 03-12月-81           3000                    208989 HELLO

可以看出这次的查询结果返回的是查询语句“select * from emp”有而查询语句“select * from emp where deptno=10”没有的结果,即二者之间的差集

在使用集合操作时有一件非常重要的注意事项,由于集合的操作最终需要将若干个查询结果合并为 一个查询,所以要求这若干个查询结果所返回的数据结构必须相同

错误操作

select ename,job from emp where deptno=10;intersect
select empno,sal from emp;

此时执行必定出现问题,大家可以自行试试

这个错误的出现是因为两个查询结果所返回的数据结构不相同