我想知道 SQL 在这些连接语句上执行的方式是否有什么不同:
SELECT * FROM a,b WHERE a.ID = b.ID
SELECT * FROM a JOIN b ON a.ID = b.ID
SELECT * FROM a JOIN b USING(ID)
有性能差异吗?还是算法差异?
或者它只是语法糖?
最佳答案
性能没有差异。
但是,第一种样式是 ANSI-89,在某些商店中可能会导致您的腿骨折。包括我的。第二种样式是 ANSI-92,更加清晰。
示例:
哪个是 JOIN,哪个是过滤器?
FROM T1,T2,T3....
WHERE T1.ID = T2.ID AND
T1.foo = 'bar' AND T2.fish = 42 AND
T1.ID = T3.ID
FROM T1
INNER JOIN T2 ON T1.ID = T2.ID
INNER JOIN T3 ON T1.ID = T3.ID
WHERE
T1.foo = 'bar' AND T2.fish = 42
如果您有 OUTER JOIN(=*
、*=
),那么第二种样式将按照广告中的方式工作。第一个很可能不会,并且在 SQL Server 2005+ 中也已弃用
ANSI-92 风格也更难使用。使用旧的样式,如果您错过了某个条件,您很容易得到笛卡尔积(交叉连接)。 ANSI-92 会出现语法错误。
编辑:更多说明
- 不使用“join the where”(隐式)的原因是外连接的结果不可靠。
- 如果您使用显式 OUTER JOIN + 隐式 INNER JOIN,您仍然会得到不可靠的结果并且用法不一致
这不仅仅是语法:它是关于语义正确的查询
编辑,2011 年 12 月
SQL Server logical query processing order是 FROM、ON、JOIN、WHERE...
因此,如果您混合使用“隐式 WHERE 内部联接”和“显式 FROM 外部联接”,您很可能不会获得预期结果,因为查询不明确...
关于SQL JOIN : is there a difference between USING, ON 或 WHERE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5654278/