一.定义
集合操作:将不同的数据集合按照一定的规则拼接到一起,组成一个新的、临时的数据集合
操作分类:并集 交集 差集
关键字: UNION/UNION ALL INTERSECT MINUS
使用:
SELECT 语句
集合关键字
SELECT 语句;
二.并集
1.概述
将不同的数据集合按照并集的规则合并到一个数据集合中
2.关键字
UNION / UNION ALL
示例:
1.求工资大于1500 的员工信息与工资小于3000的员工信息的并集
–UNION
SELECT * FROM EMP WHERE SAL>1500
UNION
SELECT * FROM EMP WHERE SAL<3000;
--UNION ALL
SELECT * FROM EMP WHERE SAL>1500
UNION ALL
SELECT * FROM EMP WHERE SAL<3000;
2.若表中含有重复数据,如何去除重复的数据??
3.数据会不会排序
–UNION
SELECT DEPTNO,SAL FROM EMP WHERE SAL>1500
UNION
SELECT DEPTNO,SAL FROM EMP WHERE SAL<3000;
--UNION ALL
SELECT SAL FROM EMP WHERE SAL>1500
UNION ALL
SELECT SAL FROM EMP WHERE SAL<3000;
注意:
1).UNION对于集合中的数据会去重,UNION all不会将重复的数据去除
2).UNION会将数据集合中数据按照第一个列升序排列,UNION ALL不会排序
3.并集编写时的注意点
1).前后数据集合的列的个数和数据类型应一致
2).UNION 会按照第一个列升序排列
3).最终的数据结果显示以第一个数据集合中的列的名称显示
示例:
1.求工资大于1500 的员工信息与工资小于3000的员工信息的并集
–报错 列的个数不一致
SELECT EMPNO,ENAME FROM EMP WHERE SAL>1500
UNION
SELECT EMPNO,ENAME,JOB FROM EMP WHERE SAL<3000;
--报错 前后数据集合的数据类型不一致
SELECT EMPNO,ENAME FROM EMP WHERE SAL>1500
UNION
SELECT EMPNO,SAL FROM EMP WHERE SAL<3000;
--字段名以第一个数据集合的字段名显示
SELECT SAL,ENAME FROM EMP WHERE SAL>1500
UNION
SELECT EMPNO,JOB FROM EMP WHERE SAL<3000;
三.交集
1.概述
将不同的数据集合按照交集的规则合并到一个数据集合中
2.关键字
INTERSECT
示例:
1.交集示例
SELECT * FROM EMP WHERE SAL=800 OR SAL=1600
INTERSECT
SELECT * FROM EMP WHERE SAL=1600 OR SAL=3000;
2.数据类型
–报错 数据类型不一致
SELECT EMPNO,SAL FROM EMP WHERE SAL=800 OR SAL=1600
INTERSECT
SELECT EMPNO,JOB FROM EMP WHERE SAL=1600 OR SAL=3000;
--结果中列的顺序以第一个数据集合的顺序为准
SELECT EMPNO,SAL FROM EMP WHERE SAL=800 OR SAL=1600
INTERSECT
SELECT EMPNO,DEPTNO FROM EMP WHERE SAL=1600 OR SAL=3000;
3.列的个数
–列的个数不一致
SELECT EMPNO,SAL FROM EMP WHERE SAL=800 OR SAL=1600
INTERSECT
SELECT EMPNO,SAL,DEPTNO FROM EMP WHERE SAL=1600 OR SAL=3000;
4.排序
–按照集合中的第一个列升序排列
SELECT EMPNO,SAL FROM EMP WHERE SAL>1500
INTERSECT
SELECT EMPNO,SAL FROM EMP WHERE SAL<3000;
SELECT SAL,EMPNO FROM EMP WHERE SAL>1500
INTERSECT
SELECT SAL,EMPNO FROM EMP WHERE SAL<3000;
四.差集
1.概述
将不同的数据集合按照差集的规则合并到一个数据集合中
2.关键字
MINUS
示例:
1.差集示例
–前后集合的顺序不同,集合的结果集也不同
SELECT * FROM EMP WHERE SAL=800 OR SAL=1600
MINUS
SELECT * FROM EMP WHERE SAL=1600 OR SAL=3000;
SELECT * FROM EMP WHERE SAL=3000 OR SAL=1600
MINUS
SELECT * FROM EMP WHERE SAL=1600 OR SAL=800;
2.数据类型
–报错 数据类型不一致
SELECT EMPNO,SAL FROM EMP WHERE SAL=800 OR SAL=1600
MINUS
SELECT EMPNO,JOB FROM EMP WHERE SAL=1600 OR SAL=3000;
--结果中列的顺序以第一个数据集合的顺序为准
SELECT EMPNO,SAL FROM EMP WHERE SAL=800 OR SAL=1600
MINUS
SELECT EMPNO,DEPTNO FROM EMP WHERE SAL=1600 OR SAL=3000;
3.列的个数
–列的个数不一致
SELECT EMPNO,SAL FROM EMP WHERE SAL=800 OR SAL=1600
MINUS
SELECT EMPNO,SAL,DEPTNO FROM EMP WHERE SAL=1600 OR SAL=3000;
4.排序
–按照集合中的第一个列升序排列
SELECT EMPNO,SAL FROM EMP WHERE SAL>1500
MINUS
SELECT EMPNO,SAL FROM EMP WHERE SAL<2000;
SELECT SAL,EMPNO FROM EMP WHERE SAL>1500
MINUS
SELECT SAL,EMPNO FROM EMP WHERE SAL<2000;
五.小结
1.掌握集合的各个关键字及其用法
2.注意:集合的列的个数,数据类型要一致
3.UNION/INTERSECT/MINUS均按照第一列升序排列,UNION ALL不排序
4.UNION去重且排序,UNION ALL不去重,不排序
5.MINUS操作和集合的前后顺序关联,并集,交集和集合前后顺序无关
6.MINUS往往用于查询一个表中存在一个表中不存在的情况
–例如查询没有员工的部门的部门编号
SELECT DEPTNO FROM DEPT
MINUS
SELECT DEPTNO FROM EMP;
7.并集UNION往往用于行转列、列转行中
六.练习题
1.数据去重的方式
2.有表score_63,将其转换为SCORE_63_BAK的内容
–在转换回去
–查询当前用户下的表名
SELECT TABLE_NAME FROM USER_TABLES;
SELECT * FROM SCORE_63;
SELECT * FROM SCORE_63_BAK;