小编典典

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

sql

我想知道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)

有性能差异吗?还是算法上的差异?

还是仅仅是语法糖?


阅读 497

收藏
2021-05-05

共1个答案

小编典典

性能没有差异。

但是,第一种样式是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的语法错误。

编辑:更多澄清

  • 不使用“在何处联接”(隐式)的原因是外部联接的结果令人迷惑。
  • 如果您使用显式的OUTER JOINs +隐式的INNER JOINs,您仍然会得到不可靠的结果+您的用法不一致

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

编辑,2011年12月

SQL Server 逻辑 查询的处理顺序为FROM,ON,JOIN,WHERE …

因此,如果您将“隐式WHERE内部联接”和“显式来自外部联接”混合使用,则由于查询是模棱两可的,您极有可能无法获得预期的结果…

2021-05-05