展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 数据库 > SQL分组统计查询:GROUP BY与HAVING子句用法示例

SQL分组统计查询:GROUP BY与HAVING子句用法示例

SQLPro
SQLPro

SQLPro 是一款macOS平台上数据库管理应用,避免使用非法,享受更全面的支持和更新。它更贴近日常 macOS 使用场景,处理高频操作时整体会更顺手一些。

¥119
macOS 2026-09-24
正版软件 macOS软件 数据库管理工具 macOS
立即下载

针对 SQL 初学者的分组统计实战指南。深入解析 GROUP BY 分组机制、WHERE 与 HAVING 的执行时机差异,以及 COUNT 函数对 NULL 值的处理逻辑。通过具体代码示例演示如何正确筛选聚合结果,并排查因 JOIN 连接导致的统计数据异常,提升报表准确性。

本文目录

    做报表统计时,你是否遇到过这样的困惑:为什么用 WHERE 过滤不掉聚合后的数据?为什么 COUNT(*) 和 COUNT(字段) 算出来的结果不一样?或者明明只有一笔订单,统计出来却变成了多笔?

    这些问题通常源于对 SQL 执行顺序和聚合机制的误解。GROUP BY 将行按键分组,COUNT、SUM 等聚合函数对每组进行计算,而 WHERE 和 HAVING 分别在不同阶段发挥作用。理解这些机制,是写出准确统计查询的关键。

    先用 GROUP BY 算每组数量

    GROUP BY 的核心作用是将具有相同值的行归为一组,然后对每组应用聚合函数。在报表场景中,最常见的就是“按用户统计订单数”。

    假设我们有一张 orders 表,包含 user_id(用户ID)和 order_id(订单ID)。若要查看每个用户的订单总量,SQL 写法如下:

    SELECT user_id, COUNT(*) AS order_count
    FROM orders
    GROUP BY user_id;
    

    在这段代码中:

    • user_id 是分组列,决定了数据按什么维度归类。
    • COUNT(*) 是聚合列,计算每组中的行数。
    • GROUP BY user_id 告诉数据库先分组,再计算。

    需要注意的是,在标准 SQL(如 PostgreSQL)中,SELECT 列表中出现的非聚合列(如 user_id)必须出现在 GROUP BY 子句中。如果遗漏,数据库会报错。而在 MySQL 的某些模式下,虽然可能不报错,但返回的非聚合列值是不确定的,这往往会导致数据误导。

    SQL分组统计查询:GROUP BY与HAVING子句用法示例

    明细行按用户分组并计算订单数

    上图展示了从明细行到分组结果的转换过程:左侧是原始的订单明细,右侧是按 user_id 分组后计算的订单总数。这种视觉化的对应关系有助于理解“分组”的本质——它将多行明细压缩为一行统计结果。

    WHERE 先过滤明细

    很多时候,我们不需要统计所有数据,而是只关心特定条件下的记录。例如,“只统计已支付的订单”。这时应该使用 WHERE 子句。

    WHERE 在分组之前执行,它过滤的是原始的行(明细数据)。只有满足 WHERE 条件的行,才会进入后续的分组和聚合计算。

    SELECT user_id, COUNT(*) AS paid_order_count
    FROM orders
    WHERE status = 'paid'
    GROUP BY user_id;
    

    在这个例子中,status = 'paid' 的条件先筛掉了所有未支付的订单,剩下的行再按用户分组计数。如果你尝试在 WHERE 中使用聚合函数,比如 WHERE COUNT(*) > 5,数据库会直接报错,因为此时还没有产生聚合结果。

    对比过滤前后的结果可以发现:

    • 不加 WHERE:统计的是该用户的所有订单(含取消、待支付等)。
    • 加 WHERE status = 'paid':仅统计状态为“已支付”的订单。

    这种“先过滤明细,再分组”的逻辑,能有效减少参与计算的数据量,提升查询效率。

    HAVING 再过滤统计结果

    如果需求变为“筛选出订单数超过 5 单的用户”,这就涉及到了对聚合结果的过滤。此时必须使用 HAVING 子句。

    HAVING 在分组和聚合计算之后执行,它过滤的是组(Group),而不是行(Row)。

    SELECT user_id, COUNT(*) AS order_count
    FROM orders
    GROUP BY user_id
    HAVING COUNT(*) > 5;
    

    这里不能将 HAVING COUNT(*) > 5 写成 WHERE COUNT(*) > 5,原因正如前文所述:WHERE 执行时,COUNT(*) 尚未计算出来。HAVING 允许我们引用聚合函数的结果作为筛选条件。

    SQL分组统计查询:GROUP BY与HAVING子句用法示例

    WHERE 过滤明细,HAVING 过滤分组结果

    上图清晰展示了 WHERE 与 HAVING 的执行顺序差异:数据流先经过 WHERE 过滤掉不符合条件的明细行,剩余行进入 GROUP BY 形成分组并计算聚合值,最后由 HAVING 根据聚合值剔除不满足阈值的组。理解这一流程,就能避免在写复杂统计查询时混淆两者的用途。

    NULL、JOIN 与统计排查

    在实际业务中,统计结果异常往往不是语法错误,而是逻辑陷阱。两个最常见的问题是 NULL 值的处理和 JOIN 导致的数据放大。

    COUNT(*) 与 COUNT(column) 的区别

    • COUNT(*):计算组内的所有行数,包括值为 NULL 的行。
    • COUNT(column):计算指定列中非 NULL 值的数量。

    例如,若 orders 表中某用户的 payment_date 字段为 NULL(表示未支付),COUNT(*) 会将其计入总数,而 COUNT(payment_date) 则会忽略该行。在统计“已支付订单数”时,使用 COUNT(payment_date) 有时比 WHERE status = 'paid' 更简洁,但需确保业务逻辑一致。

    检查连接重复导致的放大

    当需要关联其他表(如 users 表)获取用户姓名时,初学者常发现统计结果变大了。这通常是因为 JOIN 产生了重复行。

    -- 错误示范:如果 users 表和 orders 表是一对多,且连接条件不当,可能导致行数膨胀
    SELECT u.name, COUNT(o.order_id)
    FROM users u
    JOIN orders o ON u.id = o.user_id
    GROUP BY u.name;
    

    如果 orders 表中存在重复数据,或者 JOIN 条件不够精确(例如一对多关联中,主表被多次匹配),COUNT 的结果就会失真。排查此类问题的最佳实践是:

    1. 先单独查询明细:不加 GROUP BY,直接 SELECT * 查看 JOIN 后的原始行数,确认是否有意外重复。
    2. 核对连接键:确保 ON 条件能唯一标识关联关系。
    3. 使用子查询或 DISTINCT:如果无法避免重复,可在聚合前使用 COUNT(DISTINCT o.order_id) 去重统计。

    掌握这些细节,能让你的 SQL 统计查询更加稳健可靠。下次遇到数据对不上时,不妨先检查一下过滤位置和连接逻辑。

    参考资料

    • PostgreSQL GROUP BY
    • MySQL GROUP BY
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    数据库 MySQL SQL postgresql 数据查询 sql 语句
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?