4.2.4 使用聚合函数查询
有时候并不需要返回实际表中的数据,而只是对数据进行总结。MySQL提供一些查询功能,可以对获取的数据进行分析和报告。这些函数的功能有:计算数据表中记录行数的总数;计算某个字段列下数据的总和;计算表中某个字段列的最大值、最小值或者平均值。
关于聚合函数在“4.2.2常用函数(单行函数和聚合函数)”中已经简要介绍过,本节主要研究如何使用聚合函数查询。
常用的聚合函数有:计数count()、求平均值avg()、求最大值max()、求最小值min()、求和sum()。
1.count()函数
count()函数统计数据表中包含的记录行的总数,或者根据查询结果返回字段中包含的数据行数。其使用方法有两种:
count(*)计算表中总的行数,不管某字段有数值或者为空值。
count(字段名)计算指定字段列总的行数,计算时将忽略空值的行。
【例4.46】查询employees表中总的行数。
SQL语句及执行效果如下:
由查询结果可以看到,count(*)返回employees表中记录的总行数,不管其值是什么。返回的总数的名称为“zongShu”。
【例4.47】查询employees表中有奖金的员工数量。
SQL语句及执行效果如下:
由查询结果可以看到,employees表中20个员工中只有12个员工有奖金,员工奖金ebonus为空值null的记录没有被count(字段名)函数计算。
提示:两个例子中不同的数值,说明了两种方式在计算总数的时候对待nu l l值的方式不同。即指定字段的值为空nu l l的行被coun t(指定字段)函数忽略,但是如果不指定字段,而在coun t()函数中使用“*”,则所有记录都不忽略。
例4.38中介绍了count()函数与group by关键字一起使用,用来计算不同分组中的记录总数。
2.sum()函数
sum()是一个求总和的函数,返回指定字段值的总和。
【例4.48】在employees表中查询所有员工的总工资。
SQL语句及执行效果如下:
由查询结果可以看到,sum(esal)函数返回所有员工工资之和。
sum()可以与group by一起使用,用来计算每个分组的总和。
【例4.49】在employees表中查询每个部门的员工工资之和。
SQL语句及执行效果如下:
由查询结果可以看到,group by按照部门编号deptno进行分组,sum()函数计算每个分组中员工工资之和。
提示:sum()函数在计算时,忽略字段值为nu l l的行。
3.avg()函数
avg()函数通过计算返回的行数和每一行数据的和,求得指定列数据的平均值。
【例4.50】在employees表中,查询部门编号deptno=3的员工平均工资。
SQL语句及执行效果如下:
例4.50中,查询语句增加了一个where子句,并且添加了查询过滤条件,只查询deptno=3的记录中的esal。因此,通过avg()函数计算的结果只是指定部门编号中员工的平均工资,而不是所有员工的平均工资。
avg()可以与group by一起使用,用来计算每个分组的平均值。
【例4.51】在employees表中,查询每个部门的员工平均工资。
SQL语句及执行效果如下:
group by关键字根据deptno字段对记录进行分组,然后计算出每个分组的平均值,这种分组求平均值的方法非常有用,例如:求不同班级学生成绩的平均值,求不同部门工人的平均工资,求各地的年平均气温等。
提示:使用avg()函数时,其参数为要计算的字段名称,如果要得到多个字段的多个平均值,则需要在每一字段上使用avg()函数。
4.max()函数
max()返回指定字段中的最大值。
【例4.52】在employees表中查询最高奖金数额。
SQL语句及执行效果如下:
由结果可以看到,max()函数查询出了ebonus字段的最大值3 000。
max()也可以和group by关键字一起使用,求每个分组中的最大值。
【例4.53】在employees表中查询每个部门的最高奖金。
SQL语句及执行效果如下:
由结果可以看到,group by关键字根据deptno字段对记录进行分组,然后计算出每个分组中的最大值。
max()函数不仅适用于查找数值类型,也可应用于字符类型。
【例4.54】在employees表中查询员工姓名ename的最大值。
SQL语句及执行效果如下:
由结果可以看到,max()函数可以对字母进行大小判断,并返回最大的字符或者字符串。
提示:max()函数除了用来找出最大的列值或日期值之外,还可以返回任意列中的最大值,包括返回字符类型的最大值。在对字符类型数据进行比较时,按照字符的ASCII码值大小进行比较,从a~z,a的ASCII码最小,z的最大。在比较时,先比较第一个字符,如果相等,继续比较下一个字符,一直到两个字符不相等或者字符结束为止。例如:‘b’与‘t’比较时,‘t’为最大值;“bcd”与“bca”比较时,“bcd”为最大值。
5.min()函数
min()返回查询字段中的最小值。其用法与max()相同,在此不详细介绍。
实训:
①统计各部门领导(部长)的最高工资。
②查询所有办事员的总人数、最高工资、最低工资、工资总和、平均工资。