[mysql基础文档]-25-统计函数与group by

引言

MySQL数据表中每列列头都可以看做一个变量,而相对那一列的每个字段都是这个变量可以代入的值,变量是可以参与计算的;本文介绍几个常用的统计函数,配合group by分组完成一些简单的统计。

文章目录

0×1.统计函数实例

本文所使用的数据表为"[mysql基础文档]-24-select查询基础"第一部分所创建的cellphone表,请参考:[练习数据表]

有下面这些常用的统计函数:

avg()求平均数
max()求最大
min()求最小
count()求行数
sum()求总数

对每一个统计函数,使用cellphone表,给出一个简单实例:

					--求出cellphone表中所有打折后商品价格的平均数,avg()函数会将sale_price列中所有字段的值加起来,再除以字段数量,得到平均值
					mysql> select avg(sale_price) from cellphone;
					+-----------------+
					| avg(sale_price) |
					+-----------------+
					|     2403.650000 |
					+-----------------+

					--求sale_price列中的最大值
					mysql> select max(sale_price) from cellphone;
					+-----------------+
					| max(sale_price) |
					+-----------------+
					|         5388.00 |
					+-----------------+

					--求sale_price列中的最小值
					mysql> select min(sale_price) from cellphone;
					+-----------------+
					| min(sale_price) |
					+-----------------+
					|          549.00 |
					+-----------------+

					--求cellphone表有多少行
					mysql> select count(*) from cellphone;
					+----------+
					| count(*) |
					+----------+
					|       20 |
					+----------+

					--求sale_price列所有字段的和,select后面的表达式可以有多种组合,比如如果cellphone表还有一列库存列,那么统计所有库存以打折价卖出去后的总价,表达式就应该是sum(sale_price*库存列)
					mysql> select sum(sale_price) from cellphone;
					+-----------------+
					| sum(sale_price) |
					+-----------------+
					|        48073.00 |
					+-----------------+
					

了解了这些统计函数的基本功能后,来看看如何与group by组合。

0×2.如何使用group by分组计算

实例1,使用cat_id分组,分别计算同类商品打折价的平均值

					--group by会将cat_id值相同的记录分到一组中,avg(sale_price)将每组中sale_price列的值加起来,再除以这一组中sale_price字段数量,得到平均值
					mysql> select cat_id,avg(sale_price) from cellphone group by cat_id;
					+--------+-----------------+
					| cat_id | avg(sale_price) |
					+--------+-----------------+
					|      1 |     1136.500000 |
					|      2 |     4468.250000 |
					|      3 |     3540.500000 |
					|      4 |     1449.000000 |
					|      5 |     1424.000000 |
					+--------+-----------------+
					

实例2,查询每个商品类别下有多少不同型号的商品

					--group by以cat_id分组,cat_id一共有5类,同类分到一组,再使用count(*)统计每一类里面有多少记录
					mysql> select cat_id,count(*) from cellphone group by cat_id;
					+--------+----------+
					| cat_id | count(*) |
					+--------+----------+
					|      1 |        4 |
					|      2 |        4 |
					|      3 |        4 |
					|      4 |        4 |
					|      5 |        4 |
					+--------+----------+
					

实例3,查询同类商品中最贵的那个商品的标价

					mysql> select cat_id,max(selling_price) from cellphone group by cat_id;
					+--------+--------------------+
					| cat_id | max(selling_price) |
					+--------+--------------------+
					|      1 |            1999.00 |
					|      2 |            5988.00 |
					|      3 |            5888.00 |
					|      4 |            2199.00 |
					|      5 |            2699.00 |
					+--------+--------------------+
					

实例4,查询同类商品中所有不同型号商品标价总和

					mysql> select cat_id,sum(selling_price) from cellphone group by cat_id;
					+--------+--------------------+
					| cat_id | sum(selling_price) |
					+--------+--------------------+
					|      1 |            5227.00 |
					|      2 |           19173.00 |
					|      3 |           16081.00 |
					|      4 |            6896.00 |
					|      5 |            6585.00 |
					+--------+--------------------+
					

使用group by时,容易出现一种语义错误,请看下面的实例

					--使用group by对商品类别进行排序之后,求出了每一类商品所有型号的标价总和,但此时语句中出现了一个"goods_name",我们是对一组商品求出了一个总价,这个总价对应了这组商品中四种型号的手机名称,对照cellphone表不难发现,此时数据库会使用每类商品中第一个出现的名称显示,在MySQL中,这是一种被允许的语义错误,但这种写法总会带来一些意料之外的错误,最好避免这种语义错误的发生,在其他数据库系统中,这种语义错误是被严格禁止的;
					mysql> select goods_name,cat_id,sum(selling_price) from cellphone group by cat_id;
					+--------------+--------+--------------------+
					| goods_name   | cat_id | sum(selling_price) |
					+--------------+--------+--------------------+
					| hongMI2a     |      1 |            5227.00 |
					| GalaxyN9200  |      2 |           19173.00 |
					| iPhone6A1586 |      3 |           16081.00 |
					| MeizuNote2   |      4 |            6896.00 |
					| Huawei4X     |      5 |            6585.00 |
					+--------------+--------+--------------------+
					

P.s:group by会先进行排序,如果商品量巨大,这将非常占用资源,排序相关的功能一定要谨慎使用。