Join语句大白话(●—●)

目录

🧡内连接(INNER JOIN)

🧡左外连接(LEFT JOIN)

🧡右外连接(RIGHT JOIN)

🧡满外连接(FULL OUTER JOIN)

🧡取左表独有数据(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:不去重。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值