LEFT JOIN
、RIGHT JOIN
和 INNER JOIN
的区别
在 SQL 中,JOIN
主要用于连接多张表的数据,LEFT JOIN
、RIGHT JOIN
和 INNER JOIN
是常用的三种连接方式,它们的主要区别如下:
JOIN 类型 | 保留哪张表的数据? | 未匹配的数据填充 NULL 吗? |
---|---|---|
INNER JOIN | 只保留两张表匹配的数据 | ❌ 不保留未匹配数据 |
LEFT JOIN | 保留左表的所有数据 | ✅ 右表未匹配的行填充 NULL |
RIGHT JOIN | 保留右表的所有数据 | ✅ 左表未匹配的行填充 NULL |
🌟 示例数据
假设有两张表:
students
(学生表)
student_id | name | class_id |
---|---|---|
1 | 张三 | 101 |
2 | 李四 | 102 |
3 | 王五 | 103 |
4 | 赵六 | NULL |
classes
(班级表)
class_id | class_name |
---|---|
101 | 数学班 |
102 | 物理班 |
1️⃣ INNER JOIN
(内连接)
只返回两张表都匹配的数据,不匹配的行不会出现。
SELECT s.student_id, s.name, c.class_name FROM students s INNER JOIN classes c ON s.class_id = c.class_id;
🔹 查询结果(只显示 class_id
匹配的数据):
student_id | name | class_name |
---|---|---|
1 | 张三 | 数学班 |
2 | 李四 | 物理班 |
🚨 没有 王五
和 赵六
,因为它们的 class_id
没有匹配的 class_name
!
2️⃣ LEFT JOIN
(左连接)
保留 students
(左表)所有数据,classes
(右表)中匹配不到的填充 NULL
。
SELECT s.student_id, s.name, c.class_name FROM students s LEFT JOIN classes c ON s.class_id = c.class_id;
🔹 查询结果:
student_id | name | class_name |
---|---|---|
1 | 张三 | 数学班 |
2 | 李四 | 物理班 |
3 | 王五 | NULL |
4 | 赵六 | NULL |
✅ 王五
和 赵六
没有匹配到 class_name
,所以 class_name
显示 NULL
,但仍然保留。
3️⃣ RIGHT JOIN
(右连接)
保留 classes
(右表)所有数据,students
(左表)匹配不到的填充 NULL
。
SELECT s.student_id, s.name, c.class_name FROM students s RIGHT JOIN classes c ON s.class_id = c.class_id;
🔹 查询结果:
student_id | name | class_name |
---|---|---|
1 | 张三 | 数学班 |
2 | 李四 | 物理班 |
✅ 这里的结果和 INNER JOIN
一样,因为 RIGHT JOIN
保留 classes
的所有数据,但 classes
里的 class_id
在 students
里都有匹配,所以 RIGHT JOIN
和 INNER JOIN
结果相同。
🌟 总结
JOIN 类型 | 结果 | 适用场景 |
---|---|---|
INNER JOIN | 只保留匹配的行 | 仅需要两张表都有的数据 |
LEFT JOIN | 保留左表所有数据,右表没有的填 NULL | 左表数据是主要的,右表只是补充信息 |
RIGHT JOIN | 保留右表所有数据,左表没有的填 NULL | 右表数据是主要的,左表只是补充信息 |
✅ LEFT JOIN
和 RIGHT JOIN
是可以互换的,只需要调换表的位置,但大部分情况下 LEFT JOIN
更常用,因为查询的主表通常是左表。
🔥 重点
INNER JOIN
只返回两表都匹配的数据(最严格)。LEFT JOIN
确保左表所有行都返回,右表没有匹配数据时,填充NULL
(最常用)。RIGHT JOIN
确保右表所有行都返回,左表没有匹配数据时,填充NULL
(很少用)。
🚀 实际开发中,LEFT JOIN
用得最多,RIGHT JOIN
只是 LEFT JOIN
的变形,INNER JOIN
适用于完全匹配的数据。