我不使用 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,因为它是外部的,所以它是可选的。