本文所用的知识点、例子和语法均参考《SQL基础教程》第2版。
本章主要内容有:
- 对表进行聚合查询
- 对表进行分组
- 为聚合结果指定条件
- 对查询结果进行排序
1 对表进行聚合查询
聚合函数通常用来对表中的列进行计算和或者平均值等。聚合函数不能对null进行汇总,但是count函数可以,count(*)可以查出包含null在内的全部数据的行数。
distinct删除重复值的操作在前面我们已经见过。
聚合函数
常用的5个函数:
- count:计算表中的记录数(行数)
- sum:计算表中数值列中数据的合计值
- avg:计算表中数值列中数据的平均值
- max:求出表中任意列中数据的最大值
- min:求出表中任意列中数据的最小值
所谓聚合函数就是输入多行输出一行。
计算表中数据的行数
计算全部数据的行数用count,例如:
mysql> select count(*) from product;
+----------+
| count(*) |
+----------+
| 8 |
+----------+
也可以计算某一列中非空行数
mysql> select count(purchase_price) from product;
+-----------------------+
| count(purchase_price) |
+-----------------------+
| 6 |
+-----------------------+
括号中带星号是count函数特有的,其他函数如果用星号作参数会报错。count(*)会得到包含null的数据行数,而count(<列名>)会得到null之外的数据行数。
计算合计值
使用sum函数来求销售单价和进货单价的合计值。
mysql> select sum(sale_price),sum(purchase_price) from product;
+-----------------+---------------------+
| sum(sale_price) | sum(purchase_price) |
+-----------------+---------------------+
| 16780 | 12210 |
+-----------------+---------------------+
purchase_price列中有两个空值,在计算和的时候,并不是将两个空值当作0处理,而是有null的两行被无视,不算到计算中去。
计算平均值
计算销售单价和进货单价的平均值,当计算purchase_price时,有两个空值,先把两个空值去掉,然后将剩余不是空值的数加和在取平均(除以的是6不是8)
mysql> select avg(sale_price),avg(purchase_price) from product;
+-----------------+---------------------+
| avg(sale_price) | avg(purchase_price) |
+-----------------+---------------------+
| 2097.5000 | 2035.0000 |
+-----------------+---------------------+
计算最大值和最小值
max、min与sum、avg不同的是,后两个只能对数值类型的列使用,而前两个原则上可适用于任何数据类型的列。
mysql> select max(sale_price),min(purchase_price),max(regist_date),min(regist_date) from product;
+-----------------+---------------------+------------------+------------------+
| max(sale_price) | min(purchase_price) | max(regist_date) | min(regist_date) |
+-----------------+---------------------+------------------+------------------+
| 6800 | 320 | 2009-11-11 | 2008-04-28 |
+-----------------+---------------------+------------------+------------------+
使用聚合函数删除重复值(用distinct)
可在count函数中使用distinct来去重。
mysql> select count(distinct product_type)
-> from product;
+------------------------------+
| count(distinct product_type) |
+------------------------------+
| 3 |
+------------------------------+
观察下使用distinct和不使用distinct的结果,以sale_price为例。
mysql> select sum(sale_price),sum(distinct sale_price) from product;
+-----------------+--------------------------+
|