Mysql Puzzle:ON与WHERE的条件

时间:2011-09-28 17:42:19

标签: mysql sql join left-join

以下两个查询不会返回相同的结果。为什么?

注意:我发现这个问题是一个Mysql难题,我没有关于这个问题的更多数据?

SELECT table1.*
FROM table1 LEFT JOIN table2
ON table2.table1_id = table1.id 
AND table2.val < 5


SELECT table1.*
FROM table1 LEFT JOIN table2
ON table2.table1_id = table1.id 
WHERE table2.val < 5

4 个答案:

答案 0 :(得分:4)

如果不满足条件,左外连接将返回行(如果选择了table2,则返回table2中的空列),而WHERE会过滤掉它们。

答案 1 :(得分:3)

第一个查询将返回表1中的所有行。无论你在连接条件中写什么,LEFT JOIN总是返回左表中的所有行(如果有多个匹配,它可以复制行,但是因为你是加入一个名为id的字段,它很可能是一个唯一的密钥,因此不会有重复项。)

第二个查询只返回表1中的那些行其中 table2中的相应行有val < 5。实际上,您可以在此处编写INNER JOIN而不是LEFT JOIN,因为由于WHERE子句,连接失败的行无论如何都不会出现在结果集中。

答案 2 :(得分:1)

第一个查询仅在table2.val < 5加入。第二个过滤甚至table1行。如果您使用INNER JOIN,则应给出相同的结果。

答案 3 :(得分:0)

尝试将“编译器”视为查看括号 ...

SELECT     table1.*
FROM       table1 
LEFT JOIN  table2 ON (
             table2.table1_id = table1.id 
             AND table2.val < 5
)

当条件table2.table1_id = table1.id AND table2.val < 5为真时,此示例执行2个表的LEFT JOIN。

SELECT     table1.*
FROM       table1
LEFT JOIN  table2 ON ( table2.table1_id = table1.id )
WHERE      (table2.val < 5)

此示例在条件table2.table1_id = table1.id适用时执行LEFT JOIN,然后获取结果table1 LEFT JOIN table2 ON ( table2.table1_id = table1.id ) WHERE条件table2.val < 5为真的行