“从表1,表2中选择”意味着什么操作?

时间:2018-09-29 10:01:51

标签: sql

我知道不同的联接,但是我想知道当我们运行这样的查询时正在使用哪个联接:

select * from table1 t1, table2 t2

例如是完全外部联接还是自然联接?

它在不同的数据库中还是唯一的含义?


更新:如果添加where子句怎么办?会永远是inner join吗?

2 个答案:

答案 0 :(得分:4)

from子句中的逗号-几乎在所有数据库中都等效于cross join。所以:

from table1 t1, table2 t2

在功能上等同于:

from table1 t1 cross join table2 t2

它们不是完全相同的,因为from子句中的范围规则略有不同。所以:

from table1 t1, table2 t2 join
     table3 t3
     on t1.x = t3.x

生成错误,而使用cross join的等效查询有效。

通常,WHERE子句中的条件将始终导致INNER JOIN。但是,某些数据库已扩展了语法,以支持WHERE子句中的外部联接。

我可以想到一个例外,其中逗号不是 表示CROSS JOIN。 Google的BigQuery最初使用UNION ALL的逗号。但是,这仅在旧版SQL中,而他们在标准SQL中已将其删除。

自1900年代以来,FROM子句中的<逗号>已经过时。它们是SQL中联接表的“原始”形式,但是显式的JOIN语法要好得多。

对我来说,他们还意味着几十年前学习过SQL并且拒绝学习外部联接的人,或者是从古老的材料中学习过SQL的人-不了解SQL还有很多其他事情。

答案 1 :(得分:3)

demo: db<>fiddle

这是CROSS JOIN(笛卡尔积)。因此,以下两个查询都相等

SELECT * FROM table1, table2              -- implicit CROSS JOIN
SELECT * FROM table1 CROSS JOIN table1    -- explicit CROSS JOIN


关于更新

WHERE子句将常规CROSS JOIN变成INNER JOININNER 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

Further reading (wikipedia)