# 语法二:having与where

# 类型

"Where"是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能用“聚合函数”

“Having”是一个过滤声明,所谓过滤是在查询数据库的结果返回之后进行过滤,记载结果返回之后起作用,并且having后面可以使用“聚合函数”

# 详情

having和where都是用来筛选的 having是筛选组二where是筛选记录

他们有各自的区别

  1. 当分组筛选的时候用having
  2. 其他情况用where

# 用having就一定要和group by连用, 用group by 不一定有having(他知识一个筛选条件用的)

# 例子

表结构:

部门编号 姓名 工资
1 aa 2000
2 bb 1200
1 cc 2100
2 dd 1800
1 ee 2100
3 ff 8000
2 gg 2200
3 hh 4500

查询有多个员工的工资不低于2000的部门编号(就是说如果一个部门的员工大于2000的人数有两个或两个以上就查询出来) select 部门编号,count() from 员工信息表 where 工资>=2000 group by 部门编号 having count() > 1 where 针对每一条记录筛选 而having对同一个部门的分组 count(*)>1计算多于两个的部门 查询结果为:

部门编号 员工数
1 3
3 2

# 总结

where和having的执行级别不同 在查询过程中聚合语句(sum, min, max, avg, count)要比having子句优先执行,而where子句在查询过程中执行有限级别优先于聚合语句(sum, min, max, avg, count)

having就是来弥补where在分组数据判断时的不足因为where执行优先级别要快于聚合语句