Oracle学习(7):集合运算

集合运算

小例子

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

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> 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必须在每个集合后使用相同的order by

SQL> */

对于字符添加空列,使用to_char(null)

对于数字添加空列,使用to_number(null)

union

UNION运算符返回两个集合去掉重复元素后的所有记录

UNIONALL返回两个集合的所有记录,包括重复的

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> /

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> /

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> host cls

打开SQL执行的时间

SQL> --打开SQL执行的时间

SQL> set timing on

SQL> select deptno,job,sum(sal)

2  from emp

3  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.00

SQL> set timing off

这儿由于数据量太少导致时间太短无法测出,在平时可以使用此种方法来检测哪一个sql语句执行时间更短,则那个sql更为好

INTERSECT语句

INTERSECT
运算符返回同时属于两个集合的记录

显示薪水同时位于级别1(700~1300)和级别2(1201~1400)的员工信息:

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

minus

MINUS返回属于第一个集合,但不属于第二个集合的记录。

显示薪水同时位于级别1(700~1300),但不属于级别2(1201~1400)的员工信息:

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

集合运算注意事项

lselect语句中参数类型和个数要一致。

l可以使用括号改变集合执行的顺序

l如果有order by子句,必须放到每一句查询语句后

l集合运算采用第一个语句的表头作为表头

时间: 2024-10-28 06:43:28

Oracle学习(7):集合运算的相关文章

Oracle学习之集合运算

一.集合运算操作符  UNION:(并集)返回两个集合去掉重复值的所有的记录  UNION ALL:(并集)返回两个集合去掉重复值的所有的记录 INTERSECT:(交集)返回两个集合的所有记录,重复的只取一次  MINUS:(差集)返回属于第一个集合,但不属于第二个集合的所有                        记录 集合运算中各个集合必须有相同的列数,且类型一致,集合运算的结        果将采用第一个集合的表头作为最终的表头,order by必须放在每个        集合后

oracle学习之集合运算和数据处理

集合运算主要有三种方式: 并集,union 两个集合相同的部份只保留一份,不同部份全部保留 union  all 两个集合全部保留 交集,intersect 两个集合保留相同的部份 差集,minus A差集B 保留 A中不在B中出现的部份 集合运算的注意事项: 1,参与运算的各个集合必须列数相同,且类型一致! 2,采用第一个集合的表头作为最终使用的表头,(别名也只能在第一个集合上起) 3,可以使用括号(),先执行后面的语句. 使用示例: select * from emp where deptn

SQL基础学习_06_集合运算和联结

集合运算 1. 并集:UNION ? ? 例: ? ? SELECT shohin_id, shohin_mei? ? FROM Shohin? ? UNION? ? SELECT shohin_id, shohin_mei? ? FROM Shohin2; ? ? 将Shohin和Shohin2两张表的shohin_id和shohin_mei两列取并集: ? ? 注意,UNION操作时,列数必须相等,且每列的数据类型应该相同 ? ? 保留重复行: UNION ALL 2. 交集:INTERSE

oracle学习笔记比较运算

<  >=  <= >=  <>(不等于)  !=(不等于)   :=(赋值) between--and  (在一个区间 包含边界) --查询工资在2000到5000的工资 select salary from employees where salary between2000and5000 in() --查询80,90,70,50,部门编号的人 Select last_name from employees where department_id in(80,90,

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 wh

5.创建表,使用alter进行表信息的增删改,Oracle回收站,集合运算

 1  Oracle基于用户的管理方案 2 DDL语句可以管理数据库的对象有:视图   索引  序列  同义词   约束 3  创建一个表,有2个条件(1 有权限:2有表空间) Oracle给你提供了默认的resource. 4 创建表,表信息的增删改,Oracle回收站 DDL 管理数据库的对象 表 视图 索引 序列 同义词 约束(..... ) oracle基于用户的管理方案 借助于管理工具可以方便 看到数据库各个对象.... 1 创建一个表 2个条件(1 有权限  2 有表空间) or

oracle 集合运算

集合运算就是将两个或者多个结果集组合成为一个结果集.集合运算包括: INTERSECT(交集),返回两个查询共有的记录. UNION ALL(并集),返回各个查询的所有记录,包括重复记录. UNION(并集),返回各个查询的所有记录,不包括重复记录. MINUS(补集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录. 当使用集合操作的时候,要注意:查询所返回的列数以及列的类型必须匹配,列名可以不同. 代码演示:查询出dept表中哪个部门下没有员工.只需求出dept表中的部门

Oracle组函数、多表查询、集合运算、数据库对象(序列、视图、约束、索引、同义词)等

count组函数:(过滤掉空的字段) select count(address),count(*) from b_user max() avg() min(),sum() select sum(age),max(age),min(age),avg(nvl(age,0)) from b_user 1       260     70      10      37.1428571428571 group by:如果前面定义了该字段名  则groupby必须也写上该字段 select name,pw

Sql学习笔记3——集合运算、空值和聚集函数

1.集合运算 SQL作用在关系上的union.intersect和except(Oracle中用minus代替except)运算,对应于数学集合论中的并.交和差运算.这三个运算都自动去除重复. eg: 找出在2009年秋季学期开课但不在2010年春季开课的所有课程 (select course_id from section where semester=‘Fall’ and year=2009) except (select course_id from section where semes