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
可以一起用:

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的客户

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

Red Panda AI
Red Panda AI

AI文本生成图像

下载

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

相关专题

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

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

674

2023.10.12

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

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

319

2023.10.27

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

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

345

2024.02.23

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

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

1084

2024.03.06

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

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

355

2024.03.06

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

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

672

2024.04.07

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

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

566

2024.04.29

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

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

408

2024.04.29

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

2

2025.12.31

热门下载

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

精品课程

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

共48课时 | 1.5万人学习

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

共3课时 | 0.3万人学习

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

共1课时 | 777人学习

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

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