左连接和内连接有什么区别?

164 阅读2分钟

左连接(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

| |

结果集大小

|

≤ 左右表中行数较少的一方

|

≥ 左表的行数(可能因右表多匹配而增加)

| |

适用场景

|

需严格匹配的数据(如“有成绩的学生”)

|

需保留左表全部数据(如“所有学生及成绩”)

|

简单说:内连接是“取交集”,左连接是“左表全要,右表取匹配”。选择哪种连接,取决于业务是否需要保留左表中未匹配的数据。

本文使用 文章同步助手 同步