[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会先进行排序,如果商品量巨大,这将非常占用资源,排序相关的功能一定要谨慎使用。