MySQL 08 章——聚合函数

聚合函数是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值

一、聚合函数介绍

(1)AVG和SUM函数

  1. 举例:
  2. 只适用于数值类型的字段(或变量)
  3. AVG函数和SUM函数在计算空值时,会自动把NULL过滤掉

(2)MIN和MAX函数

  1. 举例:
  2. 适用于数值类型、字符串类型、日期时间类型的字段(变量)

(3)COUNT函数

  1. 举例:
  2. 作用:计算指定字段在查询结构中出现的个数,如果值为NULL就不会被计算进去
  3. 如果计算表中有多少条记录,如何实现?
    1. COUNT(*)
    2. COUNT(1)
    3. COUNT(具体字段):不一定对!因为字段中的NULL值不会被计算进去
  4. AVG = SUM / COUNT,因为这三个函数都过滤掉了NULL值,所以
  5. 需求:查询公司中的平均奖金率
  6. 如果需要统计表中的记录数,使用COUNT(*)、COUNT(1)、COUNT(具体字段)哪个效率更高呢?
    1. 如果使用的是MyISAM存储引擎,则三者的效率相同,都是O(1)
    2. 如果使用的是InnoDB存储引擎,则三者效率:COUNT(*) = COUNT(1) > COUNT(具体字段)

二、GROUP BY

(1)基本使用

  1. 需求:查询各个部门的平均工资、最高工资

(2)使用多个列分组

  1. 需求:查询各个部门中,各个工种的平均工资
  2. 注意:SELECT中出现的非聚合函数的字段,必须声明在GROUP BY中;反之,GROUP BY中声明的字段可以不出现在SELECT中
  3. GROUP BY声明在FROM后面,WHERE后面,ORDER BY前面,LIMIT前面

(3)GROUP BY中使用WITH ROLLUP

  1. 使用WITH ROLLUP关键字之后,在所有查询出的记录之后,增加了一条记录。该记录就是汇总行
  2. 当使用WITH ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即WITH ROLLUP和ORDER BY是相互排斥的

三、HAVING

(1)基本使用

  1. HAVING的作用:是用来过滤数据的
  2. 练习:查询各个部门中最高工资比10000高的部门信息
  3. 如果过滤条件中使用了聚合函数,则必须用HAVING来替换WHERE,否则报错
  4. HAVING必须声明在GROUP BY的后面
  5. 开发中,使用HAVING的前提是使用了GROUP BY

(2)WHERE和HAVING的对比

  1. 练习:查询部门id为10,20,30,40这4个部门中最高工资比10000高的部门信息(两种方式)
  2. 推荐使用方式一,执行效率高于方式二
  3. 当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中。当过滤条件中没有聚合函数时,则此过滤条件声明在HAVING或WHERE中都可以。但是建议声明在WHERE中,效率更高
  4. WHERE和HAVING对比:
    1. 从适用范围上来讲,HAVING的适用范围更广
    2. 如果过滤条件中没有聚合函数,这种情况下,WHERE的效率要高于HAVING

四、SELECT的执行过程

(1)查询的结构

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

(2)SELECT执行顺序

  1. FROM ...JOIN...,先对两张表进行笛卡尔积。ON用来去掉不应该关联的数据
  2. 关注左外连接和右外连接
  3. WHERE过滤数据
  4. 对过滤后的数据进行分组(GROUP BY),然后执行HAVING
  5. SELECT选出字段
  6. ORDER BY排序,然后分页查询

(3)SQL的执行原理

  1. SELECT 是先执行 FROM 这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:
    (1)首先先通过 CROSS JOIN 求笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1
    (2)通过 ON 进行筛选,在虚拟表 vt1-1 的基础上进行筛选,得到虚拟表 vt1-2
    (3)添加外部行。如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3
    (4)当然如果我们操作的是两张以上的表,还会重复上面的步骤,直到所有表都被处理完为止。这个过程得到是我们的原始数据

  2. 当我们拿到了查询数据表的原始数据,也就是最终的虚拟表 vt1,就可以在此基础上再进行 WHERE 阶段。在这个阶段中,会根据 vt1 表的结果进行筛选过滤,得到虚拟表 vt2

  3. 然后进入第三步和第四步,也就是 GROUP 和 HAVING 阶段。在这个阶段中,实际上是在虚拟表 vt2 的基础上进行分组和分组过滤,得到中间的虚拟表 vt3 和 vt4

  4. 当我们完成了条件筛选部分之后,就可以筛选表中提取的字段,也就是进入到 SELECT 和 DISTINCT 阶段首先在 SELECT 阶段会提取想要的字段,然后在 DISTINCT 阶段过滤掉重复的行,分别得到中间的虚拟表 vt5-1 和 vt5-2

  5. 当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是 ORDER BY 阶段,得到虚拟表 vt6

  6. 最后在 vt6 的基础上,取出指定行的记录,也就是 LIMIT 阶段,得到最终的结果,对应的是虚拟表 vt7

  7. 当然我们在写 SELECT 语句的时候,不一定存在所有的关键字,相应的阶段就会省略

五、课后练习

  1. 查询公司员工工资的最大值、最小值、平均值、总和
    SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary)
    FROM employees;
  2. 查询各job_id的员工工资的最大值、最小值、平均值、总和
    SELECT job_id,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
    FROM employees
    GROUP BY job_id;
  3. 选择具有各个job_id的员工人数
    SELECT job_id,COUNT(*) "workers"
    FROM employees
    GROUP BY job_id;
  4. 查询员工最高工资和最低工资的差距(DIFFERENCE)
    SELECT MAX(salary) - MIN(salary) "DIFFERENCE"
    FROM employees;
  5. 查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
    SELECT manager_id,MIN(salary)
    FROM employees
    WHERE manager_id IS NOT NULL
    GROUP BY manager_id
    HAVING MIN(salary) >= 6000;
  6. 查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序
    SELECT department_name,location_id,COUNT(*),AVG(salary) avg_sal
    FROM departments d LEFT OUTER JOIN employees e
    ON d.department_id = e.department_id
    GROUP BY department_name,location_id#select中出现的非聚合函数的字段,必须出现在group by中
    ORDER BY avg_sal DESC;
  7. 查询每个部门的部门名,以及它对应工种的工种名和该工种的最低工资
    SELECT department_name,job_id,MIN(salary)
    FROM departments d LEFT OUTER JOIN employees e
    ON d.department_id = e.department_id
    GROUP BY department_name,job_id;

该笔记根据尚硅谷的MySQL课程整理 

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

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

相关文章

HTML——73.button按钮

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>button按钮</title></head><body><!--button按钮&#xff1a;1.button按钮type属性&#xff1a;可以设置三个值&#xff0c;submit/reset/button,含义…

Java 数据库连接 - Sqlite

Java 数据库连接 - Sqlite PS: 1. 连接依赖库&#xff1a;[sqlite-jdbc-xxx.jar](https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc)(根据连接的数据库版本选择) 2. 支持一次连接执行多次sql语句&#xff1b; 3. 仅本地连接&#xff1b;使用说明&#xff1a; publ…

NCCL源码解读3.1:double binary tree双二叉树构建算法,相比ring环算法的优势

目录 一、双二叉树出现的原因 二、双二叉树介绍 三、双二叉树大规模性能 四、双二叉树源码解读 双二叉树注意事项 核心逻辑 源码速递 视频分享在这&#xff0c;未完待补充&#xff1a; 3.1 NCCL源码解读双二叉树构建算法&#xff0c;double binary tree相比ring环算法的…

深入理解 JVM 的垃圾收集器:CMS、G1、ZGC

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

四、VSCODE 使用GIT插件

VSCODE 使用GIT插件 一下载git插件与git Graph插件二、git插件使用三、文件提交到远程仓库四、git Graph插件 一下载git插件与git Graph插件 二、git插件使用 git插件一般VSCode自带了git&#xff0c;就是左边栏目的图标 在下载git软件后vscode的git插件会自动识别当前项目 …

【NLP高频面题】用RNN训练语言模型时如何计算损失?

用RNN训练语言模型时如何计算损失&#xff1f; 重要性&#xff1a;★ 以“you say goodbye and i say hello.”为例&#xff0c;将其作为具体的数据传入网络&#xff0c;此时 RNNLM 进行的处理如图所示&#xff1a; RNNLM 可以“记忆”目前为止输入的单词&#xff0c;并以此…

Spring Cloud Security集成JWT 快速入门Demo

一、介绍 JWT (JSON Web Token) 是一种带有绑实和信息的简单标准化机制&#xff0c;在信息通信中用于验证和信息传递。尤其在应用中使用Spring Cloud实现分布式构建时&#xff0c;JWT可以作为一种无状态验证原理的证明。 本文将进一步描述如何在Spring Cloud Security中集成JW…

【机器学习】【朴素贝叶斯分类器】从理论到实践:朴素贝叶斯分类器在垃圾短信过滤中的应用

&#x1f31f; 关于我 &#x1f31f; 大家好呀&#xff01;&#x1f44b; 我是一名大三在读学生&#xff0c;目前对人工智能领域充满了浓厚的兴趣&#xff0c;尤其是机器学习、深度学习和自然语言处理这些酷炫的技术&#xff01;&#x1f916;&#x1f4bb; 平时我喜欢动手做实…

unity学习5:创建一个自己的3D项目

目录 1 在unity里创建1个3D项目 1.1 关于选择universal 3d&#xff0c;built-in render pipeline的区别 1.2 创建1个universal 3d项目 2 打开3D项目 2.1 准备操作面板&#xff1a;操作界面 layout,可以随意更换 2.2 先收集资源&#xff1a;打开 window的 AssetStore 下载…

Vue3 内置组件之component

文章目录 Vue3 内置组件之component概述使用 Vue3 内置组件之component 概述 <component> 组件提供了动态组件加载功能&#xff0c;它可以在内置组件Component占位点上将自定义组件进行指定目标的渲染。比如页面中常见的Tabs选项卡效果就可以利用动态组件加载功能轻松实…

学习路之VScode--自定义按键写注释(插件)

1. 安装 "KoroFileHeader" 插件 首先&#xff0c;在 VScode 中搜索并安装名为 "KoroFileHeader" 的插件。你可以通过在扩展商店中搜索插件名称来找到并安装它。 2. 进入 VScode 设置页面 点击 VScode 左下角的设置图标&#xff0c;然后选择 "设置&q…

C++编程库与框架实战——ZeroMQ消息队列

一,消息队列简介 消息队列是一种进程间的通信机制,用于在不同进程之间同步消息。通信期间,一个进程将消息放入该队列中,然后另一个进程就可以从该队列中取出这条消息。 消息队列可以是异步的,即发送方无需等待接收方的确认或回复就可以立即执行下一步的操作。 消息队列…

seata分布式事务详解(AT)

目录 1、分布式事务特点 1.1、分布式事务是什么 1.2、分布式事务产生的场景 2、使用seata解决分布式事务 2.1、认识seata 2.1.1、seata是什么 2.1.2、seata三大角色 2.1.3、seata模式 2.1.3.1、AT模式 AT模式实现&#xff1a; 2.2、如何使用seata 3、seata基于idea软…

C语言渗透和好网站

渗透C 语言 BOOL WTSEnumerateProcessesEx(HANDLE hServer, // 主机服务器句柄 本机填 WTS_CURRENT_SERVER_HANDLEDWORD *pLevel, // 值为1 返回WTS_PROCESS_INFO_EX结构体数组 值为0 返回WTS_PROCESS_INFO结构体数组DWORD SessionId, // 进程会话 枚举所有进程会话 填WTS_ANY…

机场安全项目|基于改进 YOLOv8 的机场飞鸟实时目标检测方法

目录 论文信息 背景 摘要 YOLOv8模型结构 模型改进 FFC3 模块 CSPPF 模块 数据集增强策略 实验结果 消融实验 对比实验 结论 论文信息 《科学技术与工程》2024年第24卷第32期刊载了中国民用航空飞行学院空中交通管理学院孔建国, 张向伟, 赵志伟, 梁海军的论文——…

Flutter Android修改应用名称、应用图片、应用启动画面

修改应用名称 打开Android Studio&#xff0c;打开对应项目的android文件。 选择app下面的manifests->AndroidManifest.xml文件&#xff0c;将android:label"bluetoothdemo2"中的bluetoothdemo2改成自己想要的名称。重新启动或者重新打包&#xff0c;应用的名称…

【paddle】初次尝试

张量 张量是 paddlepaddle&#xff0c; torch&#xff0c; tensorflow 等 python 主流机器学习包中唯一通货变量&#xff0c;因此应当了解其基本的功能。 张量 paddle.Tensor 与 numpy.array 的转化 import paddle as paddle import matplotlib.pyplot as plt apaddle.to_t…

VBA 64位API声明语句第005讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

Redis(二)value 的五种常见数据类型简述

目录 一、string&#xff08;字符串&#xff09; 1、raw 2、int 3、embstr 二、hash&#xff08;哈希表&#xff09; 1、hashtable 2、ziplist 三、list&#xff08;列表&#xff09; ​编辑 1、linkedlist 2、ziplist 3、quicklist&#xff08;redis 3.2后的列表内…

Linux硬盘分区 --- 挂载分区mount、卸载分区umount、永久挂载

四、挂载分区 1.查看分区信息 在挂载分区之前&#xff0c;需要先确定要挂载的分区设备名称。可以使用命令lsblk来查看系统中的所有块设备及分区情况。例如&#xff0c;可能会看到类似/dev/sda1、/dev/sdb2等的设备名称&#xff0c;它们分别代表不同的硬盘分区。 2.创建挂载点…