日常在使用sql中,关联两张表的时候经常会出现应该把条件放在 on 后面还是 where 后面的困惑,接下来我们就来看下两者的区别及正确使用情况。
( 一 )区别
数据库在通过关联( left join / right join / full join / inner join )两张表或多张表的时候,都会生成一张中间的临时表,然后再对中间表进行条件筛选和过滤,最后将记录返回给用户。
在使用 left join 时,条件在 on 和 where 后面的区别如下:
- on 后面条件是在生成临时表时使用的条件,无论 on 后面的条件是否为真,都会返回左边表中的记录。
- where 后面条件是在临时表生成后,对临时表进行条件过滤,条件不为真的会全部过滤掉。
以上区别的关键原因是 left join / right join / full join / inner join 的特殊性,不管是 on 后面的条件是否为真都会返回 left 或 right 表中的记录,full join 则具有left join 和 right join 的特性的并集,而 inner join 没有这个特殊性,条件放在 on 和 where 后面,返回的结果集是相同的。
( 二 )示例
原数据:
user_info表,记录用户id和用户名称