Yoc*_*mer 38 sql syntax performance expression join
我想知道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)
Run Code Online (Sandbox Code Playgroud)
有性能差异吗?还是算法差异?
或者只是语法糖?
gbn*_*gbn 48
性能没有区别.
然而,第一种风格是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
Run Code Online (Sandbox Code Playgroud)
如果你有OUTER JOINs(=*,*=)那么第二种风格将按照宣传的方式工作.第一个最有可能不会也不会在SQL Server 2005+中弃用
ANSI-92风格也很难用于bollix.如果您错过了一个条件,那么使用旧款式可以轻松获得笛卡尔积(交叉连接).ANSI-92会出现语法错误.
编辑:更多澄清
它不仅仅是语法:它是关于具有语义正确的查询
编辑,2011年12月
SQL Server 逻辑查询处理顺序是FROM,ON,JOIN,WHERE ...
因此,如果混合使用"隐式WHERE内连接"和"显式FROM外连接",则很可能无法获得预期结果,因为查询不明确...