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 的结果行数由左表决定,不是由匹配数量决定。
