[MySQL#7] CRUD(2) | 更新 | 删除 | 聚合函数 | group by

目录

3. 更新

4. 删除

截断表

日志的作用

5. (实验) 插入查询结果

6. 聚合函数

7. 分组查询


接着上篇文章[MySQL#6] 表的CRUD (1) | Create | Retrieve(查) | where继续讲解~

3. 更新

语法:

UPDATE table_name SET column = expr [, column = expr ...][WHERE ...] [ORDER BY ...] [LIMIT ...]
  • set后面跟的是要重新设定的值,可以是多列。
  • 一般在update的时候必须采用对应where子句进行条件筛选,如果没有的话会把这个表中指定的列全部都更新,这是不合理的。

对查询到的结果进行列值更新

1. 将孙悟空同学的数学成绩变更为 80 分

update exam_result set math=80 where name='孙悟空';

2. 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分

update exam_result set math=60, chinese=70 where name='曹孟德';

3. 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分

更新值为原值基础上变更。
注意据更新,不支持 math += 30 这种语法。

update exam_result set math=math+30 order by chinese+math+english limit 3;

4. 将所有同学的语文成绩更新为原来的 2 倍

update exam_result set chinese=chinese*2;

注意:更新全表的语句慎用!


4. 删除

语法:

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
  • 一般都是拿着条件删除 where
  • 不加条件就是把整表的内容删除了,不过表结构还在。
  • 删表结构drop

删除孙悟空同学的考试成绩

delete from exam_result where name='孙悟空';

测试表

-- 准备测试表
CREATE TABLE for_delete (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);-- 插入测试数据
INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');

我们看到这个id设置了自增,目前已经插入三条记录了,如果在插入一条记录这个id就是4了。

但我们现在不插,先删除


delete from for_delete;

我们看到表的内容已经没有了,但是查看创建表结构这个语句还在,并且自增长也还在。

当新插入一条记录时这个id是4,并且自增长已经变成下一个id值了

说明delete from清空表的方式不会将自增值置0。

清空表还有一种做法叫做截断表。在效果和delete一模一样,但是在细节和原理是有差别的。

截断表

语法:

TRUNCATE [TABLE] table_name

注意:这个操作慎用

  1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
  2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚
  3. 会重置 AUTO_INCREMENT 项

  • 可以看到表结构还在,但是内容已经被清空了。但是这里值得注意的一点是,之前自增长是4,现在truncata清空表后自增从已经没有了。
  • 然后新插一条记录,id变成1了。自增长变成2了
  • 换句话说truncate会重置自增长。而delete并不会。

实际上,TRUNCATEDELETE 还存在一些差异。TRUNCATE 操作是直接将表中的数据清空,并且这个操作不通过事务处理。而 DELETE 和其他 SQL 操作则会在执行时被包装进事务中,再由 MySQL 处理。

事务的影响

事务的使用与否会影响 MySQL 对操作信息的记录方式。MySQL 使用其自身的日志系统来记录数据操作的信息,主要包括以下几种日志:

  • bin.log:存储经过优化的历史 SQL 语句。
  • redo.log:用于在 MySQL 遭遇宕机时能够恢复数据。
  • undo.log:用于存储回滚段信息。
日志的作用
  • bin.log 记录的是历史 SQL 语句,并支持 MySQL 的主从同步机制。当一个数据库执行完某些操作后,可以通过 bin.log 将这些 SQL 同步到另一个数据库,从而使两个数据库的数据保持一致(主从同步), 需要注意,默认情况下 bin.log 是关闭的。
  • redo.log 在 MySQL 遇到故障时提供数据恢复功能。

持久化方式

持久化方式指的是为了能够在系统崩溃后快速恢复数据库数据的方法

将数据以文件的形式写入磁盘,通常有两种方式

  1. 记录历史sql语句
  2. 记录数据本身

Truncate的特点

由于 TRUNCATE 不记录自己的操作到日志中,也不将其作为事务的一部分,因此它仅是简单地清空表中的数据,这样做的结果是 TRUNCATE 的执行速度较快。

  • TRUNCATE 因为其非事务性及不记录日志的特点,在执行速度上有优势
  • 但在数据恢复和一致性方面不如 DELETE

5. (实验) 插入查询结果

语法:

INSERT INTO table_name [(column [, column ...])] SELECT ...

我们要插就插,要删就删,要改就改,要查就查,实际我们也可以将select和insert组合。可以把数据从其他表里面筛选出来,然后插入到另一个表里面。

我们来实现如下一个小实验:

删除表中的重复记录,重复的数据只能有一份

我的做法是

  1. 创建一个和原表一样结构的空表 no_duplicate_table ,
  2. 从原始表中把去重之后的结果筛选出来插入到no_duplicate_table 这个表不就是不重复的吗,
  3. 然后对duplicate_table重命名,no_duplicate_table改名字为duplicate_table。最终不就是完成了duplicate_table去重了吗。
create table no_duplicate_table like duplicate_table;

创建一个完全一样的表,使用like即可

全列插入就不用指定列了

insert into no_duplicate_table select distinct * from duplicate_table;

现在有两个表,一个duplicate_table,一个no_duplicate_table。然后对这两个表做一下重命名

下面两个sql语句可以写一起

rename table duplicate_table to old_duplicata_table;
rename table no_duplicate_table to duplicate_table;

当前我们就完成了去重

❓这里有个细节问题,为什么最后是通过rename方式进行的?

  • 如果今天想把一个文件上传到linux上,比如这个文件是1G上传时间可能是10分钟,我们想把这个文件上传号之后放到一个目录下,我要求它是为原子性方式放入的。
  • 所以一般我们不能直接把文件上传到对应的目录下,因为它上传的过程一种在写入一定不是原子,它太慢了
  • 所以我们把这个文件上传到临时目标下,全部上传之后然后再把文件move到那个目录下
  • 直接move这个动作实际上是原子的。其实对一个文件进行重命名也是同一个道理
  • 所以我们最后通过rename方式,就是单纯的想等一切都就绪了,然后统一放入,更新,生效等! 和冗长的其他动作相比,这个动作非常轻

6. 聚合函数

函数

说明

COUNT([DISTINCT] expr)

返回查询到的数据的数量

SUM([DISTINCT] expr)

返回查询到的数据的总和

AVG([DISTINCT] expr)

返回查询到的数据的平均值

MAX([DISTINCT] expr)

返回查询到的数据的最大值

MIN([DISTINCT] expr)

返回查询到的数据的最小值

  • 这里是为select分组查询做准备的,聚合函数是以查出来的记录为单位帮我们进行数据聚合统计的。这种聚合统计方式通常是产出一个期望的结果,如个数、和、平均值、最大值、最小值。
  • mysql中其实也是有函数的,这个函数可以被直接调用,我们可以在mysql直接使用聚合函数直接对一组结果进行聚合统计。
  • 聚合函数()里面可以是全列,可以是指定列。

示例:

统计班级共有多少同学

select count(*) from exam_result;

统计班级去重后数学成绩有多少

select count(distinct math) from exam_result;

统计数学成绩总分

select sum(math) from exam_result;

统计平均总分

select avg(math+chinese+english) from exam_result;

返回 > 70 分以上的数学最低分

select min(math) from exam_result where math>70;

这里为什么不能把name带上呢?

  • 聚合统计的前提条件,一定是你先把我要聚合的数据先拿出来,然后才能聚合。
  • 做聚合的时候必须保证你要显示的或者你要查询的数据列是被允许聚合的。
  • 最低成绩只有一个,但name每个人都不一样没有办法做聚合。
  • 例如三个人都是 73,那返回谁的名字呢

7. 分组查询

  • 分组是对表中的数据进行分组,分完组之后,在对表中每一组进行相关聚合统计。
  • 而分组的目的是为了进行分组之后,方便进行聚合统计。
  • 如班级里有男生女生,我们相对男生女生成绩分别统计,所以可以对性别进行分组然后在进行成绩的聚合统计。
  • 在select中使用group by 子句可以对指定列进行分组查询。
  • 我们也可以把数据筛选之后再进行分组然后再聚合统计。

语法:

select column1, column2, .. from table group by column;

测试:

准备工作,创建一个雇员信息表(来自oracle 9i的经典测试表)

  • EMP员工表
  • DEPT部门表
  • SALGRADE工资等级表

正是因为我们表有各种不同的信息,因此我们可以对表进行分组查询。

如何显示每个部门的平均工资和最高工资

  • 注意说的是每个部门!我们未来是要分组的,凭什么分组,是由需求来决定的。
  • 这里很明显说的是每个部门,公司员工信息全部都在员工表里,部门号不同员工一定隶属于不同部门,所以我们要显示每一个部门的平均和最高工资。
  • 以前我们找公司最高工资和平均工资。我们是把这一张表当作一个大的组,这一张表在我看来就是一个整体的组,我要统计的就是全公司最高工资和平均工资。

但今天需求是按照组来统计的,根据的emo表中deptno列来进行分组。

select max(sal) 最高, avg(sal) 平均 from emp group by deptno;

  • 首先再次强调group by不是你想用就能用,一定要结合需求
  • 其次group by的核心作用是让我们继续分组聚合统计的,所以你要把需求分清楚然后和group by功能对上,才能用group by。
  • 我们在进行分组统计的时候,group by后面指定列名,指明我们要分组的列是谁,但实际分组是用该列的不同的行数据是否相同进行分组的!
  • 当我们分完组之后,那分组的条件(deptno),组内一定是相同的,因此可以被聚合压缩。

理解:

  • 分组,不就是把一组按照条件拆分多个组,进行各组内的统计。
  • 分组(" 分表 "),不就是把一张表按照条件在逻辑上拆成多个子表,然后分别对各自的子表进行聚合统计。
  • 拆成各个组不就是在逻辑上拆成各个表,然后分别在每个表里做聚合统计,以前我们做的聚合统计是在一张表里进行的
  • 换句话说,只要掌握在一张表里查询,在查询之前先做好分组,后面的工作和思路理解上和之前单表上的聚合统计是一模一样的。

显示每个部门的每种岗位的平均工资和最低工资

需求是每个部门的每种岗位,注定了一定是要分组的,而且还不是分一组,我们首先按部门来分组,然后在按岗位来分组。

在我看来每一张组都是独立的组,在组内做聚合也没什么问题。无非就是比以前多做一份工作,先分组,再聚合。 一张整表内做聚合和多个子表内做聚合,总之还是在一张表内聚合。

select avg(sal) 平均, min(sal) 最低 from emp group by deptno, job;

在想看看是哪个部门的那个岗位的谁的平均工资和最高工资

  • 故意加了一个ename,然后就报错了,说的是ename没有在分组条件内出现不属于分组条件,所以无法进行压缩和聚合。
  • 刚才我们说了分组内一定是某个相同的。走到一个组内一定是部门号相同工作总类相同。
  • 所以相同的列可以进行压缩聚合。现在出来一个名字,名字一定是人人都不同的,没有办法进行聚合,所以直接报错。

一般大原则,只有在group by中出现的具体的列名称,才可以在select后面具体出现

除此之外另一类可以直接出现的就是聚合函数,其余不能在select后面直接跟不是具体分组条件的列。

显示平均工资低于 2000 的部门和它的平均工资

需求是平均工资低于2000的部门,要的是部门,和它的平均工资是多少。

  1. 我们统计出来每一个部门的平均工资(结果先聚合出来)
  2. 在进行判断(对聚合的结果,进行判断)

我要的不是所有部门,我要的是平均工资低于2000的部门,此时要对聚合的结果拿出来判断。我们再说一个语法结构

  • having经常和group by搭配使用
  • 作用是对聚合后的统计数据,进行条件筛选
  • 作用有些像where。
select deptno, avg(sal) 平均 from emp group by deptno having 平均 < 2000;

having 和 where 区别理解?执行顺序?构建对 “结果” 的理解。

首先having和where都是够进行条件筛选,但是它们两个是完全不同的筛选。

  • where是对具体的任意列进行条件筛选
  • having对分组聚合之后的结果进行条件筛选

它们俩的应用场景是完全不同的。换句话说where是先对原始表进行条件过滤,对过滤后的结果在进行分组。

执行顺序:1. 从表拿数据,2. 数据筛选条件,3. 数据分组,4. 分组结果聚合统计,5. 结果筛选。

构建对 “结果” 的理解(小小的建模)

  • 不要单纯的认为,只有磁盘上表结构导入的mysql,真实存在的表,才叫做表。
  • 中间筛选出来的,包括最终结果,在我看来,全部都是逻辑的表
  • 在我看来"MySQL一切皆表",所以未来只要我们能够处理好单表的CURD,所有的sql场景,我们全部都能用统一的方式进行。

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

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

相关文章

RegCM模式运行./bin/regcmMPI报错

1、报错 在运行RegCM时到截止模拟时间段时&#xff0c;不显示successfully&#xff0c;而是报错&#xff1a; MPI_ABORT was invoked on rank 0 in communicator MPI COMMUNICATOR 3 DUP FROM 0 with errorcode 1. NOTE: invoking MPI_ABORT causes Open MPI to kill all MP…

日本也有九九乘法表?你会读吗?柯桥零基础学日语到蓝天广场

日本也有“九九乘法表”&#xff1f; 九九乘法表起源于中国&#xff0c;可以追溯到春秋战国时代。 日本奈良县橿原市境内的“藤原京”遗址&#xff0c;出土了日本目前可找到最古老的“九九乘法表”木简。 根据日本奈良研究所的研究&#xff0c;其内容可能是1300多年前的官吏用…

Python(包和模块)

包 定义 包是将模块以文件夹的组织形式进行分组管理的方法&#xff0c;以便更好地组织和管理相关模块。 包是一个包含一个特殊的__init__.py文件的目录&#xff0c;这个文件可以为空&#xff0c;但必须存在&#xff0c;以标识目录为Python包。 包可以包含子包&#xff08;子…

集群聊天服务器——逻辑梳理

网络聊天服务器项目&#xff0c;该项目分为4个模块&#xff1a; 首先是网络模块&#xff1a;我使用了muduo高性能网络库&#xff0c;解耦合网络与业务之间这两部分代码&#xff0c;可以更加专注与业务的功能开发其次是服务层模块&#xff1a;我使用了基于C11的技术比如绑定器和…

前沿技术与未来发展第一节:C++与机器学习

第六章&#xff1a;前沿技术与未来发展 第一节&#xff1a;C与机器学习 1. C在机器学习中的应用场景 C在机器学习中的应用优势主要体现在高效的内存管理、强大的计算能力和接近底层硬件的灵活性等方面。以下是 C 在机器学习领域的几个主要应用场景&#xff1a; 1.1 深度学习…

项目解决方案:在弱网(低带宽、高延迟、有丢包的网络)环境下建设视频监控平台的设计方案(下)

目录 一、需求分析 1、业务需求分析 2、功能需求分析 二、建设目标 三、设计原则 四、标准规范建设 五、系统架构 1、视频接入管理系统 2、资源管理调度平台 3、视频转码解码服务器 4、媒体输出引擎 5、媒体录制引擎 6、智能联动引擎 7、API开发引擎 六、部署架构 七、产…

操作系统笔记(四)进程间通信,竞争条件与解决方案

进程间通信(IPC) 如何在进程间传递信息? 如何防止两个进程冲突&#xff1f; 如何实现进程执行的先后顺序&#xff1f; 竞争条件&#xff08;Race conditions&#xff09; 竞争条件&#xff08;Race conditions&#xff09; 多个进程访问一个共享数据&#xff0c;而数据最…

jmeter的基本使用

Jmeter基本使用 一、变量 1.用户定义变量 2.用户参数 二、函数 1.计数器${__counter(,)} 2.时间函数 3.加密函数${__digest(,,,,)} 4. 整数相加${__intSum(,,)} 5.属性函数&#xff0c;${__P(,)}、${__property(,,)}、${__setProperty(,,)} 6.V函数 三、获取响应数据…

Go语言基础教程:指针

在 Go 中&#xff0c;函数参数默认是按值传递的。若要改变变量的原始值&#xff0c;可以使用指针。本教程将通过示例代码来演示如何使用值传递和指针传递。 package mainimport "fmt"// 传值方式 - 函数内改变 ival 的值不会影响原始变量 func zeroval(ival int) {i…

2024年优秀的天气预测API

准确、可操作的天气预报对于许多组织的成功至关重要。 事实上&#xff0c;在整个行业中&#xff0c;天气条件会直接影响日常运营&#xff0c;包括航运、按需、能源和供应链&#xff08;仅举几例&#xff09;。 以公用事业为例。根据麦肯锡的数据&#xff0c;在 1.4 年的时间里…

HCIP-HarmonyOS Application Developer V1.0 笔记(二)

类Web开发范式自定义组件基本用法 自定义组件通过element引入到宿主页面。 Props自定义属性 自定义属性支持类型 String&#xff0c;Number&#xff0c;Boolean&#xff0c;Array&#xff0c;Object。 命名规范&#xff1a; 命名时禁止以on、、on:、grab:等保留关键字为开头…

天润融通突破AI客服局限,三大关键提升文本机器人问答效果

近期&#xff0c;AI客服再次登上热搜&#xff0c;引发网友集体吐槽&#xff0c;比如AI客服虽然态度客气&#xff0c;但听不懂客户诉求&#xff0c;回答问题驴唇不对马嘴&#xff0c;解决不了问题...... 更有网友将这些问题升级到&#xff0c;企业就是不想解决问题才交给AI客服…

aarch64-opencv341交叉编译,并在arm上部署helloopencv

背景 当需要在jetson xavier nx或者rk 3562等平台上开发关于视觉检测的工程时&#xff0c;由于arm板子资源不足或者不能联网等原因&#xff0c;通常在虚拟机上利用交叉编译器编译得到可执行程序&#xff0c;然后部署到arm板上。 aarch64-opencv341交叉编译 ubuntu虚拟机中先…

mysql中redolog、binlog

我们中说删库跑路&#xff0c;那么数据库删除后&#xff0c;里面的数据怎么恢复呢&#xff1f; 这里就涉及到了redolog和binlog了 一、什么是存储引擎和缓冲池 存储引擎是 MySQL 中直接与磁盘交互部分。也是存储引擎读写数据的最小单位&#xff0c;一个页里可以有一条或多条…

【分布式技术】分布式事务深入理解

文章目录 概述产生原因关键点 分布式事务解决方案3PC3PC的三个阶段&#xff1a;3PC相比于2PC的改进&#xff1a;3PC的缺点&#xff1a; TCCTCC事务的三个阶段&#xff1a;TCC事务的设计原则&#xff1a;TCC事务的适用场景&#xff1a;TCC事务的优缺点&#xff1a;如何解决TCC模…

字节青训-找出最长的神奇数列

问题描述 小F是一个好学的中学生&#xff0c;今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列&#xff0c;长度为 n。这个序列中的 1 和 0 交替出现&#xff0c;且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如&#xff0c;10101 是一…

华为配置BFD状态与接口状态联动实验

组网图形 图1 配置BFD状态与接口状态联动组网图 BFD简介配置注意事项组网需求配置思路操作步骤配置文件 BFD简介 为了减小设备故障对业务的影响&#xff0c;提高网络的可靠性&#xff0c;网络设备需要能够尽快检测到与相邻设备间的通信故障&#xff0c;以便及时采取措施&…

解压缩工具详解:ZArchive对比解压专家

ZArchiver 和解压专家在手机版解压缩工具市场中都占据着重要地位&#xff0c;深受用户喜爱。 ZArchiver 是一款功能强大的解压缩文件应用程序。它支持创建多种格式的压缩文件&#xff0c;如 7z (7zip)、zip、bzip2 (bz2)、gzip (gz)、XZ、tar 等&#xff1b;同时支持解压众多格…

CPU算法分析LiteAIServer视频智能分析平台噪声检测功能在视频监控中的应用与优势

在视频监控系统中&#xff0c;噪声问题一直是影响视频画面清晰度和可用性的关键因素。这些噪声可能源于多种因素&#xff0c;如低光环境、摄像机传感器的高灵敏度或编码压缩过程中的失真等。为了应对这些挑战&#xff0c;CPU算法分析LiteAIServer引入了噪声检测功能&#xff0c…

MATLAB实现蝙蝠算法(BA)

MATLAB实现蝙蝠算法(BA) 1.算法介绍 蝙蝠算法&#xff08;简称BA&#xff09;是一种受微型蝙蝠回声定位机制启发的群体智能算法&#xff0c;由Xin-She Yang于2010年提出。这种算法模拟了微型蝙蝠通过向周围环境发出声音并监听回声来识别猎物、避开障碍物以及追踪巢穴的行为。…