【问题标题】:What are the differences between these query JOIN types and are there any caveats?这些查询 JOIN 类型之间有什么区别,是否有任何警告?
【发布时间】:2012-01-15 12:03:26
【问题描述】:

我正在执行多个查询(来自我网站的不同部分)

有些是这样的:

SELECT field, field1 
FROM table1, table2 
WHERE table1.id = table2.id 
AND ....

有些是这样的:

SELECT field, field1 
FROM table1 
JOIN table2 
USING (id)  
WHERE ...
AND ....

有些是这样的:

SELECT field, field1 
FROM table1 
LEFT JOIN table2 
 ON (table1.id = table2.id)
WHERE ...
AND ....

这些查询中哪个更好、更慢/更快或更标准?

【问题讨论】:

标签: mysql join left-join inner-join


【解决方案1】:

前两个查询是等价的;在 MySql 世界中 using 关键字是(好吧,几乎 - 见 documentation 但 using 是 Sql2003 规范的一部分,并且 NULL 值存在一些差异)与说 field1.id = field2.id

相同

你可以很容易地把它们写成:

SELECT field1, field2
FROM table1
INNER JOIN table2 ON (table1.id = table2.id)

第三个查询是 LEFT JOIN。这将选择两个表中的所有匹配行,并且还将返回 table1 中在 table2 中没有匹配的所有行。对于这些行,table2 中的列将由 NULL 值表示。

我喜欢 Jeff Atwood 的 visual explanation

现在,谈谈更好或更坏。答案是,它取决于。他们是为了不同的事情。如果 table1 中的行多于 table2,则左连接将返回比内连接更多的行。但是查询的性能会受到很多因素的影响,比如表大小、列的类型、数据库同时在做什么。

您首先关心的应该是使用获取数据所需的查询。您可能真的想知道 table1 中的哪些行在 table2 中不匹配;在这种情况下,您将使用 LEFT JOIN。或者您可能只想要匹配的行 - INNER JOIN。

正如 Krister 所指出的,您可以使用 EXPLAIN 关键字来告诉您数据库将如何执行每种查询。这在试图找出查询缓慢的原因时非常有用,因为您可以看到数据库将所有时间都花在了哪里。

【讨论】:

    【解决方案2】:

    第三个例子,使用ON (field1=field2) 是更常见的,似乎是更普遍接受的标准。

    我不知道性能差异,您必须运行一些 EXPLAIN 查询才能看到 MySQL 最终对它们都做了什么。

    我知道第一个,WHERE 被用来连接它们,除了琐碎的查询之外,它的可读性要低得多。一旦查询中有一些复杂的条件,将“连接条件”与“选择条件”混为一谈会让人感到困惑。

    【讨论】:

      【解决方案3】:

      就个人而言,我更喜欢在我的查询中使用左连接,尽管在空记录或重复的情况下您可能会遇到问题,但这可以通过使用外部子句进行简单修改来解决。我的理解是加入需要更多的资源,但这有待讨论,可能基于个人喜好。

      只是我的 $.02。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多