SQL INNER JOIN与LEFT JOIN区别_JOIN结果对比

5次阅读

inner join只返回两表连接字段完全相等的行,不保留左表无匹配行;left join保留左表所有行,右表无匹配则补NULL

SQL INNER JOIN与LEFT JOIN区别_JOIN结果对比

INNER JOIN 和 LEFT JOIN 最核心的区别在于:是否保留左表中“找不到匹配”的那些行。

INNER JOIN 只要交集,不匹配的全丢掉

它像一个严格的筛选器,只返回两个表中连接字段完全相等的行。只要某一行在另一张表里找不到对应数据,这一整行就彻底不会出现在结果里。

  • 结果行数 ≤ 左表行数,也 ≤ 右表行数
  • 结果中绝不会出现 NULL(来自右表字段)
  • 常用于“必须有关联才看”的场景,比如查“已付款的订单 + 对应用户信息”

LEFT JOIN 以左表为本,右表能配就配,配不上就填 NULL

它先确保左表每一行都出现在结果中,再尽可能从右表找匹配项。没找到?右表对应字段就用 NULL 补位。

  • 结果行数一定等于左表行数
  • 右表字段可能出现大量 NULL
  • 适合“主表数据不能少”的需求,比如查“所有用户 + 他们的订单”,哪怕有人没下单也要列出来

一个关键陷阱:WHERE 和 ON 的位置很关键

对 RIGHT 表字段加条件时,写在 ON 里和写在 WHERE 里效果完全不同:

  • ON u.id = o.user_id AND o.status = ‘paid’:只尝试把已支付的订单连上去,没订单或未支付的用户仍保留(右表字段为 NULL)
  • LEFT JOIN … ON u.id = o.user_id WHERE o.status = ‘paid’:先连完再过滤,NULL 值被 WHERE 排除,结果变成只显示有已支付订单的用户——实际等效于 INNER JOIN

RIGHT JOIN 基本可以不用记

它的行为是 LEFT JOIN 的镜像:以右表为基准,左表无匹配则补 NULL。但实践中几乎都通过调换表顺序 + 改用 LEFT JOIN 来实现,更直观也更通用。

text=ZqhQzanResources