bbn*_*bnn 14 mysql sql query-optimization left-join
我很好奇为什么我们需要使用,LEFT JOIN因为我们可以使用逗号来选择多个表.
LEFT JOIN使用逗号选择多个表之间有什么区别.
哪一个更快?
这是我的代码:
SELECT mw.*,
nvs.*
FROM mst_words mw
LEFT JOIN (SELECT no as nonvs,
owner,
owner_no,
vocab_no,
correct
FROM vocab_stats
WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no
WHERE (nvs.correct > 0 )
AND mw.level = 1
Run Code Online (Sandbox Code Playgroud)
...和:
SELECT *
FROM vocab_stats vs,
mst_words mw
WHERE mw.no = vs.vocab_no
AND vs.correct > 0
AND mw.level = 1
AND vs.owner = 1111
Run Code Online (Sandbox Code Playgroud)
首先,要完全等价,第一个查询应该已经写好了
SELECT mw.*,
nvs.*
FROM mst_words mw
LEFT JOIN (SELECT *
FROM vocab_stats
WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no
WHERE (nvs.correct > 0 )
AND mw.level = 1
Run Code Online (Sandbox Code Playgroud)
这样 mw.* 和 nvs.* 一起产生与第二个查询的单数 * 相同的集合。您编写的查询可以使用 INNER JOIN,因为它包含 nvs.correct 上的过滤器。
一般形式
TABLEA LEFT JOIN TABLEB ON <CONDITION>
Run Code Online (Sandbox Code Playgroud)
attempts根据条件查找TableB记录。如果失败,则保留 TABLEA 中的结果,并将 TableB 中的所有列设置为 NULL。相比之下
TABLEA INNER JOIN TABLEB ON <CONDITION>
Run Code Online (Sandbox Code Playgroud)
还attempts可以根据条件查找 TableB 记录。但是,当失败时,TableA 中的特定记录将从输出结果集中删除。
用于 CROSS JOIN 的 ANSI 标准在两个表之间生成笛卡尔积。
TABLEA CROSS JOIN TABLEB
-- # or in older syntax, simply using commas
TABLEA, TABLEB
Run Code Online (Sandbox Code Playgroud)
该语法的目的是将 TABLEA 中的每一行连接到 TABLEB 中的每一行。所以 A 中的 4 行和 B 中的 3 行产生 12 行输出。当与 WHERE 子句中的条件配对时,它有时会产生与 INNER JOIN 相同的行为,因为它们表达相同的东西(A 和 B 之间的条件 => 保持与否)。但是,在阅读使用 INNER JOIN 而不是逗号时的意图时,它会更加清晰。
在性能方面,大多数 DBMS 处理 LEFT 连接的速度比处理 INNER JOIN 快。逗号表示法可能会导致数据库系统误解意图并产生错误的查询计划 - 所以 SQL92 表示法的另一个优点。
为什么需要LEFT JOIN? 如果上面对 LEFT JOIN 的解释还不够(在 A 中保留记录而不在 B 中匹配),那么考虑到要实现相同的效果,您需要使用旧的逗号表示法在两个集合之间使用复杂的 UNION 来实现相同的效果. 但是如前所述,这不适用于您的示例,这实际上是隐藏在 LEFT JOIN 后面的 INNER JOIN。
笔记:
LEFT OUTER JOIN.| 归档时间: |
|
| 查看次数: |
63384 次 |
| 最近记录: |