zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

[Mysql] 聚合函数

mysql 函数 聚合
2023-09-11 14:22:54 时间

聚合函数用来汇总数据(不实际检索数据而是汇总处理数据)

聚合函数作用的对象是某字段的多行数据,计算返回的是单个值

如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL

SELECT语句可根据需要包含多个聚合函数

常用的聚合函数
聚合函数名称说明
AVG()返回某列的平均值
SUM()返回某列的数据之和
MAX()返回某列的最大值
MIN()返回某列的最小值
COUNT()返回某列的行数

导入数据

DROP TABLE IF EXISTS goods_price; 
CREATE TABLE goods_price( 
goods_id VARCHAR(8), 
goods_price INT 
) 
ENGINE = InnoDB 
DEFAULT CHARSET = utf8; 
INSERT INTO 
goods_price (goods_id,goods_price)
VALUE ('g001',100) 
,('g002',2000) 
,('g003',500) 
,('g004',600) 
,('g005',80);

goods_price表(商品价格表)

1.AVG()函数

案例: 查询商品的平均价格

SELECT AVG(goods_price) FROM goods_price;

结果展示:

AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出

为了获得多个列的平均值,必须使用多个AVG()函数(一个AVG()函数只用于单个列)

扩展: 在商品价格表中加入一行商品价格为空的数据

INSERT INTO 
goods_price (goods_id,goods_price) 
VALUE ('g006',NULL);

插入商品价格为空的数据后的goods_price表:

再次运行相同的查询代码,查询商品的平均价格,结果与上述一致

在插入一行商品价格为空的数据后,使用AVG()函数计算得到的结果没有发生变化,因为AVG()函数计算时会忽略空值,即不将空值计算在内

与AVG()函数相同,SUM()函数、MAX()函数、MIN()函数在计算时也会忽略空值

2.SUM()函数

案例: 查询商品的价格总和

SELECT SUM(goods_price) FROM goods_price;

结果展示:

扩展

SUM()也可以用来合计计算值

案例: 合计每项物品的 item_price*quantity,得出总的订单金额:

SELECT SUM(item_price * quantity) AS total_price
FROM orderitems;

3.MAX()函数

案例: 查询商品的最高价格

SELECT MAX(goods_price) FROM goods_price;

结果展示:

扩展:

1.MAX()要求指定列名 

2.对非数值数据使用MAX()

虽然MAX()一般用来找出最大的数值或日期值,但MySQL允许将它用来返回任意列中的最大值,包括返回文本列中的最大值。在用于文本数据时,如果数据按相应的列排序,则MAX()返回最后一行

4.MIN()函数

案例: 查询商品的最低价格

SELECT MIN(goods_price) FROM goods_price;

结果展示: 

扩展:

1.与MAX()一样,MIN()要求指定列名

2.对非数值数据使用MIN()

MIN()函数与MAX()函数类似,MySQL允许将它用来返回任意列中的最小值,包括返回文本列中的最小值。在用于文本数据时,如果数据按相应的列排序,则MIN()返回最前面的行

5.COUNT()函数

案例: 对表中的行进行计算

SELECT COUNT(*) FROM goods_price;

结果展示:

 使用COUNT(column),其中column代表列名

SELECT COUNT(goods_price) FROM goods_price;

结果展示:

 对比上述两种COUNT()函数的计算结果,可以发现:

COUNT(*)和COUNT(column)的区别:

COUNT(*)对表中的行进行计数,不管表列中包含的是空值(NULL)还是非空值,在统计结果的时候,不会忽略空值NULL

COUNT(column)对特定列中有值的行进行计算,统计出的数量是忽略NULL后得到的 ,即不计入空值(这里所说的空值不包括空字符串或者0)

补充: COUNT(1)对表中的行进行统计计数,也不会忽略列值为NULL

扩展:DISTINCT与聚合函数COUNT()搭配 

导入数据

DROP TABLE IF EXISTS goods_category; 
CREATE TABLE goods_category( 
goods_id VARCHAR(8), 
category VARCHAR(8) 
) 
ENGINE = InnoDB 
DEFAULT CHARSET = utf8; 
INSERT INTO 
goods_category (goods_id,category) 
VALUE ('g001','shoes') 
,('g002','shoes') 
,('g003','skirt') 
,('g004','skirt') 
,('g005','hat');

goods_category表(商品品类表)

问题: 统计有多少种商品品类

SELECT COUNT(DISTINCT category) FROM goods_category;

结果展示:

结合使用COUNT()函数和DISTINCT,可以对列值进行去重处理后统计数量

DISTINCT也可以与AVG()函数 / MAX()函数 / MIN()函数结合使用

将DISTINCT用于MIN()和MAX(),虽然DISTINCT从技术上可用于MIN()和MAX(),但这样做实际上没有价值。一个列中的最小值和最大值不管是否包含不同值都是相同的

6.聚合函数取别名

别名(alias)是一个字段或值的替换名

别名用AS关键字赋予(指定别名时使用的AS也可以省略)

别名的常见用法: 在检索出的结果中重命名表的列字段

对于聚合函数来说,建议使用别名来替换表中默认生成的实际列名

取别名的好处:

1.符合特定的报表要求或客户需求

2.编写SQL更易于理解和使用,可以更好地显示结果

3.将来便于排除故障

4.精简的别名可以减少代码的书写量

根据上述"查询商品的最低价格"的案例代码进行修改,为聚合函数取别名:

SELECT MIN(goods_price) AS '最低价格' FROM goods_price;

结果呈现:

与未对聚合函数取别名的结果图进行对比:

我们可以发现对聚合函数取别名更容易了解生成的列字段的含义,便于后续的处理操作

扩展

除了可以对字段使用别名,还可以对表使用别名来减少代码的书写量

注意: SELECT students.name FROM students AS s;   报错

         SELECT s.name FROM students AS s;   修正