Oracle学习(七):集合运算
1.知识点:能够对比以下的录屏进行阅读
SQL> -- 查询10和20号部门的员工的3种方法 SQL> --1. select * from emp where deptno in (10,20); SQL> --2. select * from emp where deptno=10 or deptno=20; SQL> --3. 集合运算:union/union all并集。intersect 交集;minus差集 SQL> -- select * from emp where deptno=10 SQL> -- + SQL> -- select * from emp where deptno=20; SQL> --union:并集,反复的区域仅仅取一次;union all:并集。反复的区域取两次 SQL> select * from emp where deptno=10 2 union 3 select * from emp where deptno=20; SQL> --利用集合运算实现group by的增强 SQL> --注意 SQL> --1. 參与运算的各个集合必须列数同样 且类型一致 SQL> --2. 採用第一个集合的表头作为最后的表头 SQL> --3. 假设排序。必须在每一个集合后使用同样的order by SQL> --4. 能够使用括号 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; SQL> --打开sql运行时间,每次运行sql语句都会显示运行时间 SQL> set timing on SQL> --关闭sql运行时间 SQL> set timing off SQL> --交集:既属于intersect前面的集合又属于intersect后面的集合 SQL> select ename,sal from emp 2 where sal between 700 and 1300 3 INTERSECT 4 select ename,sal from emp 5 where sal between 1201 and 1400; SQL> --差集:仅仅属于minus前面的集合而不属于minus后面的集合 SQL> select ename,sal from emp 2 where sal between 700 and 1300 3 minus 4 select ename,sal from emp 5 where sal between 1201 and 1400;2.在Sqlplus下实际运行的结果录屏
SQL> /* SQL> 查询10和20号部门的员工 SQL> 1. select * from emp where deptno in (10,20); SQL> 2. select * from emp where deptno=10 or deptno=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 7566 JONES MANAGER 7839 02-4月 -81 2975 20 7782 CLARK MANAGER 7839 09-6月 -81 2450 10 7788 SCOTT ANALYST 7566 13-7月 -87 3000 20 7839 KING PRESIDENT 17-11月-81 5000 10 7876 ADAMS CLERK 7788 13-7月 -87 1100 20 7902 FORD ANALYST 7566 03-12月-81 3000 20 7934 MILLER CLERK 7782 23-1月 -82 1300 10 已选择8行。SQL> --利用集合运算实现group by的增强 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> 注意 SQL> 1. 參与运算的各个集合必须列数同样 且类型一致 SQL> 2. 採用第一个集合的表头作为最后的表头 SQL> 3. 假设排序,必须在每一个集合后使用同样的order by SQL> 4. 能够使用括号 SQL> */ 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; DEPTNO JOB SUM(SAL) ------ --------- ---------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 10 8750 20 ANALYST 6000 20 CLERK 1900 20 MANAGER 2975 20 10875 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 5600 DEPTNO JOB SUM(SAL) ------ --------- ---------- 30 9400 29025 已选择13行。 SQL> break on deptno skip 2 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; DEPTNO JOB SUM(SAL) ------ --------- ---------- 10 CLERK 1300 MANAGER 2450 PRESIDENT 5000 8750 20 ANALYST 6000 CLERK 1900 MANAGER 2975 10875 DEPTNO JOB SUM(SAL) ------ --------- ---------- 30 CLERK 950 MANAGER 2850 SALESMAN 5600 9400 29025 已选择13行。 SQL> break on null SQL> select deptno,job,sum(sal) from emp group by rollup(deptno,job); DEPTNO JOB SUM(SAL) ------ --------- ---------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 10 8750 20 CLERK 1900 20 ANALYST 6000 20 MANAGER 2975 20 10875 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 5600 DEPTNO JOB SUM(SAL) ------ --------- ---------- 30 9400 29025 已选择13行。 SQL> --打开sql运行时间 SQL> set timing on SQL> select deptno,job,sum(sal) from emp group by rollup(deptno,job); DEPTNO JOB SUM(SAL) ------ --------- ---------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 10 8750 20 CLERK 1900 20 ANALYST 6000 20 MANAGER 2975 20 10875 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 5600 DEPTNO JOB SUM(SAL) ------ --------- ---------- 30 9400 29025 已选择13行。
已用时间: 00: 00: 00.00 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; DEPTNO JOB SUM(SAL) ------ --------- ---------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 10 8750 20 ANALYST 6000 20 CLERK 1900 20 MANAGER 2975 20 10875 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 5600 DEPTNO JOB SUM(SAL) ------ --------- ---------- 30 9400 29025 已选择13行。 已用时间: 00: 00: 00.01 SQL> set timing off SQL> select ename,sal from emp 2 where sal between 700 and 1300 3 INTERSECT 4 select ename,sal from emp 5 where sal between 1201 and 1400; ENAME SAL ---------- ----- MARTIN 1250 MILLER 1300 WARD 1250 SQL> select ename,sal from emp 2 where sal between 700 and 1300 3 minus 4 select ename,sal from emp 5 where sal between 1201 and 1400; ENAME SAL ---------- ----- ADAMS 1100 JAMES 950 SMITH 800 SQL> spool off