如何使用left join_mysql左连接查询说明

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