– 集合运算
所有的集合运算符与等号的优先级相同,如果 SQL 语句包含多个集合运算符并且没有圆括号明确地指定另一个顺序,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);
– sql 标准
union联合运算
– 1.去重
– 2.默认第一列升序排序
– 3.使用第一个语句的列名定义查询的列名
– 4.多个sql语句列个数一致、类型一致、名称可以不一致
– 5.每个查询不能包含自己的Order by子句,只能在联合之后使用Order by子句-- 查询编号为7839的员工当前工资、岗位及历史工资、岗位 select sal 工资, job 岗位 from emp where empno = 7839 union select sal, job from emp_jobhistory where empno = 7839;
union all 完全联合运算
– 1.不去重
– 2.默认不排序
– 3.使用第一个语句的列名定义查询的列名
– 4.多个sql语句列个数一致、类型一致、名称可以不一致
– 5.每个查询不能包含自己的Order by子句,只能在联合之后使用Order by子句-- 查询编号为7839的员工当前工资、岗位及历史工资、岗位,重复行记录不要求被去掉。 select sal, job from emp where empno = 7839 union all select sal, job from emp_jobhistory where empno = 7839;
– oracle 自有
相交运算(intersect):获取多个SQL语句之间的共有的数据(取交集)
-- 查询哪些员工做过岗位调动? select empno from emp intersect select empno from emp_jobhistory;
相减运算 (minus) :保留第一个SQL语句有的,第二个没有的数据
-- 查询哪些员工没做过岗位调动? select empno from emp minus select empno from emp_jobhistory; -- 1.用集合运算,列出不包含job为SALESMAN 的部门的部门号。 select deptno from dept minus select deptno from emp where job = 'SALESMAN';