集合并集
Oracle&&Mysql关键字:
UNION 并集,合并两个操作的结果,去掉重复的部分
UNION ALL 并集,合并两个操作的结果,保留重复的部分
例:查询部门 10 和部门 20 的所有职务
Oracle&&Mysql:
SELECT job FROM emp WHERE deptno=10
UNION
SELECT job FROM emp WHERE deptno=20;
集合交集:
oracle关键字:
INTERSECT 交集,取两个操作结果中相同的部分
例:查询部门 10 和 20 中是否有相同的职务和工资。(相同表)
Oracle:
SELECT job,sal FROM emp WHERE deptno=10
INTERSECT
SELECT job,sal FROM emp WHERE deptno=20;
Mysql:
SELECT job,sal
FROM emp
WHERE deptno=20 and DEPTNO = 10;
不同表:
select A.* from A
inner join B
using(name,addr,age);//交集元素
集合的差集
Oracle关键字:
MINUS 差集,从前面的操作结果中去掉与后面操作结果相同的部分
Mysql关键字: not in
例:查询只在部门表中出现,但没有在雇员表中出现的部门编号。
Oracle:
SELECT deptno FROM dept
MINUS
SELECT deptno FROM emp ;
Mysql:
SELECT dept.DEPTNO
FROM dept
left join emp
using(deptno) //或者:on dept.DEPTNO = emp.DEPTNO
where emp.DEPTNO is null;
(在A中出现没有在B中出现的,这里的left join你可以对应的换成right join的):
select A.*
from A
left join B
using(name,addr,age)
where B.name is NULL;
(在B中出现没有在A中出现的):
select B.*
from B
left join A
using(name,addr,age)
where A.id is NULL;
(A中的数据没有在B中特定部分中存在的):
select A.name,A.addr,A.age
from A
left join (select * from B where name='kenthy') as C
using(name, addr, age)
where C.id is NULL;
例:部门 10 和 20 中不相同的职务(即部门 10 中有、部门 20 中没有和部门
20 中有、部门 10 中没有的职务
Mysql:
(select distinct JOB
from emp
where deptno =10
and job not in(select distinct job
from emp
where deptno =20))
union
(select distinct job
from emp
where deptno =20
and job not in(select distinct job
from emp
where deptno =10)) ;