SQL | JOIN USING与JOIN ON的区别

11

嗯,这可能只是一个关于"风格"的问题,但我确实想了解一下 JOIN t ON <equal condition>JOIN t USING(<list of columns>) 之间的区别。

当然,我假设这两个表具有相同的列,名称和数据类型。在这种情况下:

  • 这两种语法之间是否有任何真正的区别?
  • USING 子句是否被所有(或至少是最重要的)数据库管理系统支持?

我已经阅读了 w3resource.com 上关于 NATURAL JOIN 的内容以及关于 NATURAL JOIN vs ON 子句的 问题,但它们似乎没有回答前面的两个问题... 此外,无论是 w3resource.com 的 EQUI JOIN 部分还是 INNER JOIN 部分都没有提到 USING "技巧"。


SQL Server不支持USING。此外,在连接多个表时,USING可能会变得混乱(我认为至少在Ingres中,它将列与所有其他表中具有相同名称的列连接起来,这并不总是您想要的;ON在这方面更明确和更灵活)。 - aucuparia
1个回答

18

大多数情况下,这是一个风格问题(并且并非所有数据库都支持using)。但有一个小差别。如果你这样做:

select *
from t1 join
     t2
     on t1.col1 = t2.col1

然后结果集中出现了两次col1。如果您执行以下操作:

select *
from t1 join
     t2
     using (col1)

然后 col1 只出现一次。

using 的一个优点是它鼓励外键与主键具有相同的名称。当这是可能的时候(并不总是可能的),我认为这是一种良好的设计,使数据库更容易使用。

在长链的 join 中,using 可能会发生意外情况,因为它没有指定键从哪里来。但是,在设计良好的数据库中,我不认为这是个问题。

另一方面,natural join 是可怕的,不应该被使用。它们不指定要连接的列。它们甚至不尊重外键关系。不清楚正在比较的列只会邀请代码中的错误,这些错误可能非常难以找到。


实际上,我相信在Oracle中,你的第二个查询会崩溃。 - Dan Bracuk
2
@DanBracuk……我不确定你为什么这么说。我已经在Oracle中使用了“using”(http://rextester.com/TQKP83377)。我的回答有什么问题吗? - Gordon Linoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接