Oracle入门基础(七)一一集合运算

SQL> /*
SQL> 查询10和20号部门的员工
SQL> 1. select * from emp where deptno=10 or deptno=20;
SQL> 2. select * from emp where deptno in (10,20);
SQL> 3. 集合运算
SQL>     select * from emp where deptno=10
SQL>       加上
SQL>     select * from emp where deptno=20
SQL> */
SQL> select * from emp where deptno=10
  2  union
  3  select * from emp where deptno=20;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              
      7369 SMITH      CLERK           7902 17-12月-80            800                    20                                                                                                                                                                                                                     
      7934 MILLER     CLERK           7782 23-1月 -82           1300                    10                                                                                                              

SQL>  select deptno,job,sum(sal) from emp group by rollup(deptno,job);
 助解:group by rollup(a,b)
			这条语句相当于分组三次
			第一次,a,b两个约束条件,即a相同,b也相同的分为同一组
			第二次,只是用a一个条件进行分组,把上一次形成的结果在进行分组,把a相同的分   为一组
			第三次,没有约束条件,将整个表数据分为一组
			这样三次之后,我们就有了三个分组条件,那么sum函数,就会给每一个分组都执行一次计算总和
    DEPTNO JOB         SUM(SAL)                                                                                                                                                                         
---------- --------- ----------                                                                                                                                                                         
        10     CLERK           1300                                                                                                                                                                                                                                                                                                                                      
        10     MANAGER            8750                                                                                                                                                                         
        20     CLERK           1900                                                                                                                                                                                                                                                                                                                           
        20     MANAGER          10875                                                                                                                                                                         
        30     CLERK            950                                                                                                                                                                         
        30     MANAGER         2850                                                                                                                                                                         
     

SQL>  select deptno,job,sum(sal) from emp group by deptno,job
  2   union
  3   select deptno,sum(sal) from emp group by deptno
  4   union
  5   select sum(sal) from emp;
 select deptno,sum(sal) from emp group by deptno
 *
第 3 行出现错误: 
ORA-01789: 查询块具有不正确的结果列数 

SQL> 注意的问题:
SQL> 1、参与运算的各个集合必须列数相同 且类型一致
SQL> 2、采用第一个集合作为最后的表头
SQL> 3、order by永远在最后
SQL> 4、括号


SQL> --break on deptno skip 2
助解:break on deptno skip 2; 
           break on deptno 表示相同的部门号只显示一次, skip 2 每个部门之间,相隔两个空行

SQL> --SQL 执行的时间
SQL> 
SQL> set timing on
SQL>  select deptno,job,sum(sal) from emp group by rollup(deptno,job);
已用时间:  00: 00: 00.01
SQL>  select deptno,job,sum(sal) from emp group by deptno,job
  2   union
  3   select deptno,to_char(null),sum(sal) from emp group by deptno
  4   union
  5   select to_number(null),to_char(null),sum(sal) from emp;
已用时间:  00: 00: 00.03
SQL> --SQL优化 4、 尽量不要使用集合运算
SQL> set timing off
SQL> spool off
原文地址:https://www.cnblogs.com/Aaron-007/p/12814624.html