pep*_*dip 3 sql inner-join cross-join
有什么不同?
SELECT a.name, b.name
FROM a, b;
SELECT a.name, b.name
FROM a
CROSS JOIN b;
Run Code Online (Sandbox Code Playgroud)
如果没有区别那为什么两者都存在呢?
第一个带逗号的是上个世纪的旧样式。
第二个 CROSS JOIN 采用较新的 ANSI JOIN 语法。
这两个查询确实会给出相同的结果。
它们都将表“a”的每个记录与表“b”的每个记录链接起来。
因此,如果表“a”有 10 行,表“b”有 100 行。
那么结果将是 10 * 100 = 1000 条记录。
但为什么第一种过时的风格仍然存在于某些 DBMS 中呢?
主要是出于向后兼容性的原因,这样一些旧的 SQL 就不会突然崩溃。
如今,大多数 SQL 专家都会对那些仍然使用过时的旧逗号语法的人皱眉。(尽管故意的笛卡尔积通常可以被原谅)
ACROSS JOIN是笛卡尔积 JOIN,缺少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'
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
您是否注意到第一个查询有 1 个笛卡尔积连接,但第二个查询有 2 个?这就是为什么第二个相当疯狂。
| 归档时间: |
|
| 查看次数: |
2168 次 |
| 最近记录: |