首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“从table1,table2中选择”意味着什么?

“从table1,table2中选择”意味着什么?
EN

Stack Overflow用户
提问于 2018-09-29 10:01:50
回答 2查看 7.4K关注 0票数 3

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

代码语言:javascript
复制
select * from table1 t1, table2 t2

例如,它是完全外部连接还是自然连接?

另外,它在不同的数据库中有一个独特的含义,还是所有的数据库都有相同的含义?

UPDATE:如果我们添加where子句怎么办?会永远是inner join吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-29 11:32:01

from子句中的逗号本身相当于几乎所有数据库中的cross join。所以:

代码语言:javascript
复制
from table1 t1, table2 t2

在功能上相当于:

代码语言:javascript
复制
from table1 t1 cross join table2 t2

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

代码语言:javascript
复制
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所做的许多其他事情。

票数 5
EN

Stack Overflow用户

发布于 2018-09-29 10:13:42

demo: db<>fiddle

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

代码语言:javascript
复制
SELECT * FROM table1, table2              -- implicit CROSS JOIN
SELECT * FROM table1 CROSS JOIN table1    -- explicit CROSS JOIN

关于更新

WHERE子句使一般CROSS JOIN变为INNER JOIN。可以通过三种方法获得INNER JOIN

代码语言:javascript
复制
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

进一步阅读(维基百科)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52567264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档