七.集合运算
可以根据下图图示并文字理解集合运算
(1)union/union all 并集
--union,两张表都有的数据只取一次
--union all,两张表都有的数据,各取一次
--当两张表没有公共部分时,union和union all一样
(2)交集 intersect:A、B两张表都有的记录
(3)差集 minus:只有A表有,而B表没有的记录
1.查询10号和20号部门的员工信息(3种方法)
- 法1. select * from emp where deptno=10 or deptno=20;
- 法2. select * from emp where deptno in (10,20);
- 法3. 集合运算 select * from emp where deptno=10
加上
select * from emp where deptno=20
SQL> select * from emp where deptno=10
union
select * from emp where deptno=20;
-->结果:2.使用并集实现group by语句的增强
--概念
group by rollup(a,b)
=
group by a,b
union
group by a
union
group by null
--实例
select deptno, job, sum(sal)
from emp
group by rollup(deptno, job);
=
--只是像下面这样简单的并起来是错误的
select deptno, job, sum(sal) from emp group by deptno, job
union
select deptno,sum(sal) from emp group by deptno
union
select sum(sal) from emp;
--需要补数据
select deptno, job, sum(sal) from emp group by deptno, job
union
select deptno, to_char(null), sum(sal) from emp group by deptno
union
select to_number(null), to_char(null), sum(sal) from emp;
-->结果:补:oracle中的sql语句优化
5.尽量不要使用集合运算,也就是说rollup要比union要好,想一下,集合运算要操作多次数据库--关于sql优化的评判,主要就是执行时间,这里补充两条sqlplus命令
--打开执行时间
set timing on
--关闭执行时间
set timing off
补:sqlplus命令
(1)可以通过sqlplus命令调整命令行的显示格式:
SQL> break on deptno skip 2
(2)取消用:
SQL> break on null
3.交集举例
SQL> select ename,sal from emp
where sal between 700 and 1300
INTERSECT
select ename,sal from emp
where sal between 1201 and 1400;
-->结果:4.差集举例
SQL> select ename,sal from emp
where sal between 700 and 1300
MINUS
select ename,sal from emp
where sal between 1201 and 1400;
-->结果:注:集合运算需要注意的问题:
1.参与运算的各个集合必须列数相同,且类型一致
2.采用第一个集合的表头作为最后的表头
3.如果使用order by排序,必须在每个集合后使用相同的order by(不能只有一个使用)
4.可以使用括号改变集合执行的顺序