“select from table1, table2”意味着什么操作?

Ami*_*aki 3 sql postgresql

我知道不同的连接,但我想知道当我们运行这样的查询时使用了哪些连接:

select * from table1 t1, table2 t2
Run Code Online (Sandbox Code Playgroud)

例如,它是完全外连接还是自然连接?

另外,它在不同的数据库中是否具有独特的含义,或者都具有相同的含义?


更新:如果我们添加where子句怎么办?会一直这样吗inner join

S-M*_*Man 5

演示:db<>fiddle

这是一个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)

进一步阅读(维基百科)


Gor*_*off 5

子句中的逗号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 所做的很多其他事情。