我知道不同的联接,但我想知道在运行这样的查询时使用的是哪一个:
select * from table1 t1, table2 t2例如,它是完全外部连接还是自然连接?
另外,它在不同的数据库中有一个独特的含义,还是所有的数据库都有相同的含义?
UPDATE:如果我们添加where子句怎么办?会永远是inner join吗?
发布于 2018-09-29 11:32:01
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。谷歌的BigQuery最初在UNION ALL上使用逗号。但是,这只是在Legacy SQL中,他们已经删除了标准SQL中的内容。
自20世纪以来,FROM条款中的逗号已经过时。它们是SQL中连接表的“原始”形式,但是显式的JOIN语法要好得多。
对我来说,他们也是指几十年前学习SQL的人,拒绝学习外部连接的人,或者是从古代材料中学过SQL的人--他们不知道SQL所做的许多其他事情。
发布于 2018-09-29 10:13:42
这是一个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 NOTATIONhttps://stackoverflow.com/questions/52567264
复制相似问题