实际应用中,我们经常需要做一些数据统计,将表的全部数据划分为几组数据,每组数据统计出一个结果。这种功能可以使用分组函数(多行函数、集合函数)来实现。
在Mysql数据库中,通过GROUP BY子句将分组的依据加入到查询语句中,并可使用HAVING子句进一步限制查询结果。主要有COUNT/AVG/SUM/MAX/MIN等几个分组函数。
COUNT: COUNT函数用来计算表中的总记录条数。
AVG、SUM:AVG、SUM这两个函数用来统计列或表达式的平均值和和值。
MAX、MIN:这两个函数用来获取列或表达式的最大值、最小值,可以用来统计任何数据类型。
要把数据表划分为一个一个小组,需要使用GROUP BY子句,把需要进行分组的列放在这个子句后面,如果需要进一步限制分组后的结果,需要使用HAVING子句。使用语法如下
SELECT <*,column [alias],...> FROM table
[WHERE condition(s)]
[GROUP BY group_by_expression]
[HAVING group_condition ]
[ORDER BY column[ASC|DESC]];
单列分组: 即分组的依据是一个列
多列分组:即分组的依据是多个列
SELECT email,desiredState,max( createTime) ss from ali_edas_app GROUP BY email,desiredState;
使用HAVING子句用来对分组后的结果进一步限制。如将平均薪水不小于3000才被显示出来:
注意:
-
AVG、SUM这两个函数只能用来操作数字。
-
MAX、MIN、AVG、SUM等函数在计算时会自动忽略NULL值。
-
分组函数只能出现在SELECT列表、HAVING子句和ORDER BY子句中,不能出现在WHERE子句中。
-
如果要限制分组结果,只能使用HAVING子句。
-
使用分组函数时,出现在SELECT列表中的字段,如果只有组函数的字段,那么可以没有GROUP BY子句,如果还有其他的列或者表达式,则这些列和表达式必须出现在GROUP BY子句中(重要 group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面)
-
出现在GROUP BY 子句中的列,没有出现在SELECT列表中,语法上是可以的。