首页 > 数据库 > SQL > 正文

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

絕刀狂花
发布: 2025-08-15 15:02:01
原创
870人浏览过
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
登录后复制
登录后复制
的独特组合都会形成一个独立的分组。

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

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
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
混用的错误。

以上就是sql怎样用GROUPBY对数据进行简单分组 sql分组查询的基础语句用法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号