MySQL连接类型区别详解
在 MySQL 中,LEFT JOIN、RIGHT JOIN 和 INNER JOIN 是关联多个表的核心方式,核心区别在于它们如何处理连接条件未匹配的行。下面用图示和表格对比说明:
📊 核心区别总结
| 连接类型 | 别名 | 保留哪侧数据 | 未匹配行的处理 | 使用频率 |
|---|---|---|---|---|
INNER JOIN |
JOIN (默认) |
仅双方匹配的行 | 丢弃所有未匹配行 | ⭐⭐⭐⭐⭐ |
LEFT JOIN |
LEFT OUTER JOIN |
左表所有行 + 右表匹配行 | 右表未匹配列补 NULL |
⭐⭐⭐⭐ |
RIGHT JOIN |
RIGHT OUTER JOIN |
右表所有行 + 左表匹配行 | 左表未匹配列补 NULL |
⭐ |
🧩 详细说明(以表A和表B为例)
1. INNER JOIN (内连接)
-
结果集: 仅返回 表A和表B匹配成功 的行。
-
未匹配数据: 直接丢弃。
-
语法示例:
SELECT * FROM tableA A INNER JOIN tableB B ON A.key = B.key; -
图示:
表A 表B 结果 ┌───┐ ┌───┐ ┌───────┐ │ A1├─匹配─┤B1 │ → │ A1-B1 │ │ A2│ └───┘ └───────┘ └───┘
2. LEFT JOIN (左外连接)
-
结果集: 返回 表A所有行 + 表B匹配的行。
-
未匹配数据: 表B列补
NULL。 -
语法示例:
SELECT * FROM tableA A LEFT JOIN tableB B ON A.key = B.key; -
图示:
表A 表B 结果 ┌───┐ ┌───┐ ┌──────────┐ │ A1├─匹配─┤B1 │ → │ A1-B1 │ │ A2│ └───┘ │ A2-NULL │ └───┘ └──────────┘
3. RIGHT JOIN (右外连接)
-
结果集: 返回 表B所有行 + 表A匹配的行。
-
未匹配数据: 表A列补
NULL。 -
语法示例:
SELECT * FROM tableA A RIGHT JOIN tableB B ON A.key = B.key; -
图示:
表A 表B 结果 ┌───┐ ┌───┐ ┌──────────┐ │ A1│ │B1 │ → │ A1-B1 │ └───┘ │B2 │ │ NULL-B2 │ └───┘ └──────────┘
💡 关键注意事项
-
LEFT JOINvsRIGHT JOIN
两者本质对称,实际开发中优先使用LEFT JOIN(更符合从左到右的阅读习惯)。需RIGHT JOIN时,通常可通过调换表顺序 +LEFT JOIN实现。 -
过滤条件的放置
-
ON子句: 定义连接条件(影响连接行为)。 -
WHERE子句: 在连接后过滤结果(可能将NULL行过滤掉)。
-- 错误:可能将LEFT JOIN的未匹配行过滤掉 SELECT * FROM A LEFT JOIN B ON A.id = B.id WHERE B.value > 10; -- 正确:将条件移至ON子句 SELECT * FROM A LEFT JOIN B ON A.id = B.id AND B.value > 10; -
-
性能考虑
-
INNER JOIN通常最快(数据量最小)。 -
LEFT/RIGHT JOIN需处理未匹配行,可能稍慢。确保关联字段有索引可优化性能。
-
🌰 实际场景示例
假设有两个表:
-
employees表 (员工信息) -
departments表 (部门信息)
-- 查所有员工及其部门(包括未分配部门的员工)
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.id;
-- 查所有部门及其员工(包括无员工的部门)
SELECT d.dept_name, e.name
FROM departments d
LEFT JOIN employees e ON d.id = e.dept_id; -- 等价于 RIGHT JOIN 写法
-- 仅查已分配部门的员工信息
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.id;
✅ 总结:根据业务需求选择连接类型——需保留主表完整数据时用
LEFT JOIN/RIGHT JOIN,只需交集数据则用INNER JOIN。理解差异后,多表关联将更得心应手!

浙公网安备 33010602011771号