这是吗
... 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) ...
我认为这不是真的,但为什么呢? on 子句中的条件与 join 以及 where 子句中的条件如何交互?
最佳答案
我不使用 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,由于是外部的,所以它是可选的。
关于mysql - MySQL 表连接中的 "using"和 "on"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/370268/