讲师中心 微信公众号
AI工具推荐 视频效率加速

MySQL如何利用分组函数进行数据汇总 MySQL GROUP BY与聚合函数结合使用

老瑶吖_1201

老瑶吖_1201

发布时间:2025-08-02 09:02:01

|

667人浏览过

|

来源于php中文网

原创

mysql中group by子句必须与聚合函数结合使用,用于将数据按指定列分组并进行汇总计算;2. select列表中的非聚合列必须出现在group by子句中,否则会导致不可预测的结果,尤其在新版本mysql中已被严格限制;3. sql执行顺序为from → where → group by → having → select → order by,其中where在分组前过滤原始行,having在分组后过滤聚合结果;4. null值在group by中被视为相等,会单独形成一组,需注意其对统计结果的影响;5. 为常用于分组的列创建索引可显著提升查询性能;6. 常用聚合函数除sum和count外,还包括avg(计算平均值)、max/min(获取极值)、group_concat(连接字符串,支持去重和排序)、var_samp/stddev_samp(计算样本方差和标准差),分别适用于不同数据分析场景;7. where用于筛选参与分组的原始数据,having用于筛选分组后的聚合结果,二者不可互换,正确使用可提高查询效率和逻辑准确性。

MySQL如何利用分组函数进行数据汇总 MySQL GROUP BY与聚合函数结合使用

在MySQL中,要对数据进行汇总,核心方法就是将

GROUP BY
子句与各种聚合函数(如
SUM
、
COUNT
、
AVG
、
MAX
、
MIN
等)结合使用。这种组合允许你将具有相同特征的行归为一组,然后对每个组的数据执行计算,从而得到汇总结果。这就像是把一大堆散乱的乐高积木按颜色分类,再数数每种颜色有多少块,或者量量最长的积木是哪一块。

MySQL如何利用分组函数进行数据汇总 MySQL GROUP BY与聚合函数结合使用

解决方案

利用

GROUP BY
子句,你可以指定一个或多个列作为分组的依据。数据库系统会扫描表,将这些指定列值相同的行视为一个组。接着,你就可以在
SELECT
列表中使用聚合函数,对这些分组后的数据进行计算。

举个例子,假设我们有一个

orders
表,里面有
order_id
,
customer_id
,
product_id
,
amount
,
order_date
等字段。如果你想知道每个客户的总消费金额,你会这么做:

MySQL如何利用分组函数进行数据汇总 MySQL GROUP BY与聚合函数结合使用
SELECT
    customer_id,
    SUM(amount) AS total_spent
FROM
    orders
GROUP BY
    customer_id;

这段SQL的意思是:从

orders
表里,把所有订单按照
customer_id
分组,然后对每个客户的订单金额进行求和,最终显示每个客户的ID和他们的总消费。

再比如,我们想知道每个产品类别有多少件商品被购买,或者某个时间段内每天的销售额。这都离不开

GROUP BY
。它不仅仅是简单地分组,更是一种数据视角的转换,从单行数据转向了群体行为的统计。在我看来,这是数据库查询中最强大也最常用的分析工具之一,没有它,很多业务报表和数据分析几乎无法完成。

MySQL如何利用分组函数进行数据汇总 MySQL GROUP BY与聚合函数结合使用

MySQL GROUP BY子句的基本用法和注意事项有哪些?

GROUP BY
子句的基本语法结构并不复杂:
SELECT column1, aggregate_function(column2) FROM table_name GROUP BY column1;
。这里有几个关键点我觉得特别值得拎出来说说。

首先,

SELECT
列表中的非聚合列(也就是那些不被
SUM()
、
COUNT()
等函数包裹的列)必须出现在
GROUP BY
子句中。如果你选了
customer_id
和
product_id
,那么
GROUP BY
后面就得跟着
customer_id, product_id
。这是SQL标准的要求,因为如果不这样,数据库就不知道在聚合结果中,那些非聚合列的值应该取哪个(毕竟一个组里可能有多个不同的值)。MySQL在旧版本中对这个规则有点“宽松”,允许你选择不在
GROUP BY
中的非聚合列,但它会随机取组内的一行数据,这在实际工作中是极其危险且不可预测的,新版本已经收紧了。

其次,

GROUP BY
的执行顺序。这很重要,因为它影响到你在哪里进行数据过滤。SQL查询的逻辑处理顺序大致是:
FROM
->
WHERE
->
GROUP BY
->
HAVING
->
SELECT
->
ORDER BY
。这意味着
WHERE
子句是在分组之前对原始行进行筛选的,而
GROUP BY
则是在
WHERE
筛选后的数据上进行分组。

还有一点,关于

NULL
值。在
GROUP BY
操作中,所有的
NULL
值会被视为相等,它们会形成一个独立的组。如果你有某个字段可能包含
NULL
,并且你需要对这些
NULL
值进行单独的统计或排除,这一点就显得尤为重要。

从性能角度看,如果你经常对某个或某些列进行

GROUP BY
操作,为这些列创建索引通常能显著提升查询速度。数据库可以利用索引更快地找到相同的值,从而加速分组过程。

如何结合WHERE和HAVING子句对分组数据进行筛选?

在数据汇总的过程中,筛选数据是不可避免的需求。但问题来了,我们什么时候用

WHERE
,什么时候用
HAVING
呢?这常常让人犯迷糊,但理解它们的区别和应用场景,能让你的SQL查询更高效、更精准。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

WHERE
子句,就像我前面提到的,它是在数据被
GROUP BY
分组之前进行过滤的。这意味着
WHERE
操作是针对原始表中的每一行数据进行的。如果你想排除某些不符合条件的原始记录,比如只想统计2023年的订单,那么
WHERE order_date >= '2023-01-01' AND order_date <= '2023-12-31'
就应该放在
GROUP BY
之前。它的好处是,它能大大减少需要进行分组和聚合的数据量,从而提升查询性能。

而

HAVING
子句则完全不同,它是在数据被
GROUP BY
分组并进行聚合之后才进行过滤的。
HAVING
是针对聚合结果进行筛选的。举个例子,你已经按客户ID分组并计算了每个客户的总消费金额,现在你想找出那些总消费金额超过1000元的客户。这时,你就需要用
HAVING
:

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

这里,你不能用

WHERE SUM(amount) > 1000
,因为
WHERE
是在聚合之前执行的,那时候
SUM(amount)
这个聚合值根本还没计算出来。所以,记住这个原则:对原始行进行过滤用
WHERE
,对聚合结果进行过滤用
HAVING
。这个区分,虽然看起来是语法上的小细节,但在实际分析中,是区分一个查询是否高效、是否能正确表达业务逻辑的关键。

除了SUM和COUNT,MySQL还有哪些常用的聚合函数及其应用场景?

除了最常见的

SUM()
和
COUNT()
,MySQL提供了多种强大的聚合函数,它们能帮助我们从不同维度理解和分析数据。

  • AVG()
    :计算平均值。 当你需要知道某个数值型字段的平均值时,比如平均订单金额、平均产品评分,
    AVG()
    就派上用场了。

    SELECT product_category, AVG(price) AS average_price
    FROM products
    GROUP BY product_category;

    这能告诉你每个产品类别的平均售价。

  • MAX()
    和
    MIN()
    :获取最大值和最小值。
    这两个函数非常直观,可以用于找出某个组内的最大或最小数值,甚至日期或字符串(按字典序)。比如,找出每个部门最高薪水的员工,或者最早的订单日期。

    SELECT department, MAX(salary) AS max_salary, MIN(hire_date) AS earliest_hire
    FROM employees
    GROUP BY department;
  • GROUP_CONCAT()
    :连接字符串。 这是一个非常实用的函数,它能将一个组内某个列的所有字符串值连接成一个字符串,并用指定的分隔符隔开。比如,你想知道每个客户都购买了哪些产品(产品名称列表),而不仅仅是数量。

    SELECT
        customer_id,
        GROUP_CONCAT(DISTINCT product_name ORDER BY product_name SEPARATOR '; ') AS purchased_products
    FROM
        orders_detail
    GROUP BY
        customer_id;

    这里

    DISTINCT
    确保产品名称不重复,
    ORDER BY
    让结果有序,
    SEPARATOR
    则定义了连接符。这个函数在生成报表或列表时特别有用。

  • VAR_SAMP()
    和
    STDDEV_SAMP()
    :计算样本方差和样本标准差。
    这些是统计学中衡量数据离散程度的函数。在进行更深入的数据分析时,比如分析销售额的波动性、用户行为的稳定性,它们能提供更专业的统计指标。虽然不常用,但在需要进行严谨数据分析时,它们是不可或缺的工具。

选择合适的聚合函数,就像选择合适的工具一样,能让你更精准地挖掘数据背后的价值。它们让数据不仅仅是数字,而是能够讲述故事的洞察。

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

4603

2023.10.12

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

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

951

2023.10.27

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

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

1209

2024.02.23

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

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

6581

2024.03.06

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

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

3323

2024.03.06

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

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

6540

2024.04.07

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

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

8981

2024.04.29

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

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

1210

2024.04.29

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

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

精品课程

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

共1课时 | 193人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn