首页 > 编程笔记 > MySQL笔记 阅读:17

MySQL聚合函数的用法(非常详细,附带实例)

有时候并不需要返回表中的实际数据,而需要对数据进行总结。MySQL 提供了一些聚合函数,可以对获取的数据进行分析和报告。这些函数的功能包括计算数据表中记录行数的总数、计算某个字段列下数据的总和,以及计算表中某个字段下的最大值、最小值或者平均值。

这些聚合函数的名称和作用如下表所示:

表:MySQL 聚合函数
函数 作用
COUNT() 返回某列的行数
SUM() 返回某列值的和
AVG() 返回某列的平均值
MAX() 返回某列的最大值
MIN() 返回某列的最小值

接下来,将详细介绍各个函数的使用方法。

MySQL COUNT()函数

MySQL 中的 COUNT() 函数统计数据表中包含的记录行的总数,或者根据查询结果返回列中包含的数据行数。

COUNT() 函数的使用方法有两种:
【实例 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() 函数类似,不仅适用于数值类型,也可用于字符类型。

相关文章