[Mysql] 聚合函数
聚合函数用来汇总数据(不实际检索数据而是汇总处理数据)
聚合函数作用的对象是某字段的多行数据,计算返回的是单个值
如果聚合查询的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; 修正
相关文章
- mysql数据库中,如何对json数据类型的值进行修改?通过json_set函数对json字段值进行修改?
- 深入理解 MySQL 索引
- Oracle数据库刷题笔记,mysql刷题笔记
- mySQL函数根据经纬度计算两点距离 复制代码
- 【MySQL进阶-04】深入理解mysql事务本质(超级详解)
- Mysql调优之Using filesort一般情况
- MySQL数据库函数及存储过程
- 基于JSP+MySQL 实现(Web)毕业设计题目收集系统【100010330】
- 基于Java+MySQL实现(WinForm)客户管理系统【100010236】
- MySQL 5.7的安装及主从复制(主从同步)
- Mysql 通用知识 2019-03-27
- MySql存储过程与函数详解
- mysql读写分离的操作动作依据(读写分离基本依据)
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
- MySQL数据库获取汉字拼音的首字母函数
- 数据库原理及MySQL应用 | 事件
- MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!
- mysql窗口函数、Mysql分析函数
- MySQL:日期函数、时间函数总结
- MySQL之数据库和表的基本操作(建立表、删除表、向表中添加字段)
- mysql函数大全
- 【MySQL】SpringBoot实现MySQL读写分离
- Mysql 获取当前时间函数 (类似于sql server 中的 getDate())
- [Mysql] MOD函数
- [Mysql] IF函数
- [Mysql] IFNULL函数