如何统计SQL分组汇总数据_详解GROUP BY与HAVING用法

张开发
2026/4/17 1:11:51 15 分钟阅读

分享文章

如何统计SQL分组汇总数据_详解GROUP BY与HAVING用法
GROUP BY后字段必须出现在SELECT或聚合函数中否则MySQL 5.7和严格模式PostgreSQL报错HAVING用于分组后过滤WHERE用于分组前过滤多字段分组顺序影响索引与NULL处理COUNT(*)统计所有行COUNT(col)仅统计非NULL值。GROUP BY 后字段必须出现在 SELECT 或聚合函数里MySQL 5.7 和严格模式下的 PostgreSQL 会直接报错比如写 SELECT name, COUNT(*) FROM users GROUP BY age —— name 既没参与分组也没被聚合数据库不知道该取哪一行的 name。这不是语法疏忽是语义冲突分组后每组对应多行name 值可能不唯一。正确做法只选分组键age或套聚合函数MAX(name)、GROUP_CONCAT(name)MySQL 旧版本默认允许“隐式 ANY_VALUE”但结果不可靠别依赖PostgreSQL 完全不允许报错信息通常是column xxx must appear in the GROUP BY clause or be used in an aggregate functionHAVING 是过滤分组结果不是 WHERE 的替代品HAVING 和 WHERE 看似都能“筛数据”但执行时机和作用对象完全不同WHERE 在分组前过滤原始行HAVING 在分组后过滤聚合结果。拿错地方要么查不到想要的组要么直接报错。想查“订单数超 10 的用户”用 HAVING COUNT(*) 10不能写成 WHERE COUNT(*) 10COUNT 在 WHERE 阶段还没计算想查“2023 年后的订单再分组”时间条件得放 WHERE order_time 2023-01-01放 HAVING 会先分组再过滤性能差且逻辑错HAVING 支持的表达式受限只能用分组字段、聚合函数、常量不能用未聚合的普通列GROUP BY 多字段时顺序和 NULL 处理要留心写 GROUP BY a, b 不等于 GROUP BY b, a——虽然结果行数通常一样但排序行为、索引利用、以及遇到 NULL 时的分组逻辑可能不同。尤其当字段含 NULL多数数据库把所有 NULL 归为同一组但这是按值比较的后果不是特殊规则。 Adobe Image Background Remover Adobe推出的图片背景移除工具

更多文章