目录
🧡取左表独有数据(LEFT JOIN EXCLUDING INNER JOIN)
🧡取右表独有数据(RIGHT JOIN EXCLUDING INNER JOIN)
🧡取左右表独有数据(FULL OUTER JOIN EXCLUDING INNER JOIN)
💟这里是CS大白话专场,让枯燥的学习变得有趣!
💟没有对象不要怕,我们new一个出来,每天对ta说不尽情话!
💟好记性不如烂键盘,自己总结不如收藏别人!
💌根据员工表(emp)和部门表(dept)中的部门编号(deptno)相等,查询员工编号(empno)、员工名称(ename)、部门编号(deptno)和部门名称(dname)。 左表:员工表,右表:部门表。
💌有的员工没有部门,有的部门没有员工。
🧡内连接(INNER JOIN)
💌只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。
select
e.empno, e.ename, d.deptno, d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno;
🧡左外连接(LEFT JOIN)
💌左边表中符合WHERE子句的所有记录将会被返回,与连接条件不匹配的数据补充NULL。
select
e.empno, e.ename, d.deptno, d.dname
from
emp e
left join
dept d
on
e.deptno = d.deptno;
🧡右外连接(RIGHT JOIN)
💌右边表中符合WHERE子句的所有记录将会被返回,与连接条件不匹配的数据补充NULL。
select
e.empno, e.ename, d.deptno, d.dname
from
emp e
right join
dept d
on
e.deptno = d.deptno;
🧡满外连接(FULL OUTER JOIN)
💌两表中符合WHERE子句的所有记录将会被返回,与连接条件不匹配的数据补充NULL。
select
e.empno, e.ename, nvl(e.deptno,d.deptno), d.dname
from
emp e
full join
dept d
on
e.deptno = d.deptno;
🍠 nvl(a,b):若a为NULL则用b,若b为NULL则用a。
🧡取左表独有数据(LEFT JOIN EXCLUDING INNER JOIN)
💌只存在左表中符合WHERE子句的所有记录将会被返回。
select
e.empno, e.ename
from
emp e
left join
dept d
on
e.deptno = d.deptno
where
d.deptno is NULL;
select
e.empno, e.ename
from
emp e
where
e.deptno not in
(
select
deptno
from
dept
);
💌但是最好不要使用 in/not in,其效率很低而且可能会出现查询错误,可以用 exists/not exists 或 join 代替 :面试官:为什么要尽量避免使用 IN 和 NOT IN 呢?
🧡取右表独有数据(RIGHT JOIN EXCLUDING INNER JOIN)
💌只存在右表中符合WHERE子句的所有记录将会被返回。
select
d.deptno, d.dname
from
emp e
right join
dept d
on
e.deptno = d.deptno
where
e.deptno is NULL;
🧡取左右表独有数据(FULL OUTER JOIN EXCLUDING INNER JOIN)
💌只存在左表或右表中符合WHERE子句的所有记录将会被返回。
select
e.empno, e.ename, nvl(e.deptno,d.deptno), d.dname
from
emp e
full join
dept d
on
e.deptno = d.deptno
where
e.deptno is null or d.deptno is null;
select
*
from
(select
e.empno, e.ename, d.deptno, d.dname
from
emp e
left join
dept d
on
e.deptno = d.deptno
where
d.deptno is NULL
union
select
e.empno, e.ename, d.deptno, d.dname
from
emp e
right join
dept d
on
e.deptno = d.deptno
where
e.deptno is NULL)tmp;
🍠union:去重,union all:不去重。