![MySQL 8从入门到精通(视频教学版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/737/26542737/b_26542737.jpg)
7.3 使用集合函数查询
有时候并不需要返回实际表中的数据,而只是对数据进行总结。MySQL提供一些查询功能,可以对获取的数据进行分析和报告。这些函数的功能有:计算数据表中记录行数的总数、计算某个字段列下数据的总和,以及计算表中某个字段下的最大值、最小值或者平均值。本节将介绍这些函数以及如何使用它们。这些聚合函数的名称和作用如表7.2所示。
表7.2 MySQL聚合函数
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/1122.jpg?sign=1738847000-iT96eQaQR8zVlAXhyBqIiT19TmDI2t5J-0-337a00d7015bed05d7cef80586065990)
接下来,将详细介绍各个函数的使用方法。
7.3.1 COUNT()函数
COUNT()函数统计数据表中包含的记录行的总数,或者根据查询结果返回列中包含的数据行数。其使用方法有两种:
● COUNT(*)计算表中总的行数,不管某列是否有数值或者为空值。
● COUNT(字段名)计算指定列下总的行数,计算时将忽略空值的行。
【例7.34】查询customers表中总的行数,SQL语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/247.jpg?sign=1738847000-G0IQkXfAkMxM2QRGi46HOD2KTzsSqfrJ-0-2a0af995d97349e0c69da030214c0055)
由查询结果可以看到,COUNT(*)返回customers表中记录的总行数,不管其值是什么,返回的总数的名称为cust_num。
【例7.35】查询customers表中有电子邮箱的顾客的总数,SQL语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/248.jpg?sign=1738847000-mpWWhL5C8L9fWmww6aA43GdGaQB2ELu2-0-5d6503bd431e332507e0dfd1c9b7e37a)
由查询结果可以看到,表中5个customer只有3个有email,customer的email为空值NULL的记录没有被COUNT()函数计算。
提示
两个例子中不同的数值说明了两种方式在计算总数的时候对待NULL值的方式不同:指定列的值为空的行被COUNT()函数忽略;如果不指定列,而在COUNT()函数中使用星号“*”,则所有记录都不忽略。
前面介绍分组查询的时候,介绍了如何用COUNT()函数与GROUP BY关键字一起来计算不同分组中的记录总数。
【例7.36】在orderitems表中,使用COUNT()函数统计不同订单号中订购的水果种类,SQL语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/249.jpg?sign=1738847000-stEwtNwQJQDBjEAfkmRTfXpkqmv8Sncv-0-f63634223e8b371a4a72be9a8065ec54)
从查询结果可以看到,GROUP BY关键字先按照订单号进行分组,然后计算每个分组中的总记录数。
7.3.2 SUM()函数
SUM()是一个求总和的函数,返回指定列值的总和。
【例7.37】在orderitems表中查询30005号订单一共购买的水果总量,SQL语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/250.jpg?sign=1738847000-9oKtD3J5SNA0osXoFo1mmizWfCxbrdUp-0-e92d73291d53c43278fe8cd889555d6f)
由查询结果可以看到,SUM(quantity)函数返回订单中所有水果数量之和,WHERE子句指定查询的订单号为30005。
SUM()可以与GROUP BY一起使用,来计算每个分组的总和。
【例7.38】在orderitems表中,使用SUM()函数统计不同订单号中订购的水果总量,SQL语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/251.jpg?sign=1738847000-9sWuRUFGVqovHViuW4l721fxnd3aNgEx-0-ad6371fc992158ecdce6d1db5ce03a6f)
由查询结果可以看到,GROUP BY按照订单号o_num进行分组,SUM()函数计算每个分组中订购的水果的总量。
提示
SUM()函数在计算时,忽略列值为NULL的行。
7.3.3 AVG()函数
AVG()函数通过计算返回的行数和每一行数据的和,求得指定列数据的平均值。
【例7.39】在fruits表中,查询s_id=103的供应商的水果价格的平均值,SQL语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/252.jpg?sign=1738847000-lcW3BgQnomHttLHd7xZ4sF2eszajqt7R-0-21e04d2737b0292d34dccc0223f879d9)
该例中,查询语句增加了一个WHERE子句,并且添加了查询过滤条件,只查询s_id = 103的记录中的f_price。因此,通过AVG()函数计算的结果只是指定的供应商水果的价格平均值,而不是市场上所有水果价格的平均值。
AVG()可以与GROUP BY一起使用,来计算每个分组的平均值。
【例7.40】在fruits表中,查询每一个供应商的水果价格的平均值,SQL语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/253.jpg?sign=1738847000-OlhKV47vtcsG1oPeZkOCEzcGNXfJwXGw-0-69de7f2cf2f4f96f0a0ac48668b4e7b7)
GROUP BY关键字根据s_id字段对记录进行分组,然后计算出每个分组的平均值,这种分组求平均值的方法非常有用,例如求不同班级学生成绩的平均值、求不同部门工人的平均工资、求各地的年平均气温等。
提示
AVG()函数使用时,其参数为要计算的列名称,如果要得到多个列的多个平均值,则需要在每一列上使用AVG()函数。
7.3.4 MAX()函数
MAX()返回指定列中的最大值。
【例7.41】在fruits表中查找市场上价格最高的水果值,SQL语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/254.jpg?sign=1738847000-xzQNXk1MnjiBfnbRScvxobXF4D01QqY6-0-399e73ee16790f8cabe3d9372237a2d1)
由结果可以看到,MAX()函数查询出了f_price字段的最大值15.70。
MAX()也可以和GROUP BY关键字一起使用,求每个分组中的最大值。
【例7.42】在fruits表中查找不同供应商提供的价格最高的水果值,SQL语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/255.jpg?sign=1738847000-dGZNvB8Ogr3Q2aNp2vscVBCDsURrlrnb-0-0fb0671f9e331700f6708fc51cdd40ce)
由结果可以看到,GROUP BY关键字根据s_id字段对记录进行分组,然后计算出每个分组中的最大值。
MAX()函数不仅适用于查找数值类型,也可应用于字符类型。
【例7.43】在fruits表中查找f_name的最大值,SQL语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/256.jpg?sign=1738847000-TxoOARoMvINEJ6c7OMrveBIFP9EJUOjc-0-49a70dffcd35f747982387ac049e6409)
由结果可以看到,MAX()函数可以对字母进行大小判断,并返回最大的字符或者字符串值。
提示
MAX()函数除了用来找出最大的列值或日期值之外,还可以返回任意列中的最大值,包括返回字符类型的最大值。在对字符类型数据进行比较时,按照字符的ASCII码值大小进行比较,从a~z,a的ASCII码最小,z的最大。在比较时,先比较第一个字母,如果相等,继续比较下一个字符,一直到两个字符不相等或者字符结束为止。例如,‘b’与‘t’比较时,‘t’为最大值;“bcd”与“bca”比较时,“bcd”为最大值。
7.3.5 MIN()函数
MIN()返回查询列中的最小值。
【例7.44】在fruits表中查找市场上价格最低的水果值,SQL语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/257.jpg?sign=1738847000-whp3W5vuGs7wtDGxI53PjUNYbOmEelaT-0-aab101379f9ab2c9369304b4f0883315)
由结果可以看到,MIN ()函数查询出了f_price字段的最小值2.20。
MIN()也可以和GROUP BY关键字一起使用,求出每个分组中的最小值。
【例7.45】在fruits表中查找不同供应商提供的价格最低的水果值,SQL语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/258.jpg?sign=1738847000-kfDjMVS4GO91r8ax2imz6ZdhXePnErBo-0-285323cb9a0c22abf8d35f258b02b972)
由结果可以看到,GROUP BY关键字根据s_id字段对记录进行分组,然后计算出每个分组中的最小值。
MIN()函数与MAX()函数类似,不仅适用于查找数值类型,也可应用于字符类型。