内连接,左连接,右连接怎么区别开来?
区分这三种连接其实非常简单,核心就在于看**“谁的数据必须全部保留,谁的数据没有匹配就要被过滤掉”**。
为了让你彻底搞懂,我们可以把user表(用户)和orders表(订单)想象成两个班级,它们通过user_id这个学号来互相找朋友。
📌 内连接 (INNER JOIN):只留“双向奔赴”的
- 核心逻辑:取交集。只有当两张表能完美匹配上时,数据才会被保留。
- 业务场景:查“哪些用户下过单”。
- 结果表现:如果一个用户没下过单,或者一个订单找不到对应的用户,这两条数据都会被直接扔掉。
- 口诀:两边都有才算数。
📌 左连接 (LEFT JOIN):保住“左边老大”的全部
- 核心逻辑:保左表。以
FROM后面的左表为主,不管右表有没有匹配,左表的数据必须全部显示。如果右表没匹配上,就用NULL(空值)来填充。 - 业务场景:查“所有用户的下单情况”(哪怕他没买过东西,也要把他的名字列出来)。
- 结果表现:所有用户都会出现。张三下了两单就显示两行;李四没下单,他的订单字段就显示为
NULL。 - 口诀:左边全都要,右边随缘配。
📌 右连接 (RIGHT JOIN):保住“右边小弟”的全部
- 核心逻辑:保右表。跟左连接完全相反,以
JOIN后面的右表为主,不管左表有没有匹配,右表的数据必须全部显示。左表没匹配上就填NULL。 - 业务场景:查“所有订单的归属人”(哪怕系统里有找不到主人的异常脏数据订单,也要把它列出来)。
- 结果表现:所有订单都会出现。正常订单能匹配到用户名;异常订单的用户名字段显示为
NULL。 - 口诀:右边全都要,左边随缘配。
为了让你一眼看懂,我们用一张表格来总结它们的区别(假设左表是用户,右表是订单):
| 连接类型 | 核心作用 | 没匹配上的数据怎么办? | 实际开发常用度 |
|---|---|---|---|
| INNER JOIN | 只要两者都有的(交集) | 直接丢弃,不出现在结果里 | ⭐⭐⭐⭐⭐ (查精准关联数据) |
| LEFT JOIN | 保住左表所有,顺带查右表 | 左表保留,右表对应字段填NULL | ⭐⭐⭐⭐⭐ (最常用,符合阅读习惯) |
| RIGHT JOIN | 保住右表所有,顺带查左表 | 右表保留,左表对应字段填NULL | ⭐ (极少用,通常会被改写成左连接) |
💡 给你一个万能记忆法
在实际写 SQL 时,你只需要记住两点:
- 忘掉 RIGHT JOIN:因为
A RIGHT JOIN B等价于B LEFT JOIN A。只要你习惯把想保全的主表写在左边,永远只用LEFT JOIN就能解决 99% 的外连接需求。 - 看 ON 后面的条件:
INNER JOIN是严格的“门当户对”,而LEFT/RIGHT JOIN则是“偏心”地保护某一边的数据完整性。
