1.用的地方不一样
where可以用于select、update、delete和insert...into语句中。
having只能用于select语句中
2.执行的顺序不一样
where 子句在聚合之前起作用,不能放在 GROUP BY 子句之后;
where 子句指定的检索条件中,不能引用包含在聚合函数中的输入源中的列或者表达式
having 子句在聚合之后起作用,不能放在 GROUP BY 子句之前;
having 子句的检索条件中,如果引用了输入源的列或表达式,要求要么出现在聚合函数中,要么出现在 GROUP BY 子句中
3.子句有区别
where子句中的条件表达式having都可以跟,而having子句中的有些表达式where不可以跟;
having子句可以用集(/聚)合函数(sum、count、avg、max和min),而where子句不可以。
当然有些地方两者都可以用,比如:
select studentid, avg(score)
from studentScore
group by studentid
having left(studentid, 1)=’0’
select studentid, avg(score)
from studentScore
where left(studentid, 1)=’0’
group by studentid
两者之间没有哪个好用,哪个不好用,根据场景优化选择就好,解决问题才是关键