Mysql之谜:ON和WHERE中的条件

Mysql之谜:ON和WHERE中的条件,mysql,sql,join,left-join,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.v

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

注意:我发现这个问题是一个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
选择表1*
从表1向左连接表2
表2.1上的表id=表1.id
表2.val<5
选择表1*
从表1向左连接表2
表2.1上的表id=表1.id
其中表2.val<5

当条件不满足时,左侧外部联接将返回行(如果选择了表2中的空列),而WHERE将过滤掉这些行。

当条件不满足时,左侧外部联接将返回行(如果选择了表2中的空列),而WHERE会过滤掉它们。

只有在
table2.val<5
时,第一个查询才会连接。第二个过滤器甚至过滤表1行。如果使用内部联接,则应给出相同的结果。

如果
table2.val<5
,则第一次查询仅联接。第二个过滤器甚至过滤表1行。如果改用内部联接,则应给出相同的结果。

第一个查询将返回表1中的所有行。左联接总是返回左表中的所有行,而不管您在联接条件中写入了什么(但是,如果有多个匹配项,它可以复制行,但是由于您在名为
id
的字段上联接,因此它很可能是唯一的键,因此不会有重复项)


第二个查询将只返回表1中的那些行,其中表2中的对应行具有
val<5
。实际上,您可以在此处编写
内部联接
,而不是
左联接
,因为由于
where
子句,联接失败的行无论如何不会出现在结果集中。

第一个查询将返回表1中的所有行。左联接总是返回左表中的所有行,而不管您在联接条件中写入了什么(但是,如果有多个匹配项,它可以复制行,但是由于您在名为
id
的字段上联接,因此它很可能是唯一的键,因此不会有重复项)

第二个查询将只返回表1中的那些行,其中表2中的对应行具有
val<5
。实际上,您可以在此处编写
内部联接
,而不是
左联接
,因为由于
where
子句,联接失败的行无论如何都不会出现在结果集中。

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

SELECT     table1.*
FROM       table1 
LEFT JOIN  table2 ON (
             table2.table1_id = table1.id 
             AND table2.val < 5
)
选择表1*
来自表1
左键连接表2(
表2.1\u id=表1.id
表2.val<5
)
当条件
table2.table1_id=table1.id和table2.val<5
为真时,此示例执行两个表的左联接

SELECT     table1.*
FROM       table1
LEFT JOIN  table2 ON ( table2.table1_id = table1.id )
WHERE      (table2.val < 5)
选择表1*
来自表1
左连接表2打开(表2.table1_id=table1.id)
其中(表2.val<5)
本例在应用条件
table2.table1\u id=table1.id
时执行左连接,然后获取
table1左连接table2 ON(table2.table1\u id=table1.id)
的结果行,其中条件
table2.val<5
为true

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

SELECT     table1.*
FROM       table1 
LEFT JOIN  table2 ON (
             table2.table1_id = table1.id 
             AND table2.val < 5
)
选择表1*
来自表1
左键连接表2(
表2.1\u id=表1.id
表2.val<5
)
当条件
table2.table1_id=table1.id和table2.val<5
为真时,此示例执行两个表的左联接

SELECT     table1.*
FROM       table1
LEFT JOIN  table2 ON ( table2.table1_id = table1.id )
WHERE      (table2.val < 5)
选择表1*
来自表1
左连接表2打开(表2.table1_id=table1.id)
其中(表2.val<5)

此示例在应用条件
table2.table1\u id=table1.id
时执行左连接,然后获取
table1左连接table2 ON(table2.table1\u id=table1.id)
的结果行,其中条件
table2.val<5
为真

@MarkByers投影中不会有任何空行(要显示的列),但查询到的数据集将difference@MarkByers在查询1中,表2中会有空值。@Adrian,在查询2中,他使用
where
将查询转化为一个内部联接,正如Robin下面的回答。这就是结果集不同的原因。@MarkByers项目中不会有空行(要显示哪些列),但查询的数据集将difference@MarkByers在查询1中,表2中会有空值。@Adrian,在查询2中,他使用
where
将查询转化为一个内部联接,正如Robin下面的回答。这就是结果集不同的原因。