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的语法错误。 编辑:更多澄清 不使用\“ join where where \”(隐式)的原因是带有外部联接的模糊结果。 如果您使用显式的OUTER JOINs +隐式的INNER JOINs,您仍然会得到不可靠的结果+您在用法上存在不一致 这不只是语法,而是关于语义正确的查询 编辑,2011年12月 SQL Server逻辑查询的处理顺序为FROM,ON,JOIN,WHERE ... 因此,如果您将\“隐式WHERE内部联接\”和\“显式来自外部联接\”混合使用,则由于查询不明确,很可能不会获得预期的结果。     
区别在于可读性和可维护性。
SELECT * FROM a JOIN b ON a.ID = b.ID
在同一地方传达您的确切意图。 我不会明确地说,因为我还没有得到最后一个查询优化器的支持,但是我非常有信心您正在寻找性能上的微小差异(如果有的话)。     
当您使用ѭ5强制加入联接时,我会鄙视。在我看来,它看起来并不正确,是个肮脏的骇客。正确的ANSI连接是使用ON:
SELECT 
    p.Product,
    o.Order
FROM 
    Product p
INNER JOIN
    Order o
ON
    o.OrderID = p.OrderID
加入时,最好使用
ON
,并使用
WHERE
过滤结果。请记住,WHERE是您要使用的最后一件事,除了根据要过滤结果的位置进行分组和排序。因此,您不应该使用ѭ5联接表,因为它很难阅读。
SELECT 
    p.Product,
    o.Order
FROM 
    Product p
INNER JOIN
    Order o
ON
    o.OrderID = p.OrderID
WHERE
    o.Category = \'IT\'
最后,您(开发人员)将来可能不在身边,因此可读性和可维护性将帮助那些不得不接管您的代码的灵魂:)。 当我看到开发人员使用“ 5”联接表时,通常表明他们对T-SQL的了解不足。那是我个人的看法。     
看到这个 INNER JOIN ON与WHERE子句     
这是此SO问题的重复:显式与隐式SQL连接。通常,我认为隐式(版本)是错误的形式,不如显式(版本上)清晰。我还认为隐式折旧已在贬值,但不是100%。两者的执行计划是相同的。     

要回复问题请先登录注册