左连接(LEFT JOIN,也叫左外连接)和内连接(INNER JOIN)是 SQL 中两种常用的连接方式,核心区别在于对“不匹配数据”的处理逻辑,具体差异如下:

1. 定义与核心逻辑
内连接(INNER JOIN):只保留左右两张表中“匹配成功”的行。即:只有当连接条件(
ON后的条件)在左右表中同时满足时,才会被包含在结果集中。不匹配的行(左表有右表没有,或右表有左表没有)会被完全过滤掉。左连接(LEFT JOIN):保留左表的所有行,以及右表中与左表“匹配成功”的行。即:左表的每一行都会出现在结果中,无论是否在右表中找到匹配;如果右表中没有匹配,右表的列会用
NULL填充。
2. 结果集范围
- 内连接的结果集是左右表匹配行的交集。
- 左连接的结果集是左表的全部行 + 右表与左表匹配的行(可理解为左表“驱动”结果集,右表仅补充匹配数据)。
3. 示例对比
假设有以下两张表:
- 左表
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.scoreFROM students sINNERJOIN scores sc ON s.id = sc.stu_id; 结果(仅保留匹配的行):
| name | score |
|---|---|
| 张三 | 90 |
| 李四 | 85 |
左连接(LEFT JOIN)
SELECT s.name, sc.scoreFROM students sLEFTJOIN scores sc ON s.id = sc.stu_id; 结果(保留左表所有行,右表不匹配则为 NULL):
| name | score |
|---|---|
| 张三 | 90 |
| 李四 | 85 |
| 王五 | NULL |
4. 关键区别总结
| 维度 | 内连接(INNER JOIN) | 左连接(LEFT JOIN) |
|---|---|---|
| 保留的数据 | 仅左右表匹配的行 | 左表所有行 + 右表匹配的行 |
| 不匹配的行处理 | 完全过滤 | 左表不匹配行保留,右表列填 NULL |
| 结果集大小 | ≤ 左右表中行数较少的一方 | ≥ 左表的行数(可能因右表多匹配而增加) |
| 适用场景 | 需严格匹配的数据(如“有成绩的学生”) | 需保留左表全部数据(如“所有学生及成绩”) |
简单说:内连接是“取交集”,左连接是“左表全要,右表取匹配”。选择哪种连接,取决于业务是否需要保留左表中未匹配的数据。
本文使用 文章同步助手 同步