oracle学习笔记七——查询之集合运算

七.集合运算

可以根据下图图示并文字理解集合运算
oracle学习笔记七——查询之集合运算_第1张图片
集合运算示意图

(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;

-->结果:
oracle学习笔记七——查询之集合运算_第2张图片
法3.集合运算的方式

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学习笔记七——查询之集合运算_第3张图片
使用并集实现group by语句的增强功能

补: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;

-->结果:
交集(INTERSECT)示例

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;

-->结果:
差集(MINUS)示例

注:集合运算需要注意的问题:
  1.参与运算的各个集合必须列数相同,且类型一致
  2.采用第一个集合的表头作为最后的表头
  3.如果使用order by排序,必须在每个集合后使用相同的order by(不能只有一个使用)
  4.可以使用括号改变集合执行的顺序

你可能感兴趣的:(oracle学习笔记七——查询之集合运算)