# 语法二:having与where
# 类型
"Where"是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能用“聚合函数”
“Having”是一个过滤声明,所谓过滤是在查询数据库的结果返回之后进行过滤,记载结果返回之后起作用,并且having后面可以使用“聚合函数”
# 详情
having和where都是用来筛选的 having是筛选组二where是筛选记录
他们有各自的区别
- 当分组筛选的时候用having
- 其他情况用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执行优先级别要快于聚合语句