[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.xdnf.cn/news/1756.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

RT-Thread PIN设备 UART设备

引脚简介 芯片上的引脚一般分为四类&#xff1a;电源、时钟、控制与I/O。 I/O口在使用模式上又分为General Purpose Input Output&#xff08;通用输入/输出&#xff09;&#xff0c;简称GPIO&#xff0c;与功能复用I/O&#xff08;如SPI/I2C/UART等&#xff09;。 大多数MCU…

【element ui系列】分享几种实现el-table表格单选的方法

在实际的开发中&#xff0c;经常会用到从表格中选择一条记录的情况&#xff0c;虽然官方给出的例子&#xff0c;但是给人感觉看起来不明显&#xff0c;于是&#xff0c;在此基础上做了改进。接下来&#xff0c;介绍两种常见的实现方法&#xff1a; 1、采用复选框(checkbox)实现…

FastAPI中如果async def和def 路由的区别

在python的整体生态中&#xff0c;虽然已经有很多库支持了异步调用&#xff0c;如可以使用httpx或者aiohttp代替requests库发起http请求&#xff0c;使用asyncio.sleep 代替time.sleep&#xff0c; 但是依然还有很多优秀的第三方库是不支持异步调用也没有可代替的库&#xff0c…

架构师备考-非关系型数据库

基础理论 CAP 理论 C&#xff08;Consistency&#xff09;一致性。一致性是指更新操作成功并返回客户端完成后&#xff0c;所有的节点在同一时间的数据完全一致&#xff0c;与ACID 的 C 完全不同。A &#xff08;Availability&#xff09;可用性。可用性是指服务一直可用&…

奥云学院应邀参加“第二届中国县域经济投资高峰论坛”

论坛聚焦战略&#xff0c;县域经济迎来新机遇 10月28日&#xff0c;由中国投资协会主办的第二届中国县域经济投资高峰论坛在北京盛大召开。本次论坛以“产业资本助力县域经济高质量发展”为主题&#xff0c;汇聚政府、企业、金融机构和学术专家等多方资源&#xff0c;集中探讨…

飞牛NAS docker compose环境下自建远程桌面服务:rustdesk

&#x1f6e9;️前言 由于国内向日葵、todesk等应用的日渐模糊&#xff0c;恰巧我们已经实现了ipv6的内网穿透&#xff0c;而且在国内ipv6的延迟极低&#xff0c;加上本次介绍的开源远程桌面项目Rustdesk&#xff0c;简直是绝配。 这个项目比较简单&#xff0c;话不多说&…

算法:查找

算法 1. 顺序查找和折半查找1.1 顺序查找1.2 折半查找1.3 索引顺序查找 2. 树表查找2.1 查找2.2 插入 3. 哈希表及哈希查找3.1 哈希造表3.2 处理冲突开放定址法链地址法 3.3 哈希查找 查找是非数值数据处理中一种基本运算&#xff0c;查找运算的效率与查找表所采用的数据结构和…

Istio基本概念及部署

一、Istio架构及组件 Istio服务网格在逻辑上分为数据平面和控制平面。 控制平面&#xff1a;使用全新的部署模式&#xff1a;Istiod&#xff0c;这个组件负责处理Sidecar注入&#xff0c;证书颁发&#xff0c;配置管理等功能&#xff0c;替代原有组件&#xff0c;降低复杂度&…

OpenCV视觉分析之目标跟踪(8)目标跟踪函数CamShift()使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 找到物体的中心、大小和方向。 CamShift&#xff08;Continuously Adaptive Mean Shift&#xff09;是 OpenCV 中的一种目标跟踪算法&#xff0…

gradlew命令打包报错:malformed input off : 50, length : 1

Execution failed for task :app:mapǧ&#xfffd;&#xfffd;Ѫսƪ_officialOfficialReleaseSourceSetPaths. > Could not resolve all files for configuration :app:ǧ&#xfffd;&#xfffd;Ѫսƪ_officialOfficialReleaseRuntimeClasspath. > Failed to trans…

[云] 大数据分析栈(Big Data Analytics Stack)+ Apache Hadoop分布式文件系统(HDFS)+Apache Spark

任务概述 本次作业旨在帮助你理解大数据分析栈&#xff08;Big Data Analytics Stack&#xff09;的工作原理&#xff0c;并通过实际操作加深认识。你将搭建Apache Hadoop分布式文件系统&#xff08;HDFS&#xff09;作为底层文件系统&#xff0c;并将Apache Spark作为执行引擎…

ESP8266 自定义固件烧录-Tcpsocket固件

一、固件介绍 固件为自定义开发的一个适配物联网项目的开源固件&#xff0c;支持网页配网、支持网页tcpsocket服务器配置、支持串口波特率设置。 方便、快捷、稳定&#xff01; 二、烧录说明 固件及工具打包下载地址&#xff1a; https://download.csdn.net/download/flyai…

新能源汽车空调压缩机:科技驱动的冷暖核心

一、新能源汽车空调系统概述 新能源汽车空调系统在车辆中起着至关重要的作用&#xff0c;它直接影响着驾乘人员的舒适度。新能源汽车空调系统主要由制冷系统、加热系统、送风系统、操纵控制系统和空气净化系统等组成。 制冷系统通常由电动压缩机、冷凝器、压力传感器、电子膨…

Leetcode 213. 打家劫舍 II 动态规划

原题链接&#xff1a;Leetcode 213. 打家劫舍 II class Solution { public:int rob(vector<int>& nums) {int n nums.size();if (n 1)return nums[0];if (n 2)return max(nums[0], nums[1]);// 如果偷了第一家&#xff0c;就不能偷最后一家int dp[n - 1];dp[0] …

助力AI智能化时代:全国产化飞腾FT2000+/64+昇腾310B服务器主板

在信息技术快速发展的今天&#xff0c;服务器作为数据处理和存储的核心设备&#xff0c;肩负着越来越重要的使命。全国产化的服务器主板&#xff0c;采用飞腾FT2000/64核处理器&#xff0c;搭配华为昇腾310的AI芯片&#xff0c;提供卓越的性能与可靠性。 核心配置&#xff0c;强…

IO 多路复用技术:原理、类型及 Go 实现

文章目录 1. 引言IO 多路复用的应用场景与重要性高并发下的 IO 处理挑战 2. IO 多路复用概述什么是 IO 多路复用IO 多路复用的优点与适用场景 3. IO 多路复用的三种主要实现3.1 select3.2 poll3.3 epoll三者对比 4. 深入理解 epoll4.1 epoll 的三大操作4.2 epoll 的核心数据结构…

大学英语神器:让GPT帮助你攻克完型填空和阅读理解

这里写目录标题 0、前言一、再来十篇完型填空和阅读理解第一部分&#xff1a;操作指南1.访问链接&#xff1a;ChatGPT 4o国内直接访问地址&#xff1a;https://share.xuzhugpt.cloud/2.上plus的车 第二部分&#xff1a;实操展示①完型填空②阅读理解 二、用户体验 0、前言 学习…

masm汇编debug调试1~100求和

计算123...100并把结果放到寄存器AX里 assume cs:codecode segment start:mov ax,0mov cx,100 s:add ax,cxloop smov ax,4c00hint 21hcode ends end start 效果演示&#xff1a;

LeetCode3226题. 使两个整数相等的位更改次数(原创)

【题目描述】 给你两个正整数 n 和 k。 你可以选择 n 的 二进制表示 中任意一个值为 1 的位&#xff0c;并将其改为 0。 返回使得 n 等于 k 所需要的更改次数。如果无法实现&#xff0c;返回 -1。 示例 1&#xff1a; 输入&#xff1a; n 13, k 4 输出&#xff1a; 2 解释&am…

ubuntu 异常 断电 日志 查看

sudo less /var/log/syslog 搜 Linux version