You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两表连接列过滤:两JOIN查询结果是否一致?LEFT JOIN会有差异吗?

两表连接时过滤连接列的结果对比:INNER JOIN vs LEFT JOIN

嘿,这个问题问得挺关键的,我来给你掰扯清楚~

一、INNER JOIN 场景:两个查询结果完全一致

先看你给出的两个INNER JOIN查询:
查询语句1:

SELECT * FROM tableA a JOIN tableB b ON a.id = b.id WHERE a.id = '5'

查询语句2:

SELECT * FROM tableA a JOIN tableb b ON a.id = b.id WHERE b.id = '5'

这两个查询会返回完全相同的结果集。原因很简单:INNER JOIN本身只保留两表中a.id = b.id匹配成功的行,在这个前提下,a.id和b.id的值必然相等。所以不管你在WHERE子句里过滤哪一边的id等于'5',最终得到的都是两表中id为5且互相匹配的那些行,结果毫无差别。

二、替换为LEFT JOIN 场景:结果差异明显

如果把JOIN换成LEFT JOIN,两个查询的结果就不一样了,具体区别如下:

查询1(过滤a.id='5'):

SELECT * FROM tableA a LEFT JOIN tableB b ON a.id = b.id WHERE a.id = '5'

LEFT JOIN的核心是保留左表(tableA)的所有匹配行,右表(tableB)无匹配时用NULL填充。这里的WHERE条件先锁定tableA中id为'5'的行,不管tableB里有没有对应的id='5'的记录:

  • 如果tableB存在匹配行,就返回两表的对应数据;
  • 如果tableB没有匹配行,tableB的所有列会显示为NULL,tableA的id='5'的行依然会被保留。

查询2(过滤b.id='5'):

SELECT * FROM tableA a LEFT JOIN tableb b ON a.id = b.id WHERE b.id = '5'

这里的WHERE条件b.id='5'会直接过滤掉LEFT JOIN中那些b表列全为NULL的行——因为NULL和任何值比较都不成立。所以这个查询的实际效果和INNER JOIN完全一致,只会返回两表中id='5'且互相匹配的行,相当于把LEFT JOIN“降级”成了INNER JOIN。

总结

  • INNER JOIN:两个过滤条件(a.id='5'/b.id='5')结果完全相同;
  • LEFT JOIN:两个查询结果差异显著,前者保留左表无匹配的行,后者仅保留两表匹配的行。

内容的提问来源于stack exchange,提问作者niksrb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:42:37