SQL JOIN:USING,ON或WHERE有区别吗?

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会出现语法错误.

编辑:更多澄清

  • 不使用"join the where"(隐式)的原因是外连接的狡猾结果.
  • 如果你使用显式OUTER JOIN +隐式INNER JOIN,你仍会得到狡猾的结果+你的使用不一致

它不仅仅是语法:它是关于具有语义正确的查询

编辑,2011年12月

SQL Server 逻辑查询处理顺序是FROM,ON,JOIN,WHERE ...

因此,如果混合使用"隐式WHERE内连接"和"显式FROM外连接",则很可能无法获得预期结果,因为查询不明确...

  • @Yochai Timmer 92> 89最后我查了一下. (2认同)