您的位置:首页 > 数据库 > Oracle

Oracle集合运算

2014-01-24 16:22 513 查看
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;

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);
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>--交集
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>--差集
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: