INNER JOIN 和 LEFT JOIN 的区别?什么时候用哪种?
JOIN多表关联
考察意图
基础但极易在业务 SQL 里用错,导致「用户数对不上」。考察集合语义与空值意识。
回答框架
- 用集合语言:交集 vs 左表全保留。
- 说清右表无匹配时 LEFT 的 NULL 行为。
- 业务例子:下过单的用户 vs 全部用户及其订单。
- 提醒:WHERE 里过滤右表字段可能把 LEFT 变成 INNER。
参考答案(口述版)
INNER JOIN:只保留两表都能匹配上的行(交集)。
LEFT JOIN:保留左表全部行;右表无匹配时右表字段为 NULL。
例子:用户表 LEFT JOIN 订单表 → 得到「所有用户 + 其订单(可能没有)」;若改 INNER → 只剩「至少有一单的用户」。
选用口诀:
- 只要「两端都存在」的关系 → INNER
- 要以某张表为主体做补全/排查缺失 → LEFT(主体放左边)
进阶注意:LEFT JOIN t ON ... WHERE t.id IS NOT NULL 等价于 INNER;在 WHERE 里写 t.col = 1 也可能无意过滤掉未匹配行。过滤右表条件优先放 ON,或明确你是否要保留未匹配。
关键词
交集保留左表NULLON vs WHERE
面试官可能的追问
追问 1:一对多 JOIN 后做 COUNT 为什么会翻倍?
因为行被展开了。应先按主体去重再聚合,或 COUNT(DISTINCT 主体键),或先聚合右表再 JOIN。
常见踩坑
- LEFT JOIN 后又在 WHERE 过滤右表,语义变 INNER
- 一对多关联后直接 SUM/COUNT 导致重复计算
记忆锚点
INNER 要两边都有;LEFT 以左表为主体,不怕右表缺失。