inner join,left join和right join的区别


学习数据库中的INNER JOINLEFT JOINRIGHT JOIN,如有错误望诸位指正🧐。


在 SQL 中,INNER JOINLEFT JOINRIGHT JOIN 是三种常用的表连接方式,它们的核心区别在于 如何处理连接条件中不匹配的行


1. INNER JOIN

INNER JOIN也就是是内连接,它的作用是返回两个表中 完全匹配 的行。它的逻辑是仅保留两个表中 连接条件成立 的行。如果某行在左表(出现在INNER JOIN关键字左边的表)或右表(出现在INNER JOIN关键字右边的表)中没有匹配项,则该行不会出现在结果中。最终返回的结果是两个表的交集部分。

比如说对于两张表
Employees 员工表

idnamedepartment_id
1张三101
2李四102
3王五103

Departments 部门表

idname
101技术部
102销售部
103财务部

执行SQL语句

SELECT A.id, B.name
FROM Employees A
INNER JOIN Departments B ON A.department_id = B.id;

我们先逐个分解一下这条SQL语句。

FROM Employees A​​FROM​​关键字指定了主表也就是查询开始的表,​Employees是​​主表的名称,其后的​​A​​为 Employees 表定义的别名。后续可以直接用 A 代替 Employees 。比方说 A.id 就等价于 Employees.id。

INNER JOIN Departments B​​中的​​INNER JOIN​​关键字表示内连接操作,​​Departments​​指定了需要连接的表名。和上面的A一样,B​​为 Departments 表定义别名。后续可以直接用 B 代替 Departments。

ON A.department_id = B.id​​中的​​ON​​关键字,用于指定连接条件。ON A.department_id = B.id​​的​​作用​​是将 Employees 表的 department_id 与 Departments 表的 id 匹配,只有匹配成功的行才会被保留。

FROM关键字指定主表,而这里的主表理解为Employees A INNER JOIN Departments B on A.department_id = B.id更好一点儿(继续看例子你会更容易明白)。

现在来看整个SQL语句(肯定不是水字数😘)

SELECT A.id, B.name
FROM Employees A
INNER JOIN Departments B ON A.department_id = B.id;

Employees A INNER JOIN Departments B ON A.department_id = B.id会构建一张表,并且是将A中department_id等于B中id的行拼接成一行保留到这张表

A.idA.nameA.department_idB.idB.name
1张三101101技术部
2李四102102销售部
3王五103103财务部

然后通过SELECT A.id, B.name FROM抽取这张表中的A.idB.name字段返回,最终得到结果为

A.idB.name
1技术部
2销售部
3财务部

2. LEFT JOIN

LEFT JOIN 又称为 LEFT OUTER JOIN,也就是左连接,它的作用是返回左表(出现在LEFT JOIN关键字左边的表)的所有行,即使右表(出现在LEFT JOIN关键字左边的表)中没有匹配的行。它会确保左表的所有行都会被保留,并且如果右表没有匹配的行,则右表字段用 NULL 填充。最终返回的结果是左表全集 + 右表匹配的行,而未匹配部分为填充为 NULL

比如说对于两张表
TableA

iddata
1Apple
2Banana
3Cherry

TableB

idinfo
1Red
3Purple
4Green

执行 SQL 语句

SELECT A.id, B.info
FROM TableA A
LEFT JOIN TableB B ON A.id = B.id;

其中TableA A LEFT JOIN TableB B ON A.id = B.id会构建一张表,并且它会确保 A (左表)的所有行都会被保留,并且如果B(右表)没有匹配的行,就用 NULL填充

A.idA.dataB.idB.info
1Apple1Red
2BananaNULLNULL
3Cherry3Purple

然后通过SELECT A.id, B.info FROM从这张表中拿出A.idB.info字段得到最终结果为

A.idB.info
1Red
2NULL
3Purple

3. RIGHT JOIN

RIGHT JOIN 又称RIGHT OUTER JOIN,也就是右连接,它的作用是返回右表的所有行,即使左表中没有匹配的行(刚好和LEFT JOIN相反)。它会确保右表的所有行都会被保留,并且如果左表没有匹配的行,左表字段用 NULL 填充。最终返回的结果是右表全集 + 左表匹配的行,未匹配部分为 NULL

比如说对于两张表
TableA

iddata
1X
2Y
3Z

TableB

idinfo
1Alpha
3Beta
4Gamma

执行 SQL 语句

SELECT A.data, B.info
FROM TableA A
RIGHT JOIN TableB B ON A.id = B.id;

先通过TableA A RIGHT JOIN TableB B ON A.id = B.id构建一张表

B.idB.infoA.idA.data
1Alpha1X
3Beta3Z
4GammaNULLNULL

然后通过SELECT A.data, B.info FROM抽取A.dataB.info得到结果

A.dataB.info
XAlpha
ZBeta
NULLGamma

4. 交换表位置 LEFT JOIN 与 RIGHT JOIN`等价

可以通过交换表的位置,用 LEFT JOIN 实现 RIGHT JOIN 的效果,也就是A RIGHT JOIN B等价于B LEFTJOIN A


对比总结

连接类型是否保留左表所有行?是否保留右表所有行?未匹配的字段填充
INNER JOIN不保留未匹配行
LEFT JOIN✔️右表字段为 NULL
RIGHT JOIN✔️左表字段为 NULL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值