inner join只返回两表交集,left join保留左表全部行并用null填充右表不匹配字段;前者结果无null、性能优,后者用于确保左表完整性,如查所有用户及其订单时需用left join。

INNER JOIN 和 LEFT JOIN 的核心差异在于“要不要保留左表的全部数据”。选错会导致查不到预期结果,比如想看所有用户却漏掉没下单的,或者想补全信息却只拿到有交集的部分。
数据保留逻辑不同
INNER JOIN 只返回两表都满足连接条件的行,相当于取交集。LEFT JOIN 以左表为基准,左表每行必出现,右表无匹配时对应字段填 NULL。
- 左表有 100 行,右表只有 60 行能匹配:INNER JOIN 返回 60 行;LEFT JOIN 返回 100 行(其中 40 行的右表字段为 NULL)
- 如果连接字段在右表没有索引,LEFT JOIN 还要额外处理 NULL 填充,执行开销通常比 INNER JOIN 大
NULL 值是否允许出现
INNER JOIN 结果中,连接字段一定非空——因为不匹配的行直接被过滤掉了。LEFT JOIN 明确允许右表字段为 NULL,这是判断“是否存在关联数据”的直接依据。
- 写 WHERE 条件时要注意:LEFT JOIN 后对右表字段加非空限制(如 WHERE b.status IS NOT NULL),实际效果就接近 INNER JOIN
- 但反过来不行:INNER JOIN 无法还原出左表中缺失关联的那些原始记录
典型使用场景对比
选哪种不是看语法顺不顺,而是看业务要什么数据。
- 查“订单+商品名称”:用 INNER JOIN,只要已下单的商品信息,不要无效或未关联的数据
- 查“所有客户+他们的最新订单时间”:用 LEFT JOIN,确保客户列表完整,没下单的客户订单时间显示为 NULL
- 统计“每个部门人数及平均薪资”,但有些部门暂时没人:LEFT JOIN 部门表在左,员工表在右,才能让空部门也出现在结果里
性能与可读性提醒
INNER JOIN 一般更快,数据库更容易优化;LEFT JOIN 因要保全左表,执行计划更复杂,尤其当右表数据量大、匹配率低时。
- 避免在 LEFT JOIN 的 ON 条件里对右表字段做函数操作(如 ON a.id = UPPER(b.ref_id)),会大幅降低效率
- 如果只是想过滤右表数据,优先写在 ON 里;如果想整体筛结果,再用 WHERE(注意 NULL 对 WHERE 的影响)










