数据库Oracle与Mysql语法对比:集合运算

时间:2022-10-18 14:52:15

集合并集

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)) ;