我知道不同的连接,但我想知道当我们运行这样的查询时使用了哪些连接:
select * from table1 t1, table2 t2
Run Code Online (Sandbox Code Playgroud)
例如,它是完全外连接还是自然连接?
另外,它在不同的数据库中是否具有独特的含义,或者都具有相同的含义?
更新:如果我们添加where子句怎么办?会一直这样吗inner join?
这是一个CROSS JOIN(笛卡尔积)。所以以下两个查询是相等的
SELECT * FROM table1, table2 -- implicit CROSS JOIN
SELECT * FROM table1 CROSS JOIN table1 -- explicit CROSS JOIN
Run Code Online (Sandbox Code Playgroud)
子句WHERE使一般CROSS JOIN变为INNER JOIN。AnINNER JOIN可以通过三种方式获得:
SELECT * FROM table1, table2 WHERE table1.id = table2.id -- implicit CROSS JOIN notation
SELECT * FROM table1 CROSS JOIN table2 WHERE table1.id = table2.id -- really unusual!: explicit CROSS JOIN notation
SELECT * FROM table1 INNER JOIN table2 ON (table1.id = table2.id) -- explicit INNER JOIN NOTATION
Run Code Online (Sandbox Code Playgroud)
子句中的逗号from本身相当于cross join几乎所有数据库中的逗号。所以:
from table1 t1, table2 t2
Run Code Online (Sandbox Code Playgroud)
在功能上等同于:
from table1 t1 cross join table2 t2
Run Code Online (Sandbox Code Playgroud)
它们并不完全等同,因为子句中的范围规则from略有不同。所以:
from table1 t1, table2 t2 join
table3 t3
on t1.x = t3.x
Run Code Online (Sandbox Code Playgroud)
生成错误,而等效查询 withcross join有效。
一般来说,WHERE子句中的条件总是会导致INNER JOIN. 然而,一些数据库扩展了语法以支持WHERE子句中的外连接。
我能想到一个例外,其中逗号不代表CROSS JOIN. Google 的 BigQuery 最初使用逗号表示UNION ALL. 然而,这仅在旧版 SQL 中存在,他们已在标准 SQL 中删除了这一点。
自 1900 年代以来,子句中的逗号FROM就不再流行了。它们是 SQL 中连接表的“原始”形式,但显式JOIN语法要好得多。
对我来说,他们还意味着几十年前学习过 SQL 但拒绝学习外连接的人,或者从古老的材料中学习过 SQL 的人——并且不知道 SQL 所做的很多其他事情。
| 归档时间: |
|
| 查看次数: |
8617 次 |
| 最近记录: |