当前位置:  开发笔记 > 编程语言 > 正文

MySQL中表连接中"using"和"on"之间的区别是什么?

如何解决《MySQL中表连接中"using"和"on"之间的区别是什么?》经验,为你挑选了2个好方法。

这是

... T1 join T2 using(ID) where T2.VALUE=42 ...

同样的

... T1 join T2 on(T1.ID=T2.ID) where T2.VALUE=42 ...

对于所有类型的连接?

我的理解using(ID)是它只是简写on(T1.ID=T2.ID).这是真的?


现在换另一个问题:

以上是一样的

... T1 join T2 on(T1.ID=T2.ID and T2.VALUE=42) ...

我不认为这是真的,但为什么呢?如果在where子句中,on子句中的条件如何与join相互作用?



1> Cebjyre..:

我不使用USING语法,因为

    我的大多数联接都不适合它(不是匹配的字段名,和/或连接中的多个匹配)和

    在具有两个以上表的情况下,它并不是立即明显的

即假设3个表具有'id'和'id_2'列,确实如此

T1 JOIN T2 USING(id) JOIN T3 USING(id_2)

成为

T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2)

要么

T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2)

还是别的什么?

为特定的数据库版本找到这个是一个相当简单的练习,但我并不十分相信它在所有数据库中是一致的,并且我不是唯一一个必须维护我的代码的人(所以其他人也必须知道它相当于什么).

WHERE与ON的明显区别在于连接是否为外:

假设T1具有单个ID字段,一行包含值1,T2具有ID和VALUE字段(一行,ID = 1,VALUE = 6),那么我们得到:

SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42

不提供任何行,因为WHERE需要匹配,而

SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42)

将给出一行值

1, NULL, NULL

因为ON只需要匹配连接,由于外部连接是可选的.



2> Bill Karwin..:

USING子句是列的等连接的简写,假设两个表中的列都存在相同的名称:

A JOIN B USING (column1)

A JOIN B ON A.column1=B.column1

您还可以命名多个列,这使得复合键上的连接非常简单.以下连接应该是等效的:

A JOIN B USING (column1, column2)

A JOIN B ON A.column1=B.column1 AND A.column2=B.column2

请注意,USING ()需要括号,ON 而不需要括号(尽管可以使用parens,只是它们可以包含在任何其他上下文中的表达式周围).

此外,查询中没有其他表连接可能有一个该名称的列,否则查询是不明确的,你应该得到一个错误.

关于附加条件的问题,假设您使用INNER JOIN它,它应该在逻辑上从查询中提供相同的结果,但优化计划可能会受到影响,具体取决于RDBMS实现.也OUTER JOIN给出了不同的结果,如果你包括在与加盟的条件WHERE子句.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有