有什么区别?
SELECT a.name, b.name FROM a, b; SELECT a.name, b.name FROM a CROSS JOIN b;
如果没有差异,那么为什么两者都存在?
第一个带逗号的是上个世纪的旧样式。
第二个使用CROSS JOIN的是新的ANSI JOIN语法。
而这两个查询确实会给出相同的结果。
它们都将表“ a”的每个记录链接到表“ b”的每个记录。 因此,如果表“ a”具有10行,而表“ b”具有100行。 那么结果将是10 * 100 = 1000条记录。
但是,为什么某些数据库管理系统中仍然存在第一种过时的样式? 主要是出于向后兼容性的原因,以便某些较旧的SQL不会突然中断。
如今,大多数SQL专家都会对仍然使用该过时的旧逗号语法的人不屑一顾。(尽管对于有意的笛卡尔积通常是可以原谅的)
ACROSS JOIN是笛卡尔积JOIN,缺少ON用于定义2个表之间关系的子句。
CROSS JOIN
ON
在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个?这就是为什么第二个很坚果。