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;--调用过的员工编号