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

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

如果你有外部联接( =**= ),那么第二个样式将按照广告的方式工作。 在SQL Server 2005+中,第一个可能不会,也不推荐使用

ANSI-92风格也很难折弯。 随着旧式的风格,如果你错过了一个条件,你可以很容易地得到一个笛卡尔积(交叉连接)。 ANSI-92会导致语法错误。

编辑:一些更多的澄清

  • 不使用“加入的地方”(隐含)的原因是外部连接的狡猾结果。
  • 如果你使用显式的外部连接+隐含的内部连接,你仍然会得到不好的结果+你在使用上有不一致

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

编辑,2011年12月

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

所以,如果你混合“隐式的内部连接”和“明确的外部连接”,你很可能不会得到预期的结果,因为查询是不明确的…

不同之处在于可读性和可维护性。 SELECT * FROM a JOIN b ON a.ID = b.ID传达您的确切意图,全部在相同的地方。

我不会说明确的,因为我没有深入了解最后一个查询优化器,但是我相当确信你正在寻找性能差异(如果有的话)。

我鄙视当你通过使用WHERE强制连接。 这只是对我来说不对,一个肮脏的黑客。 正确的ANSI连接是使用ON:

 SELECT p.Product, o.Order FROM Product p INNER JOIN Order o ON o.OrderID = p.OrderID 

连接时优先使用ON在筛选结果时使用WHERE 。 记住,WHERE是最后一件事情之一,除了你想要过滤你的结果分组和排序。 所以你不应该使用WHERE加入你的表格,因为它很难阅读。

 SELECT p.Product, o.Order FROM Product p INNER JOIN Order o ON o.OrderID = p.OrderID WHERE o.Category = 'IT' 

最后你(开发者)可能不在将来,所以可读性和可维护性将有助于倾注灵魂谁必须接管你的代码:)。

当我看到开发人员使用WHERE来加入他们的表时,通常表明他们不知道足够的T-SQL。 这是我个人的意见。

看到这个

INNER JOIN ON与WHERE子句

这是这个SO问题的重复: 显式与隐式SQL连接 。 一般来说,我认为隐式(其中版本)是不好的形式,不像明确的(在版本上)那样清晰。 我也认为隐含的是贬值,但不是100%。 两者的执行计划是相同的。