左连接(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.score
FROM students s
INNERJOIN scores sc ON s.id = sc.stu_id;
结果(仅保留匹配的行):
| name
|
score
| | --- | --- | |
张三
|
90
| |
李四
|
85
|
左连接(LEFT JOIN)
SELECT s.name, sc.score
FROM students s
LEFTJOIN scores sc ON s.id = sc.stu_id;
结果(保留左表所有行,右表不匹配则为 NULL):
| name
|
score
| | --- | --- | |
张三
|
90
| |
李四
|
85
| |
王五
|
NULL
|
4. 关键区别总结
| 维度
|
内连接(INNER JOIN)
|
左连接(LEFT JOIN)
| | --- | --- | --- | |
保留的数据
|
仅左右表匹配的行
|
左表所有行 + 右表匹配的行
| |
不匹配的行处理
|
完全过滤
|
左表不匹配行保留,右表列填 NULL
| |
结果集大小
|
≤ 左右表中行数较少的一方
|
≥ 左表的行数(可能因右表多匹配而增加)
| |
适用场景
|
需严格匹配的数据(如“有成绩的学生”)
|
需保留左表全部数据(如“所有学生及成绩”)
|
简单说:内连接是“取交集”,左连接是“左表全要,右表取匹配”。选择哪种连接,取决于业务是否需要保留左表中未匹配的数据。
本文使用 文章同步助手 同步