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

What is the difference between CROSS JOIN and multiple tables in one FROM?

有什么区别?

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

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

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

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

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

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

他们都 link table "a" 的每条记录与 table "b".
的每条记录 因此,如果 table "a" 有 10 行,而 table "b" 有 100 行。
那么结果就是 10 * 100 = 1000 条记录。

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

现在大多数 SQL 专家都会对仍然使用过时的旧逗号语法的人皱眉。 (尽管它经常被有意的笛卡尔积所原谅)

A CROSS JOIN 是笛卡尔积 JOIN,它缺少定义 2 table 之间关系的 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'

JOIN 语法的优点在于 link 条件和搜索条件是分开的。

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

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 风格的角度来看,长期以来,使用 JOIN 一直是首选语法。