LEFT JOIN 保留左表全部记录,右表无匹配时字段为 NULL;其结果行数由左表决定,ON 条件用于关联,右表筛选须写在 ON 而非 WHERE,否则退化为 INNER JOIN。

LEFT JOIN 用于保留左表全部记录,右表只匹配符合条件的行;没匹配上的右表字段显示为 NULL。
LEFT JOIN 的基本语法和逻辑
LEFT JOIN 以左表(FROM 后面的表)为基准,逐行查找右表中满足 ON 条件的记录。只要左表某行存在,无论右表有没有匹配项,这行都会出现在结果里。右表没匹配到的部分,对应字段值为 NULL。
写法示例:
SELECT a.id, a.name, b.order_amountFROM users a
LEFT JOIN orders b ON a.id = b.user_id;
上面语句会列出所有用户,包括那些从未下过单的人(此时 order_amount 为 NULL)。
什么时候必须用 LEFT JOIN
- 查“所有 A 及其对应的 B”,但允许 B 缺失:比如统计每个用户的订单总额,也要包含零订单用户
- 筛选条件写在 ON 子句而非 WHERE:若把右表过滤条件误写在 WHERE,会导致 LEFT JOIN 变成 INNER JOIN 效果
- 需要区分“无数据”和“数据为 0/空字符串”:NULL 是明确的缺失标识,便于后续判断
常见错误和注意事项
-
别把右表条件放 WHERE:例如
WHERE b.status = 'paid'会过滤掉右表为 NULL 的行,实际丢掉左表无匹配的记录 - ON 条件要写清楚关联字段:避免漏写或写错列名,尤其是多表连接时字段名可能重复
-
注意 NULL 值参与计算:如
SUM(b.amount)自动忽略 NULL,但b.amount + 10遇到 NULL 会得 NULL,可用IFNULL(b.amount, 0)处理
LEFT JOIN 和 INNER JOIN 的直观区别
假设 users 表有 5 行,orders 表有 3 行且只关联其中 2 个用户:
- INNER JOIN 结果最多 2 行(只返回两边都有的匹配)
- LEFT JOIN 结果固定 5 行(users 全部保留),其中 3 行的 orders 字段为 NULL
本质差异在于驱动表——LEFT JOIN 的结果行数由左表决定,不是由匹配数量决定。










