左连接或使用逗号(,)从多个表中选择

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)

Ric*_*iwi 6

首先,要完全等价,第一个查询应该已经写好了

   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。

笔记:

  • RIGHT JOIN 与 LEFT 相同,只是它以 TABLEB(右侧)而不是 A 开头。
  • RIGHT 和 LEFT JOINS 都是 OUTER 连接。单词 OUTER 是可选的,即它可以写成LEFT OUTER JOIN.
  • 第三种类型的 OUTER join 是 FULL OUTER join,但这里不讨论。