在SQL查询中,左连接(LEFT JOIN,也称为左外连接)和内连接(INNER JOIN)是两种广泛使用的连接方式。它们的主要区别在于如何处理不匹配的数据,下面我们将详细解析。

定义与核心逻辑
- 内连接(INNER JOIN):仅保留左右两张表中完全匹配的行。只有当连接条件(ON子句后的条件)在左右表中同时满足时,该行才会出现在结果集中。任何不匹配的行(无论是左表有而右表没有,还是右表有而左表没有)都会被过滤掉。
- 左连接(LEFT JOIN):保留左表的所有行,同时包含右表中与左表匹配成功的行。如果右表中没有匹配项,则右表的列将用NULL值填充。
结果集范围
- 内连接的结果集是左右表匹配行的交集,通常小于或等于左右表中行数较少的一方。
- 左连接的结果集以左表为驱动,包含左表的全部行以及右表中匹配的行,因此结果集大小至少等于左表的行数。
示例对比
假设有以下两张表:
| 左表 students(学生): |
id |
name |
| 1 |
张三 |
| 2 |
李四 |
| 3 |
王五 |
| 右表 scores(成绩): |
id |
stu_id |
score |
| 101 |
1 |
90 |
| 102 |
2 |
85 |
| 103 |
4 |
70 |
内连接(INNER JOIN)查询
SELECT s.name, sc.score
FROM students s
INNER JOIN scores sc ON s.id = sc.stu_id;
| 结果(仅显示匹配的行): |
name |
score |
| 张三 |
90 |
| 李四 |
85 |
左连接(LEFT JOIN)查询
SELECT s.name, sc.score
FROM students s
LEFT JOIN scores sc ON s.id = sc.stu_id;
| 结果(保留左表所有行,右表不匹配则显示NULL): |
name |
score |
| 张三 |
90 |
| 李四 |
85 |
| 王五 |
NULL |
关键区别总结
| 维度 |
内连接(INNER JOIN) |
左连接(LEFT JOIN) |
| 保留的数据 |
仅左右表匹配的行 |
左表所有行 + 右表匹配的行 |
| 不匹配的行处理 |
完全过滤 |
左表不匹配行保留,右表列填NULL |
| 结果集大小 |
≤ 左右表中行数较少的一方 |
≥ 左表的行数 |
| 适用场景 |
需严格匹配的数据(如“有成绩的学生”) |
需保留左表全部数据(如“所有学生及成绩”) |
简单来说,内连接是“取交集”,而左连接是“左表全要,右表取匹配”。在实际应用中,选择哪种连接方式取决于业务需求,特别是是否需要保留左表中未匹配的数据。
|