当前位置: 首页 > news >正文

【MySQL】函数:聚合函数


聚合函数

聚合函数作用于一组数据,并对一组数据返回一个值

======= 🌟 青柠来相伴,代码更简单。🌟 =======
📚 本文所有内容,我都整理在了 青柠合集 里。👇
🎯 搜索关注【青柠代码录】,即可查看所有合集文章 ~
======= 🌟 ================ 🌟 =======

聚合函数不能嵌套调用。

1.查询课程编号为“0002”的总成绩
select 课程号,sum(成绩) as 总成绩 from score where 课程号='0002';2.查询选了课程的学生人数
select COUNT(DISTINCT 学号) as 选课人数 from score;3.查询各科成绩最高和最低的分
select 课程号,max(成绩) as 最高分,min(成绩) as 最低分 from score group by 课程号;4.查询每门课程被选修的学生数
select 课程号,count(学号) as 选修人数 from score group by 课程号;5.查询男生、女生人数
select sum(case when 性别='男' then 1 else 0 end) as 男生人数,sum(case when 性别='女' then 1 else 0 end) as 女生人数 from student;
或
select 性别,count(学号) as 人数 from student group by 性别;6.查询平均成绩大于60分学生的学号和平均成绩
select 学号,avg(成绩) as 平均成绩 from score group by 学号 having avg(成绩)>60; 7.查询至少选修两门课程的学生学号
select 学号, count(课程号) as 选修课程数 from score group by 学号 having count(课程号)>=2;8.查询同名同姓学生名单并统计同名人数
select 姓名,count(姓名) as 同名人数 from student group by 姓名 having count(姓名)>1;9.查询不及格的课程及按课程号从大到小排列
select 课程号 from score where 成绩<60 order by 课程号 desc;10.查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
select 课程号,avg(成绩) as 平均成绩 from score group by 课程号 order by 平均成绩,课程号 desc;11.检索课程编号为“0004”且分数小于60的学生学号,结果按分数降序排列
select 学号,成绩 from score where 课程号='0004' and 成绩<60 order by 成绩 desc;12.统计每门课程的学生选修人数(超过2人的课程才统计)要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序排序
select 课程号,count(学号) as 选修人数 from score group by 课程号 having count(学号)>2 order by 选修人数 desc,课程号;13.查询两门以上不及格课程的同学的学号及其平均成绩。同时存在where和having,注意区别
select 学号,avg(成绩) as 平均成绩 from score where 成绩<60 group by 学号 having count(成绩)>=2;

分组函数作用于一组数据,并对一组数据返回一个值。

AVG和SUM函数

可以对数值型数据使用AVG 和 SUM 函数。

SELECT AVG(salary), MAX(salary),MIN(salary), SUM(salary)
FROM   employees
WHERE  job_id LIKE '%REP%';

img

MIN和MAX函数

可以对任意数据类型的数据使用 MIN 和 MAX 函数。

SELECT MIN(hire_date), MAX(hire_date)
FROM      employees;

img

COUNT函数

  • COUNT(*)返回表中记录总数,适用于任意数据类型
SELECT COUNT(*)
FROM   employees
WHERE  department_id = 50;

img

  • COUNT(expr) 返回expr不为空的记录总数。
SELECT COUNT(commission_pct)
FROM   employees
WHERE  department_id = 50;

img

问题:用count(*),count(1),count(列名)谁好呢?

  • 其实,对于MyISAM引擎的表是没有区别的。这种引擎内部有一计数器在维护着行数。
  • Innodb引擎的表用count(*),count(1)直接读行数,复杂度是O(n),因为innodb真的要去数一遍。但用这两个好于具体的count(列名)。

问题:能不能使用count(列名)替换count(*)?

  • 不要使用 count(列名)来替代 count(),count()是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。
  • 说明:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。

GROUP BY

基本使用

img
可以使用GROUP BY子句,将表中的数据分成若干组

SELECT column, group_function(column)
FROM table
[WHERE  condition]
[GROUP BY   group_by_expression]
[ORDER BY   column];

在SELECT列表中,所有未包含在组函数中的列,都应该包含在GROUP BY子句中

SELECT   department_id, AVG(salary)
FROM     employees
GROUP BY department_id ;

img
包含在GROUP BY子句中的列,不必包含在SELECT 列表中

SELECT   AVG(salary)
FROM     employees
GROUP BY department_id ;

img

使用多个列分组

img

SELECT   department_id dept_id, job_id, SUM(salary)
FROM     employees
GROUP BY department_id, job_id ;

img

GROUP BY中使用WITH ROLLUP

使用WITH ROLLUP关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。

SELECT department_id,AVG(salary)
FROM employees
WHERE department_id > 80
GROUP BY department_id WITH ROLLUP;

注意:

当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的。

HAVING

基本使用

img

过滤分组:HAVING子句

  1. 行已经被分组。
  2. 使用了聚合函数。
  3. 满足HAVING 子句中条件的分组将被显示。
  4. HAVING 不能单独使用,HAVING必须要跟GROUP BY一起使用

img

SELECT   department_id, MAX(salary)
FROM     employees
GROUP BY department_id
HAVING   MAX(salary)>10000 ;

img

  • 非法使用聚合函数:不能在WHERE子句中使用聚合函数。如下:
SELECT   department_id, AVG(salary)
FROM     employees
WHERE    AVG(salary) > 8000
GROUP BY department_id;

img**
**WHERE和HAVING的对比

区别1:

WHERE可以直接使用表中的字段作为筛选条件,但不能使用分组中的计算函数作为筛选条件;

HAVING 必须要与 GROUP BY 配合使用,可以把分组计算的函数、和分组字段作为筛选条件。

这决定了,在需要对数据进行分组统计的时候,HAVING 可以完成 WHERE 不能完成的任务。

这是因为,在查询语法结构中,WHERE 在GROUP BY之前执行,where过滤的时候还没有分组,所以无法对分组结果进行筛选。HAVING 在 GROUP BY 之后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选,这个功能是 WHERE 无法完成的。

另外,WHERE排除的记录,不再包括在分组中。

区别2:

如果需要通过连接,从关联表中获取需要的数据,WHERE 是先筛选后连接,而 HAVING 是先连接后筛选

这一点,就决定了在关联查询中,WHERE 比 HAVING 更高效。

因为 WHERE 可以先筛选,用一个筛选后的较小数据集和关联表进行连接,这样占用的资源比较少,执行效率也比较高。

HAVING 则需要先把结果集准备好,也就是用未被筛选的数据集进行关联,然后对这个大的数据集进行筛选,这样占用的资源就比较多,执行效率也较低。

小结如下:

优点 缺点
WHERE 先筛选数据再关联,执行效率高 不能使用分组中的计算函数进行筛选
HAVING 可以使用分组中的计算函数 在最后的结果集中进行筛选,执行效率较低

开发中的选择:

WHERE 和 HAVING 也不是互相排斥的,我们可以在一个查询里面,同时使用 WHERE 和 HAVING。

包含分组统计函数的条件用 HAVING,普通条件用 WHERE。这样,我们就既利用了 WHERE 条件的高效快速,又发挥了 HAVING 可以使用包含分组统计函数的查询条件的优点。当数据量特别大的时候,运行效率会有很大的差别。

本文由mdnice多平台发布

http://www.jsqmd.com/news/559562/

相关文章:

  • Java学习路线:从基础到集成SenseVoice-Small语音识别
  • OFA-VE效果展示:教育题库OCR图+标准答案文本逻辑蕴含验证案例
  • 改进人工蜂群算法求解选址问题
  • Unity游戏里接入豆包AI对话?手把手教你实现Doubao-1.5-pro-32k流式聊天(附完整C#脚本)
  • 【springboot】宝塔快速搭建springboot项目并实现HTTPS加密访问
  • 2026年云南隔墙板生产厂家综合实力盘点:本土深耕者的突围之路 - 深度智识库
  • 天地图三维服务全解析:从WMTS到自定义图层(Cesium 1.58+)
  • TCGA数据下载神器gdc-client实战:Win10系统闪退问题一网打尽
  • 告别“瞎测”:如何用Tessent ATPG生成高效测试向量(Pattern)提升芯片良率
  • 别再和抛物线搞混了!用Python+Matplotlib亲手画出悬链线(附完整代码)
  • Sysmac Studio进阶技巧:用MC_GearInPos实现旋转轴精准同步(含ST语言示例)
  • 墨语灵犀效果展示:康沃尔语复兴运动口号→中文新文化运动风格译文
  • GHelper:华硕笔记本轻量替代性能优化与硬件控制工具
  • 2026珠海全护理养老院机构推荐:拱北/香洲/医养结合/智慧养老院,收自理至全护理老人全覆盖 - 品牌推荐官
  • Java八股文知识库构建:基于BERT分割面试题与答案解析
  • 解决QGIS 3.22.4编译后启动报错:从‘dll未加载’到‘plugins缺失’的实战排错记录
  • 告别B站音频提取难题:BilibiliDown工具的创新解决方案
  • Qwen3-TTS-12Hz-1.7B-Base部署教程:Ubuntu 22.04 + CUDA 12.1环境搭建
  • AI机器学习中回归算法的案例
  • SMT贴片机核心构造与PCB组装效率提升全解析
  • 南北阁Nanbeige 4.1-3B效果展示:数学证明题中逻辑链完整性与步骤可追溯性验证
  • GPT-5.4背景下论文代码复现实战指南:从方法论解析到可执行代码的完整路径
  • 【MISC】集对分析法 (SPA) 与熵权法的融合:优化复杂决策的新视角
  • GHelper终极指南:华硕笔记本性能优化的完整解决方案
  • PDF-Parser-1.0问题解决:服务启动失败、PDF解析错误的快速修复方法
  • AI视频分析终极指南:3步快速掌握智能视频内容提取技术
  • Chord - Ink Shadow 跨模态应用探索:连接文本与MATLAB科学计算
  • Python 性能优化避坑指南:回归风险防控、基准压测与安全回滚实战
  • 告别命令行焦虑!用Dockge这个Web UI,5分钟搞定Docker Compose堆栈管理
  • 代码十诫:违反缩进规范者入虚拟地狱