
INNER JOIN 只保留两表都存在的匹配行,LEFT JOIN 保留左表全部行,右表无匹配则补 NULL。
匹配逻辑不同
INNER JOIN 是“交集”操作:只有左表和右表中连接字段值完全相等的记录才会出现在结果中。任一表中没有对应匹配的行,整条记录就被过滤掉。
LEFT JOIN 是“左表主导”的操作:左表所有行都会出现在结果里;右表只提供匹配的行,不匹配的部分用 NULL 填充。
结果行数差异明显
- INNER JOIN 结果行数 ≤ 左表行数,也 ≤ 右表行数,通常少于任一原表
- LEFT JOIN 结果行数 = 左表行数(除非 ON 条件中有额外限制)
- 若左表某行在右表有多个匹配,LEFT JOIN 会产生多行(一对多扩展),INNER JOIN 同样如此
NULL 值出现位置有规律
LEFT JOIN 中,右表字段可能出现 NULL——这代表左表该行在右表找不到匹配项。这是判断“缺失关联数据”的关键依据。
INNER JOIN 结果中不会出现因连接失败导致的 NULL(除非原始数据本身含 NULL,且参与了 ON 条件)。
例如:查所有用户及其订单数,但想保留没下过单的用户 → 必须用 LEFT JOIN + COUNT(orders.id),配合 GROUP BY users.id;用 INNER JOIN 就会漏掉零订单用户。
何时选哪个?看业务意图
- 要“严格有关联的数据”,比如生成发货清单(用户必须有有效订单),用 INNER JOIN
- 要“以主表为基准完整呈现”,比如统计各分类商品数(分类表为主表,即使某些分类无商品也要显示 0),用 LEFT JOIN
- 右表字段参与 WHERE 条件时要小心:LEFT JOIN 后写 WHERE right_table.col = xxx,实际会把无匹配的行(即 right_table.col 为 NULL 的行)过滤掉,效果接近 INNER JOIN —— 此时应把条件移到 ON 子句中










