MySQL零基础教程12—聚合查询(聚合函数)
MySQL零基础教程12—聚合查询(聚合函数)
在数据库操作中,聚合函数是数据查询的重要工具,可以帮助我们快速汇总和分析数据。本文将详细介绍MySQL中的AVG()、COUNT()、MAX()、MIN()和SUM()等聚合函数的使用方法,并通过具体的SQL语句和示例场景进行说明。
背景
有时候我们需要汇总一些数据,比如查询一个班级的平均分数,这个时候我们需要的是把分数汇总,然后计算出一个平均值进行返回,并不需要返回某一列的值,针对这种场景,mysql中提供了一些聚合函数帮助快速完成检索:
函数名 | 功能说明 | 示例场景 |
---|---|---|
AVG() | 计算某列的平均值 | 计算班级数学平均分 |
COUNT() | 统计某列的行数(或非 NULL 值的数量) | 统计学生总数 |
MAX() | 获取某列的最大值 | 查找英语最高分 |
MIN() | 获取某列的最小值 | 找出体育最低分 |
SUM() | 计算某列的总和 | 计算全年级数学总分 |
接下来分别介绍每一个函数的用法。
AVG():计算平均值
仍然以下边的学生信息为例:
我们要统计这个班级学生的数学平均分:
select avg(math) as '三班数学平均分' from students;
注意,补充avg函数使用过程中的其他tips:
- 可以灵活和where等其他过滤条件组合
- avg函数只能计算单列的平均值,函数接受的参数就是列名
- 如果需要计算的目标列包含null值,avg函数会忽略该行
COUNT():计数
如果我们想要对表中的行数计算,可以使用count()函数,比如查询某个班级一共有多少人,就可以直接使用这个sql:
select count(*) from students;
count也可以接收列名作为参数,计算某一列的非空值的数量,比如我们想要查询参加这次数学考试的人数(需要过滤掉空值):
select count(math) from students;
从上边的例子可以看出,count可以接收两种参数:
- *:查询行数,但是不会过滤空值
- 列名:查询某一列行数,过滤空值
MAX():求最大值
max()函数用于求最大值,接收的参数也是列名,比如需要找出班级中的数学最高分:
select max(math) from students;
同样的,max()函数计算的时候也会忽略空值
另外,如果max()函数除了可以找到最大的数值,也可以用于计算最大日期,如果接收的参数列存储的是文本数据,排好序后,max()函数会返回最后一行
MIN():求最小值
找出班级数学最低分:
select min(math) from students;
min函数的注意事项和max一样,不再赘述,只不过用于求最小
SUM():求和函数
sum()函数用于求和计算,比如求班级数学分数和(仅举例,虽然很少会有这个场景):
select sum(math) from students;
sum()函数还可以用来汇总计算值,举个例子,假如想要求出来班级三个科目的分数总和:
select sum(math+gym+en) from students;
sum()函数也会过滤掉空值
实际上所有的聚合函数都可以接收计算值作为参数,大家可以灵活运用
DISTINCT参数:去重
上边介绍了五个函数,它们的共同特点:
- 对所有行计算的时候,可以指定ALL参数(默认)或者不指定参数
- 如果需要去重,则可以使用DISTINCT函数
这里我们为了举的例子更加贴合实际场景,需要做一些新的数据准备,我们使用常见的订单场景来创建数据库和表信息:
-- 创建电商数据库
CREATE DATABASE IF NOT EXISTS ecommerce_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 使用数据库
USE ecommerce_db;
-- 创建订单表
CREATE TABLE orders (
order_id VARCHAR(20) PRIMARY KEY COMMENT '订单号(唯一)',
customer_name VARCHAR(50) NOT NULL COMMENT '下单人名称',
order_date DATETIME NOT NULL COMMENT '下单时间',
amount DECIMAL(10,2) NOT NULL COMMENT '订单金额'
);
INSERT INTO orders (order_id, customer_name, order_date, amount) VALUES
('ORD20231010001', '张三', '2023-10-10 09:15:23', 158.50),
('ORD20231010002', '李四', '2023-10-10 11:30:45', 299.00),
('ORD20231010003', '王五', '2023-10-10 14:20:11', 425.75),
('ORD20231011004', '张三', '2023-10-11 10:05:34', 78.90),
('ORD20231011005', '赵六', '2023-10-11 16:45:09', 650.00),
('ORD20231012006', '李四', '2023-10-12 08:30:17', 230.40),
('ORD20231012007', '孙七', '2023-10-12 13:15:28', 345.60),
('ORD20231013008', '王五', '2023-10-13 09:40:55', 99.99),
('ORD20231013009', '张三', '2023-10-13 17:20:03', 512.30),
('ORD20231014010', '周八', '2023-10-14 10:10:10', 188.00),
('ORD20231014011', '李四', '2023-10-14 15:25:47', 276.50),
('ORD20231015012', '吴九', '2023-10-15 11:11:11', 420.00),
('ORD20231015013', '王五', '2023-10-15 14:30:19', 155.75),
('ORD20231016014', '郑十', '2023-10-16 09:00:00', 333.33),
('ORD20231016015', '张三', '2023-10-16 12:45:38', 199.90),
('ORD20231017016', '李四', '2023-10-17 08:05:22', 488.60),
('ORD20231017017', '王五', '2023-10-17 16:20:14', 75.25),
('ORD20231018018', '钱多多', '2023-10-18 10:30:45', 666.66),
('ORD20231018019', '张三', '2023-10-18 14:15:03', 350.40),
('ORD20231019020', '李四', '2023-10-19 09:50:57', 245.80);
在上边的订单表中,存在同一个人有多个订单的场景,如果我们想要统计一共有多少名顾客下过单,可以很容易想到使用count(0函数,但是很明显存在一个人购买多次,存在多个订单记录的情况,所以需要对数据进行去重处理,这里可以根据下单人进行去重:
select count(distinct customer_name) as 下单人数 from orders;
组合使用
上边的举例都比较单一,实际上一个sql语句是可以同时使用多个聚合函数的,比如下边的场景:
-- 检查重复客户订单
SELECT
customer_name AS 客户名称,
COUNT(*) AS 订单数量,
SUM(amount) AS 总消费金额
FROM orders
GROUP BY customer_name
ORDER BY 订单数量 DESC;
以上就是关于聚类查询的简单介绍了,下期我们一起学习分组查询!