0

0

sql怎样用GROUPBY对数据进行简单分组 sql分组查询的基础语句用法

絕刀狂花

絕刀狂花

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

|

969人浏览过

|

来源于php中文网

原创

GROUP BY用于按指定列分组数据,配合聚合函数(如SUM、COUNT、AVG等)对每组数据进行统计;SELECT中非聚合列必须出现在GROUP BY中;多字段分组可实现更细粒度分析;WHERE在分组前过滤行,HAVING在分组后基于聚合结果过滤组。

sql怎样用groupby对数据进行简单分组 sql分组查询的基础语句用法

SQL中的

GROUP BY
子句是用来将具有相同值的数据行归纳为一组,然后对这些组应用聚合函数(如
COUNT
SUM
AVG
MIN
MAX
),从而生成汇总信息。简单来说,它能让你把一堆散乱的数据,按照某个或某几个共同的特征“打包”起来,再对每个“包”里的内容进行统计。

解决方案

要使用

GROUP BY
进行数据分组,最基础的语法结构是这样的:你选择一些列来显示,其中至少有一列是用来分组的,同时通常会伴随一个或多个聚合函数。

假设我们有一个

sales_records
表,里面记录了每次销售的
product_category
(产品类别)和
sale_amount
(销售金额)。现在我想知道每个产品类别的总销售额。

SELECT
    product_category,
    SUM(sale_amount) AS total_sales_amount
FROM
    sales_records
GROUP BY
    product_category;

这里,

SELECT product_category, SUM(sale_amount)
表示我想要看到产品类别以及每个类别的销售总额。
FROM sales_records
指定了数据来源。而
GROUP BY product_category
就是关键了,它告诉数据库:把所有
product_category
值相同的行归为一组。比如,所有“电子产品”的销售记录会放在一起,所有“服装”的销售记录放在一起,然后
SUM(sale_amount)
就会计算每个组内的销售总额。

我个人觉得,理解

GROUP BY
的关键在于想象数据是如何被“折叠”起来的。没有
GROUP BY
SUM(sale_amount)
会计算整个表的总和;有了它,这个总和就变成了针对每个分组的局部总和。这就像你有一堆不同颜色的珠子,
GROUP BY
就是把同颜色的珠子串成一串,然后你再数每串有多少颗。

GROUP BY
到底能和哪些聚合函数一起用?

说到

GROUP BY
,它几乎总是和聚合函数形影不离。这些函数是它的“好搭档”,因为它们的作用就是对一组数据进行计算,然后返回一个单一的结果。常见的聚合函数有:

  • COUNT()
    :计算组内行的数量。比如
    COUNT(*)
    会统计组内所有行,
    COUNT(column_name)
    会统计组内
    column_name
    非NULL的行数。
    -- 统计每个产品类别的销售记录数量
    SELECT
        product_category,
        COUNT(*) AS number_of_sales
    FROM
        sales_records
    GROUP BY
        product_category;
  • SUM()
    :计算组内某列的总和。
    -- 统计每个产品类别的总销售额 (上面已经给过例子)
  • AVG()
    :计算组内某列的平均值。
    -- 计算每个产品类别的平均销售额
    SELECT
        product_category,
        AVG(sale_amount) AS average_sale_amount
    FROM
        sales_records
    GROUP BY
        product_category;
  • MIN()
    :获取组内某列的最小值。
    -- 找出每个产品类别的最低销售额
    SELECT
        product_category,
        MIN(sale_amount) AS min_sale_amount
    FROM
        sales_records
    GROUP BY
        product_category;
  • MAX()
    :获取组内某列的最大值。
    -- 找出每个产品类别的最高销售额
    SELECT
        product_category,
        MAX(sale_amount) AS max_sale_amount
    FROM
        sales_records
    GROUP BY
        product_category;

值得注意的是,如果你在

SELECT
语句中包含了一个非聚合列,但又没有把它放到
GROUP BY
子句里,大多数SQL数据库会报错。这是因为数据库不知道该如何为每个分组选择这个非聚合列的值。比如,一个组里可能有好几条销售记录,每条记录的销售日期都不同,如果你只
SELECT product_category, sale_date
GROUP BY product_category
,数据库就懵了,它不知道该显示哪个
sale_date
。所以,记住这个原则:
SELECT
列表中除了聚合函数之外的任何列,都必须出现在
GROUP BY
子句中。

多个字段如何一起分组?

有时候,我们不仅仅想按一个维度来分组,而是希望从更细致的角度去分析数据。比如,我想知道每个产品类别在不同销售区域(

sales_region
)的销售情况。这时候,就可以使用多个字段进行分组。

SELECT
    product_category,
    sales_region,
    SUM(sale_amount) AS total_sales_amount
FROM
    sales_records
GROUP BY
    product_category,
    sales_region;

这个查询会创建更细粒度的分组。它会把“电子产品”在“北方区域”的销售记录归为一组,“电子产品”在“南方区域”的销售记录归为另一组,以此类推。每个

product_category
sales_region
的独特组合都会形成一个独立的分组。

Remove.bg
Remove.bg

AI在线抠图软件,图片去除背景

下载

我发现,多字段分组在做数据透视时特别有用。它能一下子把数据的层级感拉出来,从宏观到微观,洞察力瞬间提升。比如,你可能发现某个产品类别在整体上表现不错,但一细分到区域,就发现它在某个特定区域的销售额异常低,这就能帮你快速定位问题。这种分层分析的能力,是

GROUP BY
真正的魅力所在。

HAVING
WHERE
在分组查询中有什么区别

这是

GROUP BY
查询中一个非常常见且容易混淆的点:什么时候用
WHERE
,什么时候用
HAVING
?简单来说,它们都是用来过滤数据的,但过滤的时机和对象不同。

  • WHERE
    子句:在数据被分组之前进行过滤。它作用于原始的、未聚合的行数据。如果你想排除某些行,让它们甚至不参与分组和聚合计算,那就用
    WHERE

    -- 只统计销售额大于100的产品记录,然后再按产品类别分组
    SELECT
        product_category,
        SUM(sale_amount) AS total_sales_amount
    FROM
        sales_records
    WHERE
        sale_amount > 100 -- 过滤掉单笔销售额小于等于100的记录
    GROUP BY
        product_category;

    在这个例子中,

    WHERE sale_amount > 100
    会先筛选出所有单笔销售额超过100的记录,然后这些被筛选过的记录才会被
    GROUP BY product_category
    进行分组和聚合。

  • HAVING
    子句:在数据被分组之后进行过滤。它作用于已经聚合过的组数据。如果你想基于聚合函数的结果来过滤分组,那就用
    HAVING

    -- 统计每个产品类别的总销售额,但只显示总销售额超过5000的类别
    SELECT
        product_category,
        SUM(sale_amount) AS total_sales_amount
    FROM
        sales_records
    GROUP BY
        product_category
    HAVING
        SUM(sale_amount) > 5000; -- 过滤掉总销售额小于等于5000的类别

    这里,

    GROUP BY product_category
    会先计算出每个产品类别的总销售额,然后
    HAVING SUM(sale_amount) > 5000
    会检查每个组的总销售额,只有那些总销售额超过5000的组才会被最终显示出来。

我经常会这样去想它们的执行顺序:数据库会先从

FROM
子句中获取原始数据,接着
WHERE
会像一道闸门,把不符合条件的单行数据拦在外面。然后,剩下的数据才会进入
GROUP BY
环节,被“打包”成一个个小组。最后,
HAVING
就像是另一道闸门,但它检查的是这些“打包”好的小组是否符合条件(通常是基于小组的聚合结果),不符合的就丢弃。理解这个流程,就能大大减少
WHERE
HAVING
混用的错误。

相关专题

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

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

684

2023.10.12

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

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

323

2023.10.27

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

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

348

2024.02.23

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

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

1097

2024.03.06

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

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

359

2024.03.06

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

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

697

2024.04.07

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

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

577

2024.04.29

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

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

419

2024.04.29

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

热门下载

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

精品课程

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

共61课时 | 3.5万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

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

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