Group By 和Having总结
1.Group By 概述
“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组
所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理.
一般Group By是和聚合函数配合使用。Group By有一个原则,就是 select后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面(重要)
2.Having 和Where的区别
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
having子句被限制子已经在SELECT语句中定义的列和聚合表达式上
比如显示每个地区的总人口数和总面积:
SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region
先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算
显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。
SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region HAVING SUM(area)>1000000
在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。相反,HAVING子句可以让我们筛选成组后的各组数据.
ps:如果想根据sum后的字段进行排序可以在后面加上:order by sum(population) desc/asc
3.实例
示例1:
select 类别, sum(数量) as 数量之和 from A group by 类别
返回结果如下表,实际上就是分类汇总
示例2:
select 类别, sum(数量) AS 数量之和 from A group by 类别 order by sum(数量) desc
示例3:
select 类别, sum(数量) as 数量之和 from A group by 类别 having sum(数量) > 18
示例4:
select 类别, sum(数量) as 数量之和, 摘要 from A group by 类别 order by 类别 desc
执行此SQL语句报错,在select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。