这些查询JOIN类型之间有什么区别,有什么警告吗?

时间:2011-12-07 23:59:03

标签: mysql join left-join inner-join

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

有些是这样的:

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 ....

哪些查询更好,或更慢/更快或更标准?

3 个答案:

答案 0 :(得分:19)

前两个查询是等效的;在MySql世界中,using关键字是(好吧,几乎 - 参见documentation但是使用是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关键字告诉您数据库将如何执行每种查询。这在尝试找出查询速度慢的原因时非常有用,因为您可以看到数据库花费的所有时间。

答案 1 :(得分:0)

个人而言,我更喜欢在我的查询中使用左连接,尽管在空记录或重复的情况下可能遇到问题,但可以通过使用外部子句的简单修改来解决。我的理解是,加入是一个更加资源密集的问题,但这可以争论,可能基于个人偏好。

只是我的$ .02。

答案 2 :(得分:0)

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

我不知道性能差异,你必须运行一些EXPLAIN查询才能看到MySQL实际上最终会对它们做些什么。

我确实知道第一个,WHERE被用来加入它们,除了琐碎的查询之外,其他任何东西的可读性都差得多。一旦你在一个查询中遇到了一些复杂的条件,那么让“加入条件”与“选择条件”混淆是令人困惑的。