我想知道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 JOINs(=*,*=),则第二种样式将按照广告中的说明工作。第一个最有可能不会这样做,并且在SQL Server 2005+中也已弃用
=*
*=
ANSI-92样式也很难实现。使用旧样式时,如果您错过条件,则可以轻松获得笛卡尔乘积(交叉连接)。您将收到ANSI-92的语法错误。
编辑:更多澄清
这不仅是 语法 :它是关于 语义正确的 查询的
编辑,2011年12月
SQL Server 逻辑 查询的处理顺序为FROM,ON,JOIN,WHERE …
因此,如果您将“隐式WHERE内部联接”和“显式来自外部联接”混合使用,则由于查询是模棱两可的,您极有可能无法获得预期的结果…