问题:“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 所做的很多其他事情。

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐