“select from table1, table2”是什么操作? [复制]
·
问题:“select from table1, table2”是什么操作? [复制]
我知道不同的连接,但我想知道当我们运行这样的查询时使用了哪些连接:
select * from table1 t1, table2 t2
例如,它是完全外连接还是自然连接?
它在不同的数据库中是否具有独特的含义或都具有相同的含义?
更新:如果我们添加where
子句会怎样?会一直是inner join
吗?
解答
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
子句中的外连接。
我能想到一个例外,逗号_not_ 表示CROSS JOIN
。 Google 的 BigQuery 最初使用逗号表示UNION ALL
。但是,这仅在 Legacy SQL 中,他们已经在 Standard SQL 中删除了它。
自 1900 年代以来,FROM
子句中的逗号已经过时。它们是 SQL 中连接表的“原始”形式,但显式的JOIN
语法要好得多。
对我来说,他们也意味着几十年前学习 SQL 并拒绝学习外连接的人,或者从古老的资料中学习 SQL 的人——并且不知道 SQL 所做的很多其他事情。
更多推荐
所有评论(0)