数据库中的 连接(JOIN)操作 用于合并多个表中的数据。以下是 内连接、外连接、左外连接、右外连接 的核心区别与示例说明:
1. 内连接(INNER JOIN)
- 作用:返回两个表中匹配成功的行(交集)。
- 结果:仅包含满足连接条件的行,不匹配的行被丢弃。
- 语法示例:
SELECT * FROM TableA A INNER JOIN TableB B ON A.Key = B.Key; - 示意图:
TableA ∩ TableB
2. 外连接(OUTER JOIN)
分为 左外连接、右外连接、全外连接:
(1) 左外连接(LEFT JOIN / LEFT OUTER JOIN)
- 作用:返回 左表所有行 + 右表匹配的行。若右表无匹配,则补
NULL。 - 结果:左表数据完整保留,右表只保留匹配数据。
- 语法示例:
SELECT * FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key; - 示意图:
TableA + (匹配的TableB)
(2) 右外连接(RIGHT JOIN / RIGHT OUTER JOIN)
- 作用:返回 右表所有行 + 左表匹配的行。若左表无匹配,则补
NULL。 - 结果:右表数据完整保留,左表只保留匹配数据。
- 语法示例:
SELECT * FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key; - 示意图:
(匹配的TableA) + TableB
(3) 全外连接(FULL JOIN / FULL OUTER JOIN)
- 作用:返回 左表所有行 + 右表所有行。匹配失败的部分补
NULL。 - 结果:左右表数据都完整保留。
- 语法示例:
SELECT * FROM TableA A FULL OUTER JOIN TableB B ON A.Key = B.Key; - 示意图:
TableA ∪ TableB
⚠️ MySQL不支持
FULL JOIN,可通过LEFT JOIN + RIGHT JOIN + UNION实现。
核心区别总结
| 连接类型 | 保留左表所有行? | 保留右表所有行? | 未匹配数据填充 | 实际应用场景 |
|---|---|---|---|---|
| INNER JOIN | ❌ | ❌ | 丢弃 | 需要精确匹配的数据查询 |
| LEFT JOIN | ✔️ | ❌ | 右表补 NULL | 主表数据必须完整(如用户订单统计) |
| RIGHT JOIN | ❌ | ✔️ | 左表补 NULL | 较少用(可被左连接替代) |
| FULL JOIN | ✔️ | ✔️ | 双方补 NULL | 合并两个表完整数据(如数据比对) |
直观示例对比
假设:
-
表A(Users)
UserID Name 1 Alice 2 Bob -
表B(Orders)
OrderID UserID Product 101 1 Apple 102 3 Banana
(1) INNER JOIN 结果
SELECT * FROM Users
INNER JOIN Orders ON Users.UserID = Orders.UserID;
| UserID | Name | OrderID | UserID | Product |
|---|---|---|---|---|
| 1 | Alice | 101 | 1 | Apple |
(2) LEFT JOIN 结果
SELECT * FROM Users
LEFT JOIN Orders ON Users.UserID = Orders.UserID;
| UserID | Name | OrderID | UserID | Product |
|---|---|---|---|---|
| 1 | Alice | 101 | 1 | Apple |
| 2 | Bob | NULL | NULL | NULL |
(3) RIGHT JOIN 结果
SELECT * FROM Users
RIGHT JOIN Orders ON Users.UserID = Orders.UserID;
| UserID | Name | OrderID | UserID | Product |
|---|---|---|---|---|
| 1 | Alice | 101 | 1 | Apple |
| NULL | NULL | 102 | 3 | Banana |
关键注意事项
- 左连接 vs 右连接:
二者本质对称,可通过交换表顺序相互转换。实践中 LEFT JOIN 更常用。 - 过滤条件位置:
ON指定连接条件(连接前过滤)WHERE指定结果过滤(连接后过滤)。
错误示例:
正确做法:SELECT * FROM A LEFT JOIN B ON A.id = B.id WHERE B.value > 10; -- 会丢弃B为NULL的行(退化为INNER JOIN)SELECT * FROM A LEFT JOIN B ON A.id = B.id AND B.value > 10; -- 保留A所有行 - 性能影响:
外连接通常比内连接开销大,需合理使用索引优化。
💡 简单记忆口诀:
- INNER JOIN → 只要匹配的
- LEFT JOIN → 左表全保留,右表匹配的
- RIGHT JOIN → 右表全保留,左表匹配的
- FULL JOIN → 左右全保留,匹配的合并
1416

被折叠的 条评论
为什么被折叠?



