mysql中on有时有筛选的功能

Posted 静静的白桦林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql中on有时有筛选的功能相关的知识,希望对你有一定的参考价值。

leetcode中行程和用户

SELECT
request_at as \'Day\', round(avg(Status!=\'completed\'), 2) as \'Cancellation Rate\'
FROM
trips t JOIN users u1 ON (t.client_id = u1.users_id AND u1.banned = \'No\')
JOIN users u2 ON (t.driver_id = u2.users_id AND u2.banned = \'No\')
WHERE
request_at BETWEEN \'2013-10-01\' AND \'2013-10-03\'
GROUP BY
request_at

作者:luanhz
链接:https://leetcode.cn/problems/trips-and-users/solution/ci-ti-bu-nan-wei-fu-za-er-by-luanz/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这两句中,on一方面有限定关联条件,一方面还有筛选的功能。

当inner join(即join)的时候,根本不需要on也可以,表1和表2会自动全部交叉罗列。

mysql中on和where的区别

后面一篇讲解的更加详细

mysql中left join设置条件在on和where的区别

on后面的条件时针对右边的表(关联表),对主表没什么作用。

 

MySql 连接查询中 on 和 where 的区别

大家可以先看MySQL:left join 避坑指南 

看过之后再接着看下面

在多表查询时,ON和where都表示筛选条件,on先执行,where后执行。

  1. on 后跟连接条件,然后再加的筛选条件只针对关联表(从表)

    执行顺序:从表按照条件筛选,然后再进行连接;即先筛选再连接

  2. where 则针对连接后产生的临时表进行筛选

    执行顺序:先连接再筛选

区别:
外连接时,on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。而where条件是在临时表生成好后,再对临时表进行过滤的条件。

所以,on 后跟关联表(从表)的过滤条件,where 后跟主表或临时表的筛选条件(左连接为例,主表的数据都会查询到,所以临时表中必定包含主表所有的字段,需要给主表加什么筛选条件,直接给临时表加效果相同)

注意:所有的连接条件都必须放在 on 后面,否则无论是 left 还是 right 连接都将不起作用(where 作用的是连接后的临时表,与连接已经无关)

因为 on 会首先过滤掉不符合条件的行,然后再进行其他运算,按理说 on 更快,允许的条件下,用 on 进行最大限度的筛选,后面 where 就避免重复筛选重复的数据,从而提升效率。还有一个重要特征:on 后的筛选条件筛选掉不符要求的字段后,对于主表中 null 结果的记录是没办法筛选掉的;而 where 则可以(关键就是 on 的筛选条件先筛选再连接,筛选时还不知道主表中的一些数据,自然没办法筛选)

参考: MySql 连接查询中 on 和 where 的区别 - "无问西东" - 博客园

以上是关于mysql中on有时有筛选的功能的主要内容,如果未能解决你的问题,请参考以下文章

mysql的left join使用on与where筛选的差异

mysql左连接

MySql 连接查询中 on 和 where 的区别

MySql 连接查询中 on 和 where 的区别

sql连接查询中on筛选与where筛选的区别

sql连接查询中on筛选与where筛选的区别