CROSS JOIN 和一个 FROM 中的多个表有什么区别?

pep*_*dip 3 sql inner-join cross-join

有什么不同?

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

SELECT a.name, b.name
FROM a
CROSS JOIN b;
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*rms 6

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

第二个 CROSS JOIN 采用较新的 ANSI JOIN 语法。

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

它们都将表“a”的每个记录与表“b”的每个记录链接起来。
因此,如果表“a”有 10 行,表“b”有 100 行。
那么结果将是 10 * 100 = 1000 条记录。

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

如今,大多数 SQL 专家都会对那些仍然使用过时的旧逗号语法的人皱眉。(尽管故意的笛卡尔积通常可以被原谅)

ACROSS JOIN是笛卡尔积 JOIN,缺少ON定义两个表之间关系的子句。

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

以及普通的 JOIN,又名 INNER JOIN。

在此输入图像描述

但这些通常需要该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'
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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