两表连接列过滤:两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
相关产品推荐
相关产品推荐

