问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

MySQL零基础教程12—聚合查询(聚合函数)

创作时间:
作者:
@小白创作中心

MySQL零基础教程12—聚合查询(聚合函数)

引用
CSDN
1.
https://blog.csdn.net/qq_39824110/article/details/145942708

在数据库操作中,聚合函数是数据查询的重要工具,可以帮助我们快速汇总和分析数据。本文将详细介绍MySQL中的AVG()、COUNT()、MAX()、MIN()和SUM()等聚合函数的使用方法,并通过具体的SQL语句和示例场景进行说明。

背景

有时候我们需要汇总一些数据,比如查询一个班级的平均分数,这个时候我们需要的是把分数汇总,然后计算出一个平均值进行返回,并不需要返回某一列的值,针对这种场景,mysql中提供了一些聚合函数帮助快速完成检索:

函数名
功能说明
示例场景
AVG()
计算某列的平均值
计算班级数学平均分
COUNT()
统计某列的行数(或非 NULL 值的数量)
统计学生总数
MAX()
获取某列的最大值
查找英语最高分
MIN()
获取某列的最小值
找出体育最低分
SUM()
计算某列的总和
计算全年级数学总分

接下来分别介绍每一个函数的用法。

AVG():计算平均值

仍然以下边的学生信息为例:

我们要统计这个班级学生的数学平均分:

select avg(math) as '三班数学平均分' from students;

注意,补充avg函数使用过程中的其他tips:

  1. 可以灵活和where等其他过滤条件组合
  2. avg函数只能计算单列的平均值,函数接受的参数就是列名
  3. 如果需要计算的目标列包含null值,avg函数会忽略该行

COUNT():计数

如果我们想要对表中的行数计算,可以使用count()函数,比如查询某个班级一共有多少人,就可以直接使用这个sql:

select count(*) from students;

count也可以接收列名作为参数,计算某一列的非空值的数量,比如我们想要查询参加这次数学考试的人数(需要过滤掉空值):

select count(math) from students;

从上边的例子可以看出,count可以接收两种参数:

  1. *:查询行数,但是不会过滤空值
  2. 列名:查询某一列行数,过滤空值

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参数:去重

上边介绍了五个函数,它们的共同特点:

  1. 对所有行计算的时候,可以指定ALL参数(默认)或者不指定参数
  2. 如果需要去重,则可以使用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;

以上就是关于聚类查询的简单介绍了,下期我们一起学习分组查询!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号