1.Mysql中having和group by的用法
当sql语句中使用聚合函数,然后又需要对
聚合函数的记录集进行筛选过滤时,这个时候就需要用到having子句。如果是在聚合函数前过滤记录用where,在聚合函数后对组记录数据进行筛选就需要用到
having和group by组合。也可以换个角度理解,where是对真实表的数据进行过滤,而having是依赖于聚合函数生成的二维表数据进行过滤。
总结:where作用于表数据过滤,having作用于组数据过滤。where在分组和聚合之前选取数据,having在聚合和分组之后选取分组数据。
2、where、聚合函数、having在from后面的执行顺序
where > 聚合函数 > having
若需要对聚合函数对group by的结果进行过滤,只能使用having。Having语句通常与Group by语句联合使用,用来过滤Group by语句返回的结果集,having语句的存在弥补了where关键字不能与聚合函数联合使用的不足。
例如:查询平均成绩大于60分的同学的学号和平均成绩
select s_id, AVG(s_score) s_avg from Score group by s_id Having AVG(s_score) > 60;
如果将Having改成where 就会报错,因为where的执行顺序大于聚合函数。
例如:显示每个地区的总人口数和总面积.
SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region
先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。
显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。
//在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。相反,having子句可以让我们筛选成组后的各组数据
SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region HAVING SUM(area)>1000000
//先用group by 对email进行分组,在用having来过滤大于1的,这样查找出来的就是重复的记录了
select uid,email,count(*) as ct from `edm_user081217` GROUP BY email HAVING ct > 1
- 使用where和from注意事项
where后不能跟聚合函数,因为where执行顺序大于聚合函数。
where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即“在分组之前进行过滤数据”,条件中不能包含聚合函数,使用where条件显示特定的行。
having子句的作用是筛选满足条件的组,即“在分组之后过滤数据”,条件中经常包含聚合函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。