#4 SQL 简单

INNER JOIN 和 LEFT JOIN 的区别?什么时候用哪种?

JOIN多表关联

🎯 考察意图

基础但极易在业务 SQL 里用错,导致「用户数对不上」。考察集合语义与空值意识。

📐 回答框架

  1. 用集合语言:交集 vs 左表全保留。
  2. 说清右表无匹配时 LEFT 的 NULL 行为。
  3. 业务例子:下过单的用户 vs 全部用户及其订单。
  4. 提醒: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 以左表为主体,不怕右表缺失。