Oracle笔记11——Oracle集合运算

1.创建员工历史岗位表 emp_jobhistory:
CREATE TABLE emp_jobhistory(
    id NUMBER,--流水号
    empno NUMBER,--员工编号
    job VARCHAR2(9),--岗位
    begindate DATE,--开始日期
    sal Number(7,2)--在该岗位时工资
)

2.插入如下数据:
INSERT INTO emp_jobhistory VALUES(1,7839,'TRAINEE','17-11月-81',500);
INSERT INTO emp_jobhistory VALUES(2,7839,'SALESMAN','17-2月-82',1800);
INSERT INTO emp_jobhistory VALUES(3,7839,'CLERK','17-2月-83',2000);
INSERT INTO emp_jobhistory VALUES(4,7839,'SALESMAN','17-2月-85',1800);
INSERT INTO emp_jobhistory VALUES(5,7839, 'MANAGER','17-2月-87',3000);
commit;

一、联合运算(UNION)

1.去重复

 2.默认第一列升序排序

3.所有SQL语句的列数一致、类型一致、列名可以不一致,默认使用第一个SQL语句作为列名

4.每个SQL语句不能有自己的order by语句

1.查询编号为7839的员工当前工资、岗位及历史工资、岗位?
SELECT * FROM emp WHERE empno = 7839;           --7839的员工当前工资、岗位
SELECT * FROM emp_jobhistory WHERE empno = 7839;--7839的员工历史工资、岗位

--多表连接(不适用)
SELECT * FROM emp e,emp_jobhistory h WHERE e.empno = h.empno;

--联合运算
SELECT empno 雇员编号,sal 工资,job 岗位 FROM emp WHERE empno = 7839       --7839的员工当前工资、岗位   1条数据
UNION
SELECT empno,sal,job FROM emp_jobhistory WHERE empno = 7839 ORDER BY 岗位;--7839的员工历史工资、岗位   5条数据

 

二、完全联合运算(UNION ALL)

1.不去重复

2.不排序

3.所有SQL语句的列数一致、类型一致、列名可以不一致,默认使用第一个SQL语句作为列名

4.每个SQL语句不能有自己的order by语句

5.完全联合运算(UNION ALL)效率高于联合运算(UNION),因为UNION ALL不需要去重,也不需要排序

1.查询编号为7839的员工当前工资、岗位及历史工资、岗位,要求不要去除重复数据
--完全联合运算
SELECT empno 雇员编号,sal 工资,job 岗位 FROM emp WHERE empno = 7839       --7839的员工当前工资、岗位   1条数据
UNION ALL
SELECT empno,sal,job FROM emp_jobhistory WHERE empno = 7839 ORDER BY 岗位;--7839的员工历史工资、岗位   5条数据

 

三、相交运算(INTERSECT)

取多个SQL语句之间的共有数据

1.查询哪些员工做过岗位调动?
SELECT empno FROM emp--所有的员工
INTERSECT
SELECT empno FROM emp_jobhistory;--调用过的员工编号

 

四、相减运算(MINUS) 

取A-B的数据,即第一个SQL有,第二个SQL没有的数据

1.查询哪些员工没有做过岗位调动?
SELECT empno FROM emp--所有的员工
MINUS
SELECT empno FROM emp_jobhistory;--调用过的员工编号

 

上一篇:mybaits


下一篇:视图