MySQL聚合函数的用法(非常详细,附带实例)
有时候并不需要返回表中的实际数据,而需要对数据进行总结。MySQL 提供了一些聚合函数,可以对获取的数据进行分析和报告。这些函数的功能包括计算数据表中记录行数的总数、计算某个字段列下数据的总和,以及计算表中某个字段下的最大值、最小值或者平均值。
这些聚合函数的名称和作用如下表所示:
接下来,将详细介绍各个函数的使用方法。
COUNT() 函数的使用方法有两种:
【实例 1】查询表 customers 中的总行数,SQL 语句如下:
【实例 2】查询表 customers 中有电子邮箱的顾客的总数,SQL 语句如下:
【实例 1】和【实例 2】中不同的数值说明了两种方式在计算总数的时候对待 NULL 的不同方式,指定列的值为空的行被 COUNT() 函数忽略;如果不指定列,而在 COUNT() 函数中使用星号(*),则所有记录都不会被忽略。
前面介绍分组查询的时候,介绍了如何用 COUNT() 函数与 GROUP BY 关键字一起来计算不同分组中的记录总数。
下面再来看一个例子:
【实例 3】在表 orderitems 中,使用 COUNT() 函数统计不同订单号中订购的水果种类,SQL 语句如下:
【实例 2】在表 orderitems 中,查询 30005 号订单一共购买的水果的总量,SQL 语句如下:
SUM() 可以与 GROUP BY 一起使用,来计算每个分组的总和。
【实例 3】在表 orderitems 中,使用 SUM() 函数统计不同订单号中订购的水果的总量,SQL 语句如下:
【实例 4】在表 fruits 中,查询 s_id=103 的水果供应商的水果价格平均值,SQL 语句如下:
AVG() 可以与 GROUP BY 一起使用,来计算每个分组的平均值。
【实例 5】在表 fruits 中,查询每一个水果供应商的水果价格的平均值,SQL 语句如下:
在使用 AVG() 函数时,其参数为要计算平均值的列名称。如果要得到多个列的平均值,则需要在每一列上使用 AVG() 函数。
【实例 6】在表 fruits 中,查找市场上水果价格的最高值,SQL 语句如下:
MAX() 也可以和 GROUP BY 关键字一起使用,来计算每个分组中的最大值。
【实例 7】在表 fruits 中,查找不同水果供应商提供的水果的最高价格,SQL 语句如下:
MAX() 函数不仅适用于数值类型,也可用于字符类型。
【实例 8】在表 fruits 中查找 f_name 的最大值,SQL 语句如下:
提示,MAX() 函数除了用来找出最大的列值或日期值之外,还可以返回任意列中的最大值,包括返回字符类型的最大值。在对字符类型数据进行比较时,按照字符的 ASCII 码值大小进行比较,对于 a~z,a 的 ASCII 码值最小,z 的最大。在比较时,先比较第一个字母,如果相等,继续比较下一个字符,直到两个字符不相等或者字符结束为止。例如,“b”与“t”比较时,“t”为最大值;“bcd”与“bca”比较时,“bcd”为最大值。
【实例 9】在表 fruits 中,查找市场上水果价格的最低值,SQL 语句如下:
MIN() 也可以和 GROUP BY 关键字一起使用,用来计算每个分组中的最小值。
【实例 10】在表 fruits 中,查找不同水果供应商提供的水果的最低价格,SQL 语句如下:
这些聚合函数的名称和作用如下表所示:
函数 | 作用 |
---|---|
COUNT() | 返回某列的行数 |
SUM() | 返回某列值的和 |
AVG() | 返回某列的平均值 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
接下来,将详细介绍各个函数的使用方法。
MySQL COUNT()函数
MySQL 中的 COUNT() 函数统计数据表中包含的记录行的总数,或者根据查询结果返回列中包含的数据行数。COUNT() 函数的使用方法有两种:
- COUNT(*):计算表中的总行数,而不管某列是否有数值或者是否为 NULL;
- COUNT(字段名):计算指定列下的总行数,计算时将忽略 NULL 的行。
【实例 1】查询表 customers 中的总行数,SQL 语句如下:
mysql> SELECT COUNT(*) AS cust_num FROM customers; +----------+ | cust_num | +----------+ | 4 | +----------+由查询结果可以看到,COUNT(*) 返回表 customers 中记录的总行数,而不管其值是什么,返回的总数的名称为 cust_num。
【实例 2】查询表 customers 中有电子邮箱的顾客的总数,SQL 语句如下:
mysql> SELECT COUNT(c_email) AS email_num FROM customers; +-----------+ | email_num | +-----------+ | 3 | +-----------+由查询结果可以看到,只有 3 个顾客有 email,email 为 NULL 的记录没有被 COUNT() 函数计算。
【实例 1】和【实例 2】中不同的数值说明了两种方式在计算总数的时候对待 NULL 的不同方式,指定列的值为空的行被 COUNT() 函数忽略;如果不指定列,而在 COUNT() 函数中使用星号(*),则所有记录都不会被忽略。
前面介绍分组查询的时候,介绍了如何用 COUNT() 函数与 GROUP BY 关键字一起来计算不同分组中的记录总数。
下面再来看一个例子:
【实例 3】在表 orderitems 中,使用 COUNT() 函数统计不同订单号中订购的水果种类,SQL 语句如下:
mysql> SELECT o_num, COUNT(f_id) FROM orderitems GROUP BY o_num; +-------+-------------+ | o_num | COUNT(f_id) | +-------+-------------+ | 30001 | 4 | | 30002 | 1 | | 30003 | 1 | | 30004 | 1 | | 30005 | 4 | +-------+-------------+从查询结果中可以看到,GROUP BY 关键字先按照订单号进行分组,然后计算每个分组中的总记录数。
MySQL SUM()函数
SUM() 是一个求和函数,返回指定列值的总和。【实例 2】在表 orderitems 中,查询 30005 号订单一共购买的水果的总量,SQL 语句如下:
mysql>SELECT SUM(quantity) AS items_total FROM orderitems WHERE o_num = 30005; +-------------+ | items_total | +-------------+ | 30 | +-------------+SUM(quantity) 函数返回订单中所有水果数量之和,WHERE 子句指定查询的订单号为 30005。
SUM() 可以与 GROUP BY 一起使用,来计算每个分组的总和。
【实例 3】在表 orderitems 中,使用 SUM() 函数统计不同订单号中订购的水果的总量,SQL 语句如下:
mysql> SELECT o_num, SUM(quantity) AS items_total FROM orderitems GROUP BY o_num; +-------+-------------+ | o_num | items_total | +-------+-------------+ | 30001 | 33 | | 30002 | 2 | | 30003 | 100 | | 30004 | 50 | | 30005 | 30 | +-------+-------------+由查询结果可以看到,GROUP BY 按照订单号 o_num 进行分组,SUM() 函数计算每个分组中订购的水果的总量。
提示,SUM() 函数在计算时会忽略列值为 NULL 的行。
MySQL AVG()函数
AVG() 函数通过计算返回的行数和每一行数据的和,求得指定列数据的平均值。【实例 4】在表 fruits 中,查询 s_id=103 的水果供应商的水果价格平均值,SQL 语句如下:
mysql> SELECT AVG(f_price) AS avg_price FROM fruits WHERE s_id = 103; +-----------+ | avg_price | +-----------+ | 5.700000 | +-----------+本例中,查询语句增加了一个 WHERE 子句,并且添加了查询过滤条件,只查询 s_id = 103 的记录中的 f_price。因此,通过 AVG() 函数计算的结果只是指定的供应商水果的价格平均值,而不是市场上所有水果价格的平均值。
AVG() 可以与 GROUP BY 一起使用,来计算每个分组的平均值。
【实例 5】在表 fruits 中,查询每一个水果供应商的水果价格的平均值,SQL 语句如下:
mysql> SELECT s_id,AVG(f_price) AS avg_price FROM fruits GROUP BY s_id; +------+-----------+ | s_id | avg_price | +------+-----------+ | 101 | 6.200000 | | 103 | 5.700000 | | 104 | 7.000000 | | 107 | 3.600000 | | 102 | 8.933333 | | 105 | 7.466667 | | 106 | 15.700000 | +------+-----------+GROUP BY 关键字根据 s_id 字段对记录进行分组,然后计算出每个分组的平均值。这种分组求平均值的方法非常有用,例如,求不同班级学生成绩的平均值、求不同部门员工的平均工资、求各地的年平均气温等。
在使用 AVG() 函数时,其参数为要计算平均值的列名称。如果要得到多个列的平均值,则需要在每一列上使用 AVG() 函数。
MySQL MAX()函数
MAX() 返回指定列中的最大值。【实例 6】在表 fruits 中,查找市场上水果价格的最高值,SQL 语句如下:
mysql>SELECT MAX(f_price) AS max_price FROM fruits; +------------+ | max_price | +------------+ | 15.70 | +------------+由结果可以看到,MAX() 函数查询出 f_price 字段的最大值为 15.70。
MAX() 也可以和 GROUP BY 关键字一起使用,来计算每个分组中的最大值。
【实例 7】在表 fruits 中,查找不同水果供应商提供的水果的最高价格,SQL 语句如下:
mysql> SELECT s_id, MAX(f_price) AS max_price FROM fruits GROUP BY s_id; +------+-----------+ | s_id | max_price | +------+-----------+ | 101 | 10.20 | | 103 | 9.20 | | 104 | 7.60 | | 107 | 3.60 | | 102 | 11.20 | | 105 | 11.60 | | 106 | 15.70 | +------+-----------+由结果可以看到,GROUP BY 关键字根据 s_id 字段对记录进行分组,然后计算出每个分组中的最大值。
MAX() 函数不仅适用于数值类型,也可用于字符类型。
【实例 8】在表 fruits 中查找 f_name 的最大值,SQL 语句如下:
mysql> SELECT MAX(f_name) FROM fruits; +-------------+ | MAX(f_name) | +-------------+ | xxxx | +-------------+由结果可以看到,MAX() 函数可以对字母进行大小判断,并返回最大的字符或者字符串。
提示,MAX() 函数除了用来找出最大的列值或日期值之外,还可以返回任意列中的最大值,包括返回字符类型的最大值。在对字符类型数据进行比较时,按照字符的 ASCII 码值大小进行比较,对于 a~z,a 的 ASCII 码值最小,z 的最大。在比较时,先比较第一个字母,如果相等,继续比较下一个字符,直到两个字符不相等或者字符结束为止。例如,“b”与“t”比较时,“t”为最大值;“bcd”与“bca”比较时,“bcd”为最大值。
MySQL MIN()函数
MIN() 返回指定列中的最小值。【实例 9】在表 fruits 中,查找市场上水果价格的最低值,SQL 语句如下:
mysql>SELECT MIN(f_price) AS min_price FROM fruits; +-----------+ | min_price | +-----------+ | 2.20 | +-----------+由结果可以看到,MIN() 函数查询出 f_price 字段的最小值为 2.20。
MIN() 也可以和 GROUP BY 关键字一起使用,用来计算每个分组中的最小值。
【实例 10】在表 fruits 中,查找不同水果供应商提供的水果的最低价格,SQL 语句如下:
mysql> SELECT s_id, MIN(f_price) AS min_price FROM fruits GROUP BY s_id; +------+-----------+ | s_id | min_price | +------+-----------+ | 101 | 3.20 | | 103 | 2.20 | | 104 | 6.40 | | 107 | 3.60 | | 102 | 5.30 | | 105 | 2.60 | | 106 | 15.70 | +------+-----------+由结果可以看到,GROUP BY 关键字根据 s_id 字段对记录进行分组,然后计算出每个分组中的最小值。MIN() 函数与 MAX() 函数类似,不仅适用于数值类型,也可用于字符类型。