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 行数**,不是总行数。如果整列都是 NULL,SUM 和 AVG 返回 NULL,MAX/MIN 同样返回 NULL。
常见误操作:在没加 WHERE 或 GROUP 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 BY,SELECT 列表里所有**非聚合字段必须出现在 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 BY、NULL、执行顺序搅在一起时,最容易在边界 case 上翻车——比如空表返回 NULL 而不是 0,或者 HAVING 里误用未聚合字段。这些地方不报错,但结果不对,调试起来反而更费时间。
# mysql
# ai
# 邮箱
# 聚合函数
# NULL
# count
# select
# Error
# 字符串
# int
# function
# ASCII
# 的是
# 报错
# 行数
# 出现在
# 跳过
# 都是
# 这是
# 很多人
# 用了
# 会把
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Internet Explorer官网直接进入 IE浏览器在线体验版网址
深圳网站制作培训,深圳哪些招聘网站比较好?
JavaScript如何实现倒计时_时间函数如何精确控制
免费视频制作网站,更新又快又好的免费电影网站?
如何在IIS服务器上快速部署高效网站?
java ZXing生成二维码及条码实例分享
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
在线制作视频网站免费,都有哪些好的动漫网站?
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
网站优化排名时,需要考虑哪些问题呢?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
android nfc常用标签读取总结
高端建站三要素:定制模板、企业官网与响应式设计优化
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
详解MySQL数据库的安装与密码配置
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
LinuxCD持续部署教程_自动发布与回滚机制
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
Bootstrap整体框架之CSS12栅格系统
C++时间戳转换成日期时间的步骤和示例代码
如何续费美橙建站之星域名及服务?
Python图片处理进阶教程_Pillow滤镜与图像增强
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何做网站制作流程,*游戏网站怎么搭建?
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
如何在橙子建站中快速调整背景颜色?
java中使用zxing批量生成二维码立牌
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
微信推文制作网站有哪些,怎么做微信推文,急?
如何正确下载安装西数主机建站助手?
Laravel如何使用.env文件管理环境变量?(最佳实践)
如何在阿里云高效完成企业建站全流程?
利用python获取某年中每个月的第一天和最后一天
Android实现代码画虚线边框背景效果
香港服务器选型指南:免备案配置与高效建站方案解析
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Laravel怎么上传文件_Laravel图片上传及存储配置
如何在万网自助建站中设置域名及备案?
如何快速上传自定义模板至建站之星?
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复

