小编典典

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

sql

有什么区别?

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

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

如果没有差异,那么为什么两者都存在?


阅读 264

收藏
2021-04-14

共1个答案

小编典典

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

第二个使用CROSS JOIN的是新的ANSI JOIN语法。

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

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

但是,为什么某些数据库管理系统中仍然存在第一种过时的样式?
主要是出于向后兼容性的原因,以便某些较旧的SQL不会突然中断。

如今,大多数SQL专家都会对仍然使用该过时的旧逗号语法的人不屑一顾。(尽管对于有意的笛卡尔积通常是可以原谅的)

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

在ANSI JOIN语法中,还有外部连接: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语法的好处是链接条件和搜索条件是分开的。

在旧的逗号样式中,这种区别将很难被注意到。因此,忘记链接条件会更容易。

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个?这就是为什么第二个很坚果。

2021-04-14