在对数据表中数据进行统计时,可能需要按照一定的类别分别进行统计,比如,分别统计student表中,gender字段值为na、nv和NULL的学生成绩grade之和
MysqL中,使用GROUP BY按某个字段,或者多个字段中的值,进行分组,字段中值相同的为一组
SELECT 字段名1,字段名2,……
FROM 表名
WHERE BY 字段名1,字段名2,……[HAVING 条件表达式];
参数说明
指定的字段名1、字段名2,是对查询结果分组的依据
HAVING关键字,指定条件表达式,对分组后的内容进行过滤
GROUP BY,一般和聚合函数一起使用,如果,查询的字段出现在GROUP BY后,却没有包含在聚合函数中,该字段显示的是,分组后的第一条记录的值,这样,可能会导致查询结果不符合我们的预期
一、单独使用GROUP BY分组
单独使用GROUP BY关键字,查询的是每个分组中的一条记录
查询student表中的记录,安装gender字段值进行分组
可以看出,返回了3条记录,分别是gender字段值为NULL、nv、na的记录,查询结果按照gender字段中不同的值进行了分类,然后,值显示每个分组中的一条记录,意义不大,一般情况下,GROUP BY都和聚合函数一起使用
二、GROUP BY和聚合函数,一起使用
GROUP BY和聚合函数,一起使用,可以统计出某个,或者某些字段在一个分组中的最大值、最小值、平均值
查询student表,按照gender字段值进行分组,计算出每个分组中各有多少名学生
可以看出,GROUP BY对gender字段进行了分组,然后,通过COUNT()函数统计出了每组的数量
三、GROUP BY和HAVING关键字,一起使用
HAVING关键字和WHERE关键字的作用相同,都是用于设置条件表达式,对查询结果进行过滤。
两者的区别,HAVING关键字后,可以跟聚合函数,而WHERE关键字不能,通常情况下,HAVING关键字,都是和GROUP BY一起使用,用于对分组后的结果进行过滤
查询student表,按照gender字段进行分组,查询出grade字段值之和小于300的分组
可以看出,只有gender字段值为NULL和nv的分组,grade字段值之和小于300
验证查询结果,对gender字段值为na的记录,grade字段值之和进行查询
可以看出,gender字段值为na,所有学生的grade字段之和为523