mysql - MySQL 表连接中的 "using"和 "on"有什么区别?

标签 mysql sql join

这是吗

... 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 语法,因为

  1. 我的大多数连接都不适合它(不是正在匹配的同一个字段名,和/或连接中有多个匹配项)和
  2. 在包含两个以上表格的情况下,它所转换的内容并不是很明显

假设 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/

相关文章:

php 订阅者 sql 查询太大?

sql - 获取多对多关系的聚合 View

sql - 如何将具有单个值的用户定义列添加到 SQL 查询

sql - DB2 SQL - 可以在不对每行值使用 "or"的情况下查询值列表吗?

MySQL - 链接表问题(选择唯一行)

php - 更新一个表中的计数 ID 值并显示在另一表的列中

mysql - 如何将可重复的分区作为一个又一个的新分区?

php - 在 WHERE 子句中使用变量

php - 为内部联接查询中的一个字段选择不同的值

sql-server - 在 SQL Server 中强制部分连接顺序