交叉联接和一个表中的多个表有什么不同? [英] 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;
如果没有区别,为什么两者都存在?
推荐答案
第一个逗号是上个世纪的旧样式。
第二个交叉联接使用较新的ANSI联接语法。这两个查询确实会产生相同的结果。
它们都将表"a"的每条记录与表"b"的每条记录链接起来。
因此,如果表"a"有10行,表"b"有100行。
那么结果将是10*100=1000条记录。
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屋!
查看全文