MySQL关键字的执行顺序:
从上面可以看出 WHERE 和 HAVING 都是做查询过滤。但是它们的效率以及执行顺序是不一样的!!!
聚合函数:
WHERE 条件是首先过滤数据,然后再使用聚合函数,但是如果需要在聚合函数或者是分组后的结果进行条件筛选则需要使用 HAVING 继续过滤。
1)WHERE 和 HAVING 的区别
WHERE:
WHERE 是一个约束声明,使用 WHERE 来约束来自数据库的数据;
WHERE 在结果返回之前起作用的;
WHERE 中不能使用聚合函数;
HAVING:
HAVING 是一个过滤声明;
在查询返回结果集之后,对查询结果进行的过滤操作;
在 HAVING 中可以使用聚合函数。
2)聚合函数 和 GROUP BY
聚合函数是指 SUM、COUNT、MAX、AVG 等对一组(多条)数据操作的函数,需要配合 GROUP BY 来使用。
SELECT SUM(人口),地区 FROM 北京 GROUP BY 地区;/* 计算北京每个分区的人数 */
3)WHERE 和 HAVING 的执行顺序
WHERE > GROUP BY > HAVING
WHERE 子句在聚合前先筛选记录,也就是说作用在 GROUP BY 和 HAVING 子句前,而 HAVING 子句在聚合后对组记录进行筛选。
4)WHERE 不能使用聚合函数,HAING 能够使用聚合函数
/* 筛选出北京西城、东城、海淀及各区学校数量 */ SELECT region,count(school) FROM T02_Beijing_school WHERE region IN('海淀','西城','东城')
GROUP BY region; /* 筛选出北京西城、东城、海淀三个区中学校数量超过10所的区及各区学校数量 */ SELECT region,count(school) FROM T02_Beijing_school WHERE region IN('海淀','西城','东城') GROUP BY region HAVING count(school) > 10;
注意:我们不能用 WHERE 来筛选学校数量超过10的区,因为表中不存在这样一条记录。而 HAVING 子句可以让我们筛选成组后的各组数据。
- 总结
① WHERE 条件后面不能跟聚合函数,因为 WHERE 执行顺序大于聚合函数,如果需要用聚合函数作为过滤条件则用 HAVING。
② HAVING 通常是对分组以后的数据进行筛选,所以一般都是使用 GROUP BY 或者聚合函数后使用,而 WHERE 是在分组前对数据进行过滤。