SQL条件放在on、where、having的区别和关系(简单明了)

在写SQL语句的时候,我们经常会用到各种表连接(left join, right join, inner join, full join),还有各种分组聚合函数(sum, min, max, avg, count),那么我们在写SQL的时候,对于不同的过滤条件具体是应该放在连接操作中的 ON 后面,还是分组操作的 having 后面,还是 where条件中呢。

在看了很多前辈的知识帖子之后,总结出的三种条件关键字的执行顺序如下:

简单的来讲,就是:

on > where > 聚合函数 > having

详细的来讲,就是:

表关联生生成临时表, on 条件生效(此时的临时表会因为left join或right join的特性而一定带有主表的记录,也就是主表的记录不会被 on 条件过滤掉) ---》 临时表生成完毕,where条件过滤临时表(where条件过滤时因为临时表已经生成完毕,因此不会再具有left join或right join的特性,也就是主表记录也会被where条件过滤掉) ---》 临时表过滤完毕,聚合函数进行运算 ---》 聚合函数运算完毕,having生效对运算完毕的临时表进行过滤 ---》最终的结果表

那么我们选择的标准也很简单:

1. 如果我们的过滤条件需要在聚合函数运算完毕之后才能确定,比如我们想要找出平均分数大于60分的班级,那么就必须等待分组聚合函数执行完毕才能进行过滤,那这个条件肯定就是放在having中了,因为where生效的时候聚合函数还没有进行运算呢。

2. 如果我们的过滤条件不需要依赖聚合函数,只是想要表关联之后的结果表中符合条件部分记录而没有要求保留主表的全部记录,那么我们就应该放在where条件中,当然,如果表关联是采用inner join的话,因为没有主从表的关系,所以放在 where 和 on 中是一样的。

3. 如果我们的过滤条件不需要依赖聚合函数,并且在表关联后需要保留主表的所有记录,不论有没有相匹配的从表记录,那么我们就应该将过滤条件放在 on 中。

————————————————
节选自:https://blog.csdn.net/qq_27607579/article/details/83787592

你可能感兴趣的:(sql,sql,join,on,where,having)