交叉联接和一个表中的多个表有什么不同? [英] What is the difference between CROSS JOIN and multiple tables in one FROM?

查看:18
本文介绍了交叉联接和一个表中的多个表有什么不同?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有什么不同?

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

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

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

推荐答案

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

第二个交叉联接使用较新的ANSI联接语法。

这两个查询确实会产生相同的结果。

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

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

现在大多数SQL专家都不喜欢仍然使用过时的逗号语法的人。(尽管这对于有意的笛卡尔产品通常是可以原谅的)

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

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

和普通联接,也称为内部联接。

但这些通常需要ON子句,而交叉联接不需要。

和使用不同联接类型的查询示例。

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'

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

而在旧的逗号样式中,这种差异将更难注意到。因此,更容易忘记链接条件。

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个?这就是为什么第二个相当疯狂的原因。

这篇关于交叉联接和一个表中的多个表有什么不同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆