无WHERE子句的SQL Inner Join工作原理技术咨询
无WHERE子句时SQL隐式内连接的工作机制
嘿,我来帮你搞懂这个问题!你写的这条SQL用的是旧版的隐式内连接语法(用逗号分隔表),当没有指定WHERE子句来限定连接条件时,它本质上会生成两个表的笛卡尔积(Cartesian Product)——简单说就是把第一个表的每一行,都和第二个表的每一行进行配对组合,没有任何筛选。
结合你的具体例子来看:
你的tbl表有3行数据:
- letter: a, number: 1
- letter: b, number: 2
- letter: c, number: 3
你执行的SQL语句:
SELECT table1.letter, table2.letter, table1.number, table2.number FROM tbl AS table1, tbl AS table2;
因为没有连接条件,最终会返回3×3=9行结果,具体如下:
table1.letter | table2.letter | table1.number | table2.number --- | --- | --- | --- a | a | 1 | 1 a | b | 1 | 2 a | c | 1 | 3 b | a | 2 | 1 b | b | 2 | 2 b | c | 2 | 3 c | a | 3 | 1 c | b | 3 | 2 c | c | 3 | 3
补充说明
这种逗号分隔的隐式连接语法现在已经不推荐使用了,原因是:
- 显式的
INNER JOIN ... ON语法更清晰,能把连接条件和后续的过滤条件(WHERE)明确区分开 - 很容易不小心漏掉连接条件,导致意外生成笛卡尔积(大多数情况下这不是开发者想要的结果)
如果以后你需要指定连接条件,更规范的写法是这样:
SELECT table1.letter, table2.letter, table1.number, table2.number FROM tbl AS table1 INNER JOIN tbl AS table2 ON table1.letter = table2.letter; -- 这里指定连接条件
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

