mysql如何使用聚合函数_mysql sum、avg、max、min示例

发布时间 - 2026-02-03 00:00:00    点击率:
MySQL聚合函数默认忽略NULL:SUM、AVG跳过NULL,AVG分母为非NULL行数,全NULL时返回NULL;GROUP BY要求非聚合字段必须出现在GROUP BY中;WHERE过滤原始行,HAVING过滤分组后结果;COUNT(*)统计所有行,COUNT(col)仅非NULL行。

sum、avg、max、min 基本用法和 NULL 处理

MySQL 聚合函数默认忽略 NULL 值,这点必须牢记——比如 SUM 不会把 NULL 当作 0 加,而是直接跳过;AVG 计算时分母是**非 NULL 行数**,不是总行数。如果整列都是 NULLSUMAVG 返回 NULLMAX/MIN 同样返回 NULL

常见误操作:在没加 WHEREGROUP BY 的情况下对全表用聚合函数,结果只有一行,容易误以为“没生效”。实际是正常行为——聚合函数天然压缩结果集。

  • SUM(col):只接受数值型列,字符串会隐式转为数字(如 '12abc'12'abc'0
  • AVG(col):结果类型自动提升(如 INT 列返回 DECIMAL(10,2)),精度可由 ROUND(AVG(col), 2) 控制
  • MAX(col)MIN(col) 支持数值、字符串、日期,字符串按字典序比较('Z' > 'a' 因 ASCII 值更小)

GROUP BY 配合聚合函数的典型陷阱

一旦用了 GROUP BYSELECT 列表里所有**非聚合字段必须出现在 GROUP BY 子句中**,否则 MySQL 5.7+ 默认报错(sql_mode=ONLY_FULL_GROUP_BY 开启)。这是最常触发 ERROR 1055 的场景。

示例错误写法:SELECT user_id, name, SUM(amount) FROM orders GROUP BY user_id —— name 未被分组也未聚合,MySQL 拒绝执行。

  • 安全写法:补全 GROUP BY user_id, name,或改用聚合取值,如 MAX(name)
  • 注意 GROUP BY 对 NULL 的处理:所有 NULL 值视为同一组
  • 性能提示:GROUP BY 字段最好有索引,否则可能触发临时表 + 文件排序

WHERE 和 HAVING 的分工必须分清

WHERE 过滤的是**原始行**,HAVING 过滤的是**分组后的聚合结果**。混淆两者会导致逻辑错误或语法报错。

比如想查“订单总额超 1000 的用户”,必须用 HAVING SUM(amount) > 1000;若写成 WHERE SUM(amount) > 1000,MySQL 直接报错 Invalid use of group function

  • WHERE 可用列:原表任意字段,支持索引加速
  • HAVING 可用内容:聚合函数结果、GROUP BY 中的字段、别名(如 SELECT SUM(x) AS s FROM t GROUP BY y HAVING s > 10
  • 执行顺序:WHERE → 分组 → 聚合 → HAVING,所以 HAVING 无法替代 WHERE 做行级过滤

COUNT(*)、COUNT(col)、COUNT(1) 的真实差异

很多人以为 COUNT(1)COUNT(*) 快,其实 MySQL 优化器对三者等价处理,最终都走相同执行路径。真正影响性能的是是否能用上索引。

COUNT(*) 统计所有行(包括含 NULL 的行);COUNT(col) 只统计该列非 NULL 的行数;COUNT(1) 等同于 COUNT(*),因为 1 永不为 NULL

  • 想统计“有邮箱的用户数”:用 COUNT(email)
  • 想统计“用户总数”(不管字段是否为空):用 COUNT(*)
  • MyISAM 表上 COUNT(*) 是 O(1),InnoDB 必须扫描(除非覆盖索引)

聚合函数本身不难,但和 GROUP BYNULL、执行顺序搅在一起时,最容易在边界 case 上翻车——比如空表返回 NULL 而不是 0,或者 HAVING 里误用未聚合字段。这些地方不报错,但结果不对,调试起来反而更费时间。


# mysql  # ai  # 邮箱  # 聚合函数  # NULL  # count  # select  # Error  # 字符串  # int  # function  # ASCII  # 的是  # 报错  # 行数  # 出现在  # 跳过  # 都是  # 这是  # 很多人  # 用了  # 会把 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python并发异常传播_错误处理解析【教程】  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  七夕网站制作视频,七夕大促活动怎么报名?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何在阿里云服务器自主搭建网站?  Linux安全能力提升路径_长期防护思维说明【指导】  php打包exe后无法访问网络共享_共享权限设置方法【教程】  如何在服务器上三步完成建站并提升流量?  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  Firefox Developer Edition开发者版本入口  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  网站优化排名时,需要考虑哪些问题呢?  EditPlus中的正则表达式实战(6)  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  网站建设保证美观性,需要考虑的几点问题!  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  如何在云主机上快速搭建多站点网站?  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  WordPress 子目录安装中正确处理脚本路径的完整指南  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Android仿QQ列表左滑删除操作  Laravel如何使用Collections进行数据处理?(实用方法示例)  高端建站三要素:定制模板、企业官网与响应式设计优化  香港服务器选型指南:免备案配置与高效建站方案解析  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  如何在IIS中新建站点并配置端口与IP地址?  怎么用AI帮你设计一套个性化的手机App图标?  Laravel Session怎么存储_Laravel Session驱动配置详解  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  网站图片在线制作软件,怎么在图片上做链接?  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  制作电商网页,电商供应链怎么做?  C#如何调用原生C++ COM对象详解  Laravel distinct去重查询_Laravel Eloquent去重方法  网站制作报价单模板图片,小松挖机官方网站报价?  移动端脚本框架Hammer.js  Laravel如何使用withoutEvents方法临时禁用模型事件  b2c电商网站制作流程,b2c水平综合的电商平台?  HTML 中动态设置元素 name 属性的正确语法详解