0

0

MySQL如何使用GROUPBY_MySQL分组查询与聚合函数应用教程

星夢妙者

星夢妙者

发布时间:2025-08-30 11:24:01

|

621人浏览过

|

来源于php中文网

原创

group by用于按列分组数据并执行聚合计算,如sum、count、avg等;having用于过滤分组后的结果,而where在分组前过滤原始数据,执行顺序为先where、再group by、最后having。

mysql如何使用groupby_mysql分组查询与聚合函数应用教程

在MySQL中,

GROUP BY
子句是进行数据聚合和分析的核心,它允许你根据一个或多个列的值将数据行分组,然后对每个组执行像求和、计数、平均值这样的聚合操作。简单来说,当你需要从海量数据中提炼出某个类别或维度下的汇总信息时,
GROUP BY
就是你的得力工具,它能帮助你快速理解数据的整体趋势和特征。

使用

GROUP BY
实际上是数据库查询中一个非常强大的模式,它让我们从“看单个数据”转变为“看数据群体特征”。最基本的用法是这样的:你选择一些列作为分组的依据,然后选择一个或多个聚合函数来计算每个组的汇总值。

比如,我有一个

orders
表,里面有
customer_id
,
order_date
,
amount
。如果我想知道每个客户的总消费额,我不会去遍历每一条订单然后手动加起来,那太低效了。我会这样写:

SELECT
    customer_id,
    SUM(amount) AS total_spent
FROM
    orders
GROUP BY
    customer_id;

这里,

customer_id
就是我们的分组依据。数据库会找到所有
customer_id
相同的行,把它们归到同一个“桶”里,然后对每个桶里的
amount
值进行
SUM
操作。结果就是每个客户一行,显示他们的ID和总消费。

有时,你可能需要更细致的分组,比如想看每个客户在不同月份的消费情况。这时,

GROUP BY
后面就可以跟多个列:

SELECT
    customer_id,
    DATE_FORMAT(order_date, '%Y-%m') AS order_month,
    SUM(amount) AS monthly_spent
FROM
    orders
GROUP BY
    customer_id,
    order_month
ORDER BY
    customer_id, order_month;

这里要注意一点,

SELECT
语句中除了聚合函数的结果,通常只能出现
GROUP BY
子句中包含的列。这是SQL的一个基本原则,因为如果你选了一个没有分组的列,数据库就不知道在每个组里应该显示哪个值了。比如说,一个客户有多笔订单,每笔订单的
order_id
都不同,如果你
SELECT customer_id, order_id, SUM(amount) FROM orders GROUP BY customer_id;
,那么对于一个客户的多个
order_id
,数据库就不知道该选哪个
order_id
来代表这个分组了,这通常会导致错误或者非预期的结果(在某些数据库版本或配置下可能会返回任意一个值,但这不是我们想要的)。

还有,筛选分组后的数据,我们用

HAVING
而不是
WHERE
WHERE
是在分组发生之前过滤原始行,而
HAVING
是在分组和聚合之后,对聚合结果进行过滤。比如,我想找出总消费超过1000元的客户:

SELECT
    customer_id,
    SUM(amount) AS total_spent
FROM
    orders
GROUP BY
    customer_id
HAVING
    total_spent > 1000;

如果我想先过滤掉某个日期前的订单,再进行分组和聚合,那么

WHERE
HAVING
可以一起用:

Jenni AI
Jenni AI

使用最先进的 AI 写作助手为您的写作增光添彩。

下载
SELECT
    customer_id,
    SUM(amount) AS total_spent
FROM
    orders
WHERE
    order_date >= '2023-01-01' -- 先过滤2023年之前的订单
GROUP BY
    customer_id
HAVING
    total_spent > 500; -- 再过滤总消费低于500的客户

这展示了它们各自的作用范围和执行顺序。

MySQL GROUP BY 语句中常用的聚合函数有哪些?

在使用

GROUP BY
进行数据分组时,聚合函数是不可或缺的,它们负责对每个组内的数据进行计算,然后返回一个单一的结果。理解这些函数的功能和应用场景,能让我们更灵活地从数据中提取价值。我通常会用到以下几种:

  • COUNT()
    : 这是最常用的,用于计算组中的行数。

    • COUNT(*)
      :计算组内所有行的数量,包括含有NULL值的行。
    • COUNT(column_name)
      :计算指定列非NULL值的行数。如果你想知道某个字段有多少个非空值,这个就很有用。
    • COUNT(DISTINCT column_name)
      :计算指定列中不重复的非NULL值的数量。比如,我想知道某个部门有多少个不同的职位。
    -- 计算每个部门的员工总数
    SELECT department_id, COUNT(*) AS total_employees
    FROM employees
    GROUP BY department_id;
    
    -- 计算每个部门有多少个不同的职位
    SELECT department_id, COUNT(DISTINCT job_id) AS distinct_jobs
    FROM employees
    GROUP BY department_id;
  • SUM()
    : 计算指定列(通常是数值类型)的总和。

    • 这个函数在财务、销售数据分析中尤其重要,比如计算总销售额、总库存价值等。
    -- 计算每个产品的总销售额
    SELECT product_id, SUM(quantity * price) AS total_sales
    FROM order_items
    GROUP BY product_id;
  • AVG()
    : 计算指定列(数值类型)的平均值。

    • 分析平均消费、平均薪资、平均分数等场景。
    -- 计算每个部门的平均薪资
    SELECT department_id, AVG(salary) AS average_salary
    FROM employees
    GROUP BY department_id;
  • MAX()
    MIN()
    : 分别计算指定列的最大值和最小值。

    • 这两个函数不仅限于数值类型,也可以用于日期、字符串类型,比如找出最早/最晚的订单日期,或者按字母顺序排在最前/最后的商品名称。
    -- 找出每个客户的最高消费订单金额和最低消费订单金额
    SELECT customer_id, MAX(amount) AS max_order_amount, MIN(amount) AS min_order_amount
    FROM orders
    GROUP BY customer_id;
    
    -- 找出每个部门最早入职的员工日期
    SELECT department_id, MIN(hire_date) AS earliest_hire_date
    FROM employees
    GROUP BY department_id;

除了这些,还有像

GROUP_CONCAT()
(将组内字符串连接起来)、
VAR_POP()
,
STDDEV_POP()
(计算方差和标准差)等,它们在特定场景下也非常有用。关键是根据你的分析目标,选择最合适的聚合函数。有时候,一个复杂的业务问题,可能需要组合多个聚合函数才能得到答案。

理解GROUP BY与HAVING子句的执行顺序和区别

很多初学者在使用

GROUP BY
时,经常会混淆
WHERE

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1090

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

380

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2028

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

379

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1581

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

438

2024.04.29

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

19

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 844人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号