MySQL--day7--聚合函数

请添加图片描述
(以下内容全部来自上述课程)
在这里插入图片描述

聚合函数

1. 介绍

聚合函数作用于一组数据,并对一组数据返回一个值。
请添加图片描述

  • 聚合函数类型
  • AVG()
  • SUM()
  • MAX()
  • MIN()
  • COUNT()

2. 常见的聚合函数

2.1 AVG / SUM

#1.1 AVG / SUM:只适用于数值类型的字段(或变量)
SELECT AVG(salary),SUM(salary),AVG(salary) * 107 
FROM employees;#如下的操作没有意义
SELECT SUM(last_name),AVG(last_name),SUM(hire_date) 
FROM employees;

2.2 MAX / MIN

#1.2 MAX / MIN :适用于数值类型、字符串类型、日期时问类型的字段(或变量)
SELECT MAX(salary),MIN(salary)
FROM employees;	SELECT MAX(last_name),MIN(last_name),MAX(hire_date),MIN(hire_date) 
FROM employees;

2.3 COUNT

#1.3 COUNT:
# (1)作用:计算指定字段在查询结构中出现的个数(不包含NULL)
#                 107             107            107             107        107        107
SELECT COUNT (employee_id),COUNT (salary) ,COUNT(2 * salary),COUNT (1) , COUNT (2), COUNT (*) 
FROM employees ;SELECT	*	
FROM employees;#如果计算表中有多少条记录,如何实现?
#方式1:COUNT(*)
#方式2: COUNT(1)
#方式3:COUNT(具体字段):不一定对!#(2)注意:计算指定字段出现的个数时,是不计算NULL值的。 
SELECT COUNT(commission_pct) 
FROM employees;SELECT commission_pct 
FROM employees
WHERE commission_pct IS NOT NULL;# (3) 公式:AVG = SUM / COUNT
SELECT AVG(salary),SUM(salary)/COUNT(salary),
AVG(commission_pct),SUM(commission_pct)/COUNT(commission_pct), 
SUM(commission_pct) / 107
FROM employees;	#需求:查询公司中平均奖金率#错误的!
SELECT AVG(commission_pct) 
FROM employees;#正确的:
SELECT SUM(commission_pct) / COUNT(IFNULL(commission_pct,0)), 
AVG(IFNULL(commission_pct,0)) 
FROM employees;

其他:方差、标准差、中位数

3. GROUP BY 的使用

  1. 结论1:SELECT中出现的非组函数的字段必须声明在GROUP BY 中。
    反之,GROUP BY中声明的字段可以不出现在SELECT中。
  2. 结论2:GROUP BY声明在FROM后面、WHERE后面,ORDER BY前面、LIMIT前面
  3. 结论3:MySQL中GROUPBY中使用WITH ROLLUP(总体)
    说明:当使用ROLLUP时,不能同时使用ORDERBY子句进行结果排序,即ROLLUP和ORDERBY是互相排斥的。
#2. GROUP BY 的使用
#需求:查询各个部门的平均工资,最高工资
SELECT department_id,AVG(salary),SUM(salary) 
FROM employees
GROUP BY department_id#需求:查询各个job id的平均工资 
SELECT job_id,AVG(salary) 
FROM employees 
GROUP BY job_id;#需求:查询各个department_id,job_id的平均工资 
SELECT department_id,job_id,AVG (salary) 
FROM employees
GROUP BYdepartment_id,job_id;
#或
SELECT job_id,department_id,AVG (salary) 
FROM employees
GROUP BY job_id,department_id;	
#错误的!
SELECT department_id, job_id,AVG (salary) 
FROM employees
GROUP BY department_id;#结论1:SELECT中出现的非组函数的字段必须声明在GROUP BY 中。
#	反之,GROUP BY中声明的字段可以不出现在SELECT中。	
#结论2:GROUP BY声明在FROM后面、WHERE后面,ORDER BY前面、LIMIT前面#结论3:MySQL中GROUPBY中使用WITH ROLLUP(总体)
SELECT department_id,AVG(salary) 
FROM employees
GROUP BY department_id 
WITH ROLLUP;#需求:查询各个部门的平均工资,按照平均工资升序排列 
SELECT department_id,AVG(salary) avg_sal 
FROM employees
GROUP BY department id
ORDER BY avg_sal AsC;	#说明:当使用ROLLUP时,不能同时使用ORDERBY子句进行结果排序,即ROLLUP和ORDERBY是互相排斥的。
#错误的:
SELECT department_id,AVG(salary) avg_sal 
FROM employees
GROUP BY department_id 
WITH ROLLUP 
ORDER BY avg_sal ASC;

4. HAVING的使用

  1. 要求1:如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。

  2. 要求2:HAVING必须声明在GROUP BY 的后面。

  3. 要求3:开发中,我们使用HAVING的前提是SQL中使用了GROUP BY。

  4. 结论:当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中。

  5. 当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以。

  6. 但是,建议大家声明在WHERE

WHERE与AVING 的对比

  1. 从适用范围上来讲,HAVING的适用范围更广。
  2. 如果过滤条件中没有聚合函数:这种情况下, WHERE的执行效率要高于HAVING
#3.HAVING的使用(作用:用来过滤数据的)
#练习:查询各个部门中最高工资比10000高的部门信息#错误的写法:
SELECT department_id,MAX(salary) 
FROM employees
WHERE MAX(salary)>10000 
GROUP BY department id;#要求1:如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。
#要求2:HAVING必须声明在GROUP BY 的后面。
#正确的写法:
SELECT department_id,MAX(salary) 
FROM employees
GROUP BY department id
HAVING MAX(salary)>10000;# 要求3:开发中,我们使用HAVING的前提是SQL中使用了GROUP BY。
#练习:查询部门id为10,20,30,40这4个部门中最高工资比10000高的部门信息
#方式1: 推荐,执行效率高于方式2
SELECT department_id,MAX (salary) 
FROM employees
WHERE department_id IN(10,20,30,40) 
GROUP BY department_id
HAVING MAX(salary)>10000;#方式2:
SELECT department_id,MAX(salary) 
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000 AND department_id IN(10,20,30,40) ;#结论:	当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中。	
#	当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以。但是,建议大家声明在WHERE	
/*
WHERE与AVING 的对比
1.从适用范围上来讲,HAVING的适用范围更广。
2.如果过滤条件中没有聚合函数:这种情况下, WHERE的执行效率要高于HAVING
*/

5. SQL底层执行原理

5.1 SELECT 语句的完整结构

#sq192语法:
/*
SELECT .......··.(存在聚合函数) 
FROM .........
WHERE 多表的连接条件AND不包含聚合函数的过滤条件 
GROUP BY......
HAVING 包含聚合函数的过滤条件 
ORDER BY ....,...(ASC / DESC )
LIMIT	...	
*/#sq199语法:
/*
SELECT ....,....,....(存在聚合函数)
FROM ... (LEFT / RIGHT) JOIN ....ON 多表的连接条件
(LEFT / RIGHT) JOIN ... ON.... 
WHERE 不包含聚合函数的过滤条件 
GROUP BY.......
HAVING 包含聚合函数的过滤条件 
ORDER BY ....,...(ASC / DESC ) 
LIMIT ........
*/

5.2 SQL 语句的执行顺序

请添加图片描述

#4.2 SQL语句的执行过程:
#FROM.......-> ON ->(LEFT/RIGNT JOIN) -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -># ORDER BY -> LIMIT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Java] 封装

目录 1. 什么是封装 2. 访问修饰符 3. 封装的好处 4. 封装的步骤 5. 包 5.1 什么是包 5.2 导入包中的类 5.3 自定义包 5.4 常用的包 6. static关键字 6.1 static修饰成员变量 6.2 static修饰成员方法 6.3 Static修饰成员变量初始化 7. 代码块 7.1 普通代码块 …

Axure元件动作五:设置列表选中项

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 演示视频: Axure设置列表选中项 课程主题:设置列表选中项 主要内容:下拉列表选项、值、变量值、焦…

Spring框架--IOC技术

一、Spring框架的介绍 1、Spring框架的概述 Spring 是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003年兴起的一个轻量级的Java开发框架,由 Rod Jo…

Flannel后端为UDP模式下,分析数据包的发送方式——tun设备(三)

在分析 Kubernetes 环境中 Flannel UDP 模式的数据包转发时,我们提到 flannel.1 是一个 TUN 设备,它在数据包处理中起到了关键作用。 什么是 TUN 设备? TUN 设备(Tunnel 设备)是 Linux 系统中一种虚拟网络接口&#x…

2025深圳国际无人机展深度解析:看点、厂商与创新亮点

2025深圳国际无人机展深度解析:看点、厂商与创新亮点 1.背景2.核心看点:技术突破与场景创新2.1 eVTOL(飞行汽车)的规模化展示2.2 智能无人机与无人值守平台2.3 新材料与核心零部件革新2.4 动态演示与赛事活动 3.头部无人机厂商4.核…

【Jitsi Meet】(腾讯会议的平替)Docker安装Jitsi Meet指南-使用内网IP访问

Docker安装Jitsi Meet指南-使用内网IP访问 下载官方代码配置环境变量复制示例环境文件并修改配置:编辑 .env 文件: 修改 docker-compose.yml 文件生成自签名证书启动服务最终验证 腾讯会议的平替。我们是每天开早晚会的,都是使用腾讯会议。腾…

使用Spring Boot和Spring Security结合JWT实现安全的RESTful API

使用Spring Boot和Spring Security结合JWT实现安全的RESTful API 引言 在现代Web应用中,安全性是至关重要的。Spring Boot和Spring Security提供了强大的工具来保护我们的应用程序,而JWT(JSON Web Token)则是一种轻量级的认证和…

对神经正切核的理解和推导(1)

声明: 本文是对Neural Tangent Kernel (NTK)基础推导 - Gearlesskai - 博客园文章内容的理解与推导,里面很多东西对我这种新手来说不太好理解,所以我力求通过这种方式理解文章的大部分内容。希望我的理解可以帮助你更…

基于 STC89C52 的养殖场智能温控系统设计与实现

摘要 本文提出一种基于 STC89C52 单片机的养殖场环境温度智能控制系统,通过集成高精度温度传感器、智能执行机构及人机交互模块,实现对养殖环境的实时监测与自动调控。系统具备温度阈值设定、超限报警及多模式控制功能,可有效提升养殖环境稳定性,降低能耗与人工成本。 一…

微信小程序调试

一、寻找答案 1. 创建小程序 https://zhuanlan.zhihu.com/p/1906013675883561860 2. 若有后端接口,需要调试 https://blog.csdn.net/animatecat/article/details/126949749 3. 比较细教程, 搭建修改配置 https://zhuanlan.zhihu.com/p/1893281527112136235 4. 查找…

使用DeepSeek实现数据处理

一、核心能力全景图 Ctrl+/ 唤醒智能助手,支持以下数据处理场景: 🧹 数据清洗与预处理📈 统计分析与可视化🤖 机器学习建模🚀 大数据性能优化📊 自动化报告生成⚡ 实时流数据处理二、高频场景实战(附魔法口令) 场景1:数据清洗自动化(Python示例) 口令: 处…

符合Python风格的对象(使用 __slots__ 类属性节省空间)

使用__slots__ 类属性节省空间 默认情况下,Python 在各个实例中名为__dict__ 的字典里存储实例属 性。如 3.9.3 节所述,为了使用底层的散列表提升访问速度,字典会消 耗大量内存。如果要处理数百万个属性不多的实例,通过__slots__…

民宿管理系统5

管理员管理&#xff1a; 新增管理员信息&#xff1a; 前端效果&#xff1a; 前端代码&#xff1a; <body> <div class"layui-fluid"><div class"layui-row"><div class"layui-form"><div class"layui-form-i…

​腾讯地图轨迹云:重构位置管理的数字神经中枢

——从轨迹追踪到智能决策&#xff0c;开启产业互联网新篇章 在数字经济与实体经济深度融合的今天&#xff0c;位置服务已成为企业数字化转型的核心基础设施。无论是物流运输中的车辆调度、共享经济中的设备管理&#xff0c;还是智慧城市中的交通优化&#xff0c;精准的轨迹数…

rce命令执行原理及靶场实战(详细)

2. 原理 在根源上应用系统从设计上要给用户提供一个指定的远程命令操作的接口。漏洞主要出现在常见的路由器、防火墙、入侵检测等设备的web管理界面上。在管理界面提供了一个ping服务。提交后&#xff0c;系统对该IP进行ping&#xff0c;并且返回结果。如果后台服务器并没有对…

GeoTools 将 Shp 导入PostGIS 空间数据库

前言 ❝ GeoTools 在空间数据转换处理方面具有强大的能力&#xff0c;能够高效、简洁的操纵 Shp 数据。特别是与空间数据库PostGIS 相结合&#xff0c;更能展示出其空间数据处理的优势&#xff0c;借助 GeoTools&#xff0c;我们可以实现 Shp 数据高效入库。 本文上接系列文章 …

基于SpringBoot+Vue的家政服务系统源码适配H5小程序APP

市场前景 随着社会经济的发展和人口老龄化的加剧&#xff0c;家政服务需求不断增长。我国65岁及以上人口增长较快&#xff0c;2022年我国65岁及以上老年人数量达2.1亿人&#xff0c;占比较2016年增长4.1个百分点&#xff0c;达14.9%。我国65岁及以上人口数量庞大&#xff0c;老…

《企业级日志该怎么打?Java日志规范、分层设计与埋点实践》

大家好呀&#xff01;&#x1f44b; 今天我们要聊一个Java开发中超级重要但又经常被忽视的话题——日志系统&#xff01;&#x1f4dd; 不管你是刚入门的小白&#xff0c;还是工作多年的老司机&#xff0c;日志都是我们每天都要打交道的"好朋友"。那么&#xff0c;如…

1Panel vs 宝塔面板:现代化运维工具的全方位对比

1Panel vs 宝塔面板对比分析 1Panel 和 宝塔面板&#xff08;BT-Panel&#xff09;都是服务器管理工具&#xff0c;旨在简化 Linux 服务器的运维工作&#xff0c;但它们在设计理念、功能侧重点和技术实现上有明显差异。以下从多个维度对两者进行对比分析&#xff1a; 1. 定位与…

怎么开发一个网络协议模块(C语言框架)之(四) 信号量初始化

// 原始代码 /* gVrrpInstance.sem = OsixCreateBSem(OSIX_SEM_Q_PRIORITY, OSIX_SEM_FULL); */ gVrrpInstance.sem = OsixCreateMSem(OSIX_SEM_Q_FIFO | OSIX_SEM_DELETE_SAFE); if (gVrrpInstance.sem == NULL) {printf("[VRRP]:vrrp init error, failed to create vrrp…