我知道不同的联接,但是我想知道当我们运行这样的查询时正在使用哪个联接:
select * from table1 t1, table2 t2
例如是完全外部联接还是自然联接?
它在不同的数据库中还是唯一的含义?
更新:如果添加where
子句怎么办?会永远是inner join
吗?
答案 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中已将其删除。
FROM
子句中的<逗号>已经过时。它们是SQL中联接表的“原始”形式,但是显式的JOIN
语法要好得多。
对我来说,他们还意味着几十年前学习过SQL并且拒绝学习外部联接的人,或者是从古老的材料中学习过SQL的人-不了解SQL还有很多其他事情。
答案 1 :(得分:3)
这是CROSS JOIN
(笛卡尔积)。因此,以下两个查询都相等
SELECT * FROM table1, table2 -- implicit CROSS JOIN
SELECT * FROM table1 CROSS JOIN table1 -- explicit CROSS JOIN
WHERE
子句将常规CROSS JOIN
变成INNER JOIN
。 INNER 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