gpt4 book ai didi

sql - CROSS JOIN 和一表多表 FROM 有什么区别?

转载 作者:行者123 更新时间:2023-12-05 01:16:27 25 4
gpt4 key购买 nike

有什么区别?

SELECT a.name, b.name
FROM a, b;

SELECT a.name, b.name
FROM a
CROSS JOIN b;

如果没有区别,那为什么两者都存在?

最佳答案

第一个带逗号的是上个世纪的老式。

第二个带有 CROSS JOIN 的是较新的 ANSI JOIN 语法。

这两个查询确实会给出相同的结果。

它们都将表“a”的每条记录链接到表“b”的每条记录。
所以如果表“a”有 10 行,表“b”有 100 行。
那么结果就是 10 * 100 = 1000 条记录。

但为什么第一个过时的样式仍然存在于某些 DBMS 中?
主要是出于向后兼容性的原因,这样一些较旧的 SQL 就不会突然中断。

现在大多数 SQL 专家都会对仍然使用那种过时的旧逗号语法的人皱眉。 (尽管对于有意的笛卡尔积通常是可以原谅的)

CROSS JOIN 是笛卡尔乘积 JOIN,它缺少定义 2 个表之间关系的 ON 子句。

在 ANSI JOIN 语法中还有 OUTER 连接:LEFT JOIN、RIGHT JOIN、FULL JOIN

还有普通的 JOIN,又名 INNER JOIN。

enter image description here

但是那些通常需要 ON 子句,而 CROSS JOIN 则不需要。

以及使用不同 JOIN 类型的查询示例。

SELECT *
FROM jars
JOIN apples ON apples.jar_id = jars.id
LEFT JOIN peaches ON peaches.jar_id = jars.id
CROSS JOIN bananas AS bnns
RIGHT JOIN crates ON crates.id = jars.crate_id
FULL JOIN nuts ON nuts.jar_id = jars.id
WHERE jars.name = 'FruityMix'

JOIN 语法的好处是链接条件和搜索条件是分开的。

虽然在旧的逗号样式中,这种差异很难被注意到。因此更容易忘记链接标准。

SELECT *
FROM crates, jars, apples, peaches, bananas, nuts
WHERE apples.jar_id = jars.id
AND jars.name = 'NuttyFruitBomb'
AND peaches.jar_id = jars.id(+)
AND crates.id(+) = jar.crate_id;

您是否注意到第一个查询有 1 个笛卡尔积连接,而第二个查询有 2 个?这就是为什么第二个相当疯狂。

关于sql - CROSS JOIN 和一表多表 FROM 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53583412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com