MySQL中联表查询条件WHERE和ON的区别?

570 阅读3分钟

数据库在通过连接多表返回记录时,会先生成一张临时表,然后在将这张临时表返回。

  • 对于Left Join on和where条件的区别

    • on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。(Right Join同)
    • where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

    总之:LEFT JOIN联表查询ON可以理解为是在两张表中进行条件筛选(即,在生成临时中间表时候进行条件筛选),满足条件的则展示左右表拼接的数据记录,不满足条件的,则优先展示左表中的数据,右表中不满足条件的字段为NULL。而联表查询时候WHERE则可以理解为是在一张表上进行条件过滤(即,将生成的临时表看作一张表)

    对于Inner Join 两者并没有区别,因为Inner Join不像Left Join或Right Join一定要返回左表/右表的所有数据,而是根据指定关系进行表连接得到临时表,最后无论是对左表还是右表进行筛选,on … and …和 on … where …都会对临时表进行筛选

所以先后关系很明确,就是先on 建立临时表在where进行筛选

举例

给出student和grades两张表:

image.png

1. 进行left join判断

分析: on … and … 句式,是根据on后面的所有条件生成临时表,然后将这个临时表直接显示,条件在on中发现第三条行并不符合要求,但是由于left join要求一定要显示左表所有数据,所以左表中的两个表项(id和name)还是会显示,只是对应的其他项为null,显示结果如下:

image.png on… where… 句式,根据student.id= grades.p_id 对student 和grades表进行连接,得到临时表的数据是

image.png

然后 而在where中仅会对得到的临时表进行条件筛选,结果如下:

image.png

2.进行inner join判断

2.进行inner join判断

分析: on … and … 句式,在结果中由于inner join并不强制要求一定显示左表或右表的所有数据,仅仅是按照条件筛选,所以结果如下:

image-20220515090828097

on… where… 句式,,根据student.id= grades.p_id 对people 和test表进行连接,得到临时表的数据是

image-20220515090941812

然后在对临时表进行筛选,结果如下:

image-20220515091040864

可以发现在inner join中on…and…和on…where…两个产生的结果相同,但是产生临时表的过程还是有区别,至于查询速度的快慢,还要根据具体的分析,如果进行很多表的连接是尽可能的用on会更快,因为在产生临时表时就已经删除掉了一些不用的表项,而where会一直等到最后在筛选。

参考:blog.csdn.net/qq_39751320…