六.MySQL增删查改

article/2025/6/24 12:40:35

CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除)

一.增 insert

1.单行数据 + 全列插入

语法特点:不指定字段名,按表结构字段顺序依次提供所有值。

注意:字段顺序必须与表定义一致。

into可省略    每个字段都填入值时可以省略values前面的()

2.多行插入 + 指定列插入

优势:插入效率更高,推荐写法。

注意:指定列名后,后面所有的 value_list 数量和顺序必须一致。

多行插入时 用 ,号隔开

3.插入失败则更新 on duplicate key update

我们知道由于 主键 或者 唯一键 对应的值已经存在会导致插入失败 冲突,但我们想更新这行的内容怎么办?

on duplicate key update 字段=新值 ...

on duplicate key update表示如果前面的行插入失败了,说明和表中的某行冲突了,就把冲突的行对应字段值换成后面新值的行,当然新行不能和原表中的行冲突。

insert语句执行结果返回的 受影响行数

1.没有冲突行 插入成功   受影响1行

2.冲突 但值一致不需要改  受影响0行

3.冲突 值不一致 删除冲突行 换新行 受影响2行

情况结果说明
没有冲突正常插入 返回 1 行受影响
主键/唯一键冲突,值不变不插入,也不更新,返回 0 行受影响
主键/唯一键冲突,值有更新冲突行被更新,返回 2 行受影响
UPDATE 中再次引起其他唯一键冲突会报错,事务中止

4.替换 replace into

replace into替换和insert into on duplicate key update更新区别在于,出现冲突时

1.replace into是先删除 再插入新的行

2.insert into duplicate key update只有修改主键时才会删除 再插入新行,不修改主键就只更新对应字段值就可以了。简单来说就是,不修改主键 就可以在原行中进行更新。

最明显的就是插入一个完全一样的行 冲突时,replace into还是会先删除再插入,执行完返回受影响的行数为2

而duplicate并不会进行删除修改,返回受影响的行数为0

replace into:无脑删+插,哪怕值一样也删你;

insert into on duplicate key update:只改有变的,不动就不碰你,改主键才会删+插

维度replace intoinsert into on duplicate key update
基本功能插入数据,如主键/唯一键冲突,则先删除旧行再插入新行插入数据,如冲突,则直接更新已存在的冲突行
是否保留原主键(或 auto_increment)❌ 不保留,重新分配主键 ID(除非显式写入)✅ 保留原主键
是否真执行了 删除+插入✅ 是(底层执行删除再插入)❌ 否(除非你显式更新主键字段,此时也会变成 删除+插入)
是否支持部分字段更新❌ 不支持,必须完整提供所有列(没有 UPDATE 子句)✅ 支持,只需要指定更新哪些列
使用场景推荐✅ 推荐用于缓存表、日志表、临时去重✅ 推荐用于需要维护业务数据一致性、幂等更新操作
性能影响❌ 高(因为删除+插入)✅ 更好(原地更新)
影响行数(无冲突)插入成功:1插入成功:1
影响行数(冲突 + 值未变)删除 + 插入同值:2UPDATE 无变化:0
影响行数(冲突 + 值有变化)删除 + 插入不同值:2UPDATE 成功:2

二.查 select

1.全列查询 select * from

2.指定列查询select 字段,字段 from 

查询多个字段用  ,号隔开

3.查询字段为表达式 select 字段 from 

1.常量表达式(无字段):

所有行都会显示一个值为 10 的列。

2.单字段表达式:

每行qq加 1 后展示。

3.多字段表达式(计算总分):

4.为查询结果指定别名

5.查询结果去重 select distinct 字段 from

去除查询结果中的重复值;

可用于单列或多列组合去重:

条件筛选where

用于限定查询结果,只返回满足指定条件的记录。

返回满足条件的行

一、比较运算符

运算符含义示例
> / <大于 / 小于where score > 60
>= / <=大于等于 / 小于等于where score <= 90
=等于(不推荐用于 null)where name = '张三'
<=>安全等于(支持 null 比较)where a <=> null
!= / <>不等于where name != '张三'
between a and b范围闭区间 [a, b]where score between 80 and 90
in (...)是否在某几个值中where name in ('张三', '李四')
is null是否为空where qq is null
is not null是否非空where qq is not null
like模糊匹配 %任意字符 _一个字符where name like '张%'

二、逻辑运算符

运算符含义示例
and所有条件都成立,结果为 truewhere math > 70 and english > 70
or任一条件成立,结果为 truewhere name = '张三' or name = '李四'
not对结果取反where not (english > 60)

查询操作练习

1.英语不及格的同学

2.语文成绩在 80~90 分之间的同学

3.数学成绩为 58、59、98 或 99 的同学

4.姓“孙”的同学

条件 %:name LIKE '孙%' → 任意“孙某某”

条件 _:name LIKE '孙_' → 精确“孙某”两个字的姓名

5.语文成绩 > 英语成绩的同学

where chinese>english;

6.总分 < 200 的同学

为什么where用别名查询不行呢?

因为select语句的执行顺序是1.form确定数据来源 2.where 筛选条件 3.select计数表达式 生成结果。

在2.where执行时,select中的别名(如 sum)还没被定义出来,自然不能在 where中使用!

7.语文成绩 > 80 并且不姓孙的同学

8.孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80

9.NULL 的查询

结果排序 order by 字段 asc|desc

关键词含义默认
asd升序(从小到大)✅ 是默认排序
desc降序(从大到小)❌ 需手动指定
多列排序先按前列,再按次列(类似 Excel 多重排序)支持

排序练习

 

1.同学及数学成绩,按数学成绩升序显示

2.NULL被视为最小值

3.查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示

4.查询同学及总分,由高到低

为什么这里 order by 别名  就能用别名排序了呢?

因为我们可以说先筛选出符合条件的行再进行排序的 ,也就是order by是select执行完以后排序的,total别名已经存在了。

5.查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示

筛选分页结果 limit 

写法含义示例
limit n取前 n 条记录limit 3
limit s, n下标为s的行开始取 n 条 limit 0,3
limit n offset s同上limit 3 offset 0

分页查询

三.改 update set

update 表名 set 列1 = 新值1, 列2 = 新值2, ... where条件;

 

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

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

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

        1.总成绩升序  limit 3 取3名 order by 总成绩 limit 3;

        2.update 

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

四.删 delete from / truncate

1.删除数据delete from 

delete from 表 where ; 删除满足条件的数据

delete from 表;删除整张表的数据

2.截断表 truncate 表

delete from  和 truncate 有什么区别?

1.delete from 表 where; 可以选择删除一部分的数据。但truncate只能删除整表的数据

2.delete属于事务操作 删除数据后可以撤回,truncate非事务操作 删除数据没有记录 不能撤回 执行更快。

3.delete 删除不会重置auto_increment表的自增计数器,而truncate会重置

        delete   

        truncate

比较项DELETETRUNCATE
删除范围可通过 WHERE 删除部分数据只能整表删除,不支持 WHERE
是否支持事务✅ 支持(InnoDB引擎下可 ROLLBACK 回滚)❌ 不支持事务,操作不可撤回
是否可撤回(回滚)✅ 可撤回❌ 不可撤回
操作类型DML(数据操作语言)DDL(数据定义语言)
删除速度较慢,逐行删除很快,相当于重建表结构
影响自增计数器❌ 不重置 AUTO_INCREMENT✅ 会重置,自增从 1 开始
是否记录 binlog✅ 会记录✅ 会记录(以 DROP 重建方式记录)
触发器(Trigger)支持✅ 支持触发器❌ 不触发触发器
安全性相对安全,可控风险较大,执行立即生效,无法恢复

delete:精确、慢、安全,适合删除部分数据;

truncate:快速、粗暴、不可回滚,适合清空整表。

插入查询结果 (对表中数据去重)

这个表中有重复的数据 我们想对表中数据进行去重怎么操作?

1.创建一个结构相同的空表

2.插入 去重查询的结果到空表

3.最后让插入去重数据的表 改为原表名字

1.创建空白表 no_duplicate_table(结构相同)

create table no_duplicate_table like duplicate_table;

2.插入去重后的数据

insert into no_duplicate_table select distinct * from duplicate_table;

3.用rename table更改表名字

rename table duplicate_table to old_duplicate_table,no_duplicate_table to duplicate_table;

为什么通过rename table替换表名的方式进行操作?

原子操作 安全,中间处理的、转换的、过滤的所有数据,在 rename 这一刻,全部打包替换上去,一键生效,没有任何不一致或过渡状态

聚合函数

函数说明示例特点
count(*)返回记录总数(包括 null)select count(*) from students;最常用,效率高
count(expr)返回非 null 值的数量select count(qq) from students;null 不计入
count(distinct expr)返回去重后非 null 的数量select count(distinct math) from exam_result;可去重
sum(expr)求和(数值型)select sum(math) from exam_result;null 忽略,全部 null 则返回 null
avg(expr)平均值(数值型)select avg(math) from exam_result;null 忽略
max(expr)最大值select max(english) from exam_result;支持数值/字符串
min(expr)最小值select min(math) from exam_result where math > 70;支持数值/字符串

聚合函数特点

特点说明
只能出现在 selecthaving 子句中不能直接在 where 里用
可配合 group by 分组使用每组单独汇总,常见于报表分析
忽略 null(部分函数)sum(), avg(),会跳过 null 值

1. 统计班级共有多少同学

2.统计数学成绩总分

3.统计平均总分

4.返回英语最高分

5.返回 > 90 分以上的数学最低分

分组统计group by

select 语句的执行流程:

where先筛选原数据 group by再进行分组(把一整个表分为多个)having 对分组后的结果再进行筛选  select选择要输出的内容 order by对输出内容进行排序 最后limit控制输出的数量

步骤子句作用说明
1️⃣from读取数据表,形成数据源
2️⃣where对原始数据进行行过滤(不能用聚合函数)
3️⃣group by将数据分组
4️⃣having对分组后的聚合结果进行组过滤
5️⃣select选择需要输出的列、表达式、聚合函数
6️⃣order by对最终结果进行排序
7️⃣limit限制输出记录条数(分页常用)
where: 对 原始数据进行筛选  不能用聚合函数
having:对 分组聚合的结果进行筛选 可以用聚合函数

1.显示每个部门的平均工资和最高工资

        avg()平均 max()最高 group by 部门

select deptno,avg(sal) 平均,max(sal)最大 from EMP  group by deptno;

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

        group by 部门,岗位;可以理解为先以部门进行分组,再以岗位进行分组。

select 里字段,只有两种能出现:

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

一个是聚合函数,一个是 group by 里的字段。

因为SQL 是基于分组后的“每一组”来生成结果行的,必须是一组中共同的东西

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

        1.group by以部门分组 avg算出平均薪资 2.having再对分完组的结果进行筛选

select deptno,avg(sal) 平均 from EMP  group by deptno having 平均<2000;

4.除去SMITH员工 显示平均工资低于2000的部门和它的平均工资

not in(...)不在里面


http://www.hkcw.cn/article/MjaExldsPN.shtml

相关文章

TKernel模块--自定义RTTI,对象句柄,引用计数

TKernel模块–RTTI&#xff0c;对象句柄&#xff0c;引用计数 1.DEFINE_STANDARD_HANDLE(x1, x2) #define DEFINE_STANDARD_HANDLE(C1,C2) DEFINE_STANDARD_HANDLECLASS(C1,C2,Standard_Transient)其中&#xff1a; #define DEFINE_STANDARD_HANDLECLASS(C1,C2,BC) class C1…

关于TongWeb数据源兼容mysql驱动的注意事项

问题现象&#xff1a; TongWeb数据源在采用mysql驱动的国产数据库时&#xff0c;因数据库慢报超时为数据源配置参数的 validation-query-timeout值5秒&#xff0c;而不是期望的maxwait、connectiontimeout值。 The last packet successfully received from the server was 5,0…

CSS专题之水平垂直居中

前言 石匠敲击石头的第 16 次 在日常开发中&#xff0c;经常会遇到水平垂直居中的布局&#xff0c;虽然现在基本上都用 Flex 可以轻松实现&#xff0c;但是在某些无法使用 Flex 的情况下&#xff0c;又应该如何让元素水平垂直居中呢&#xff1f;这也是一道面试的必考题&#xf…

(新)MQ高级-MQ的可靠性

消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消息丢失&#xff0c;所以MQ的可靠性也非常重要。 一、数据持久化 为了提升性能&#xff0c;默认情况下MQ的数据都是在内存存储的临时数据&#xff0c;重启后就会消失。为了保证数据的可靠性&#xff0c;必须…

Microsoft Word使用技巧分享(本科毕业论文版)

小铃铛最近终于完成了毕业答辩后空闲下来了&#xff0c;但是由于学校没有给出准确地参考模板&#xff0c;相信诸位朋友们也在调整排版时感到头疼&#xff0c;接下来小铃铛就自己使用到的一些排版技巧分享给大家。 注&#xff1a;以下某些设置是根据哈尔滨工业大学&#xff08;威…

Linux 基础IO(上)

目录 前言 重谈文件 文件操作 1.打开和关闭 2.对文件打开之后操作 理解文件fd 1.文件fd的分配规则与重定向 2.理解shell中的重定向 3.关于Linux下一切皆文件 关于缓冲区 1.为什么要有缓冲区 2.缓冲区刷新策略的问题 3.缓冲区的位置 前言 本篇到了我们linux中的文件…

单板机8088C语言计划

计划将原来用汇编写的小程序&#xff0c;用C语言重新写一遍 计划2个月能完成 然后再试试&#xff0c;能不能用C写一下固件BootLoad 和一个类似Dos时代的Debug调试器

C++11 语法特性一文详解

文章目录 1. C11 的发展史2. 列表初始化2.1 C98 中使用 {} 的初始化2.2 C11 中使用 {} 进行初始化2.3 std::initializer_list &#xff08;初始化列表&#xff09; 3. 右值引用与移动语义3.1 左值与右值3.1.1 右值分类 3.2 左值引用与右值引用3.2.1 const 左值引用为什么可以绑…

linux基础

参考视频 文章目录 1.网络的三种链接方式2. 目录结构详解3. 远程登陆和远程文件传输4. vi和vim4.1 vi和vim的三种模式4.2 vim快捷键 5. 关机重启和登录注销5.1 关机重启5.2 登录注销 6. 用户管理6.1 添加和删除用户6.2 用户信息6.3 用户组 7. 实用指令7.1 运行级别7.2 找回root…

【MLLM】多模态LLM 2025上半年技术发展(Better、Faster、Stronger)

note 文章目录 note一、新模型趋势任意模态模型推理模型小巧但功能强大的模型专家混合解码器视觉-语言-行动模型 VLA 二、特殊能力视觉语言模型中的目标检测、分割和计数多模态安全模型多模态RAG&#xff1a;检索器和重排器 三、多模态代理四、视频语言模型五、视觉语言模型的新…

python从零开始实现四极场离子轨迹仿真——框架

本篇将主要讲解程序的框架部分。 该程序主要分为三个部分&#xff0c;首先是初始化部分&#xff0c;主要为设置离子质荷比、初始位置、速度。 其次为求解轨迹部分&#xff0c;通过离子位置获取对应位置的电场&#xff0c;并经由空间电荷效应修改电场后&#xff0c;通过数值求解…

YOLO系列中的C3模块解析2025.5.31

YOLO系列中的 C3模块 是YOLOv5引入的核心组件之一&#xff0c;其设计目标是通过轻量化结构和高效特征提取提升模型性能。以下是C3模块的详细解析&#xff1a; 一、C3模块的网络层级结构 C3模块&#xff08;Cross Stage Partial Network with 3 convolutions&#xff09;结合了…

在Cesium中通过geojson和3d tiles分别加载楼宇白膜

一、geojson渲染楼宇白膜&#xff08;不推荐&#xff09; 如果你没有3dtiles文件来加载白膜&#xff0c;只有geojson加载白膜可以通过GeoJsonDataSource来加载白膜&#xff0c;json格式如下。 实现代码如下 <template><div id"cesium_container"></…

CRISPR-Cas系统的小型化研究进展-文献精读137

Progress in the miniaturization of CRISPR-Cas systems CRISPR-Cas系统的小型化研究进展 摘要 CRISPR-Cas基因编辑技术由于其简便性和高效性&#xff0c;已被广泛应用于生物学、医学、农学等领域的基础与应用研究。目前广泛使用的Cas核酸酶均具有较大的分子量&#xff08;通…

【Web API系列】WebTransportSendStream接口深度解析:构建高性能实时数据传输的基石

前言 随着Web应用复杂度的不断提升&#xff0c;传统的HTTP协议在某些场景下&#xff08;如实时游戏、视频流传输&#xff09;逐渐暴露出性能瓶颈。为解决这一问题&#xff0c;W3C提出了WebTransport API&#xff0c;旨在通过基于QUIC协议的低延迟、多路复用传输机制优化实时通…

MySQL中COUNT(*)、COUNT(1)和COUNT(字段名)的深度剖析与实战应用

MySQL中COUNT语句 三种COUNT函数的解析COUNT(*)COUNT(1)COUNT(字段名) 详细性能比较与实测分析性能差异的理论基础实际性能测试案例 实际案例解析案例1&#xff1a;电商平台订单统计案例2&#xff1a;带条件的计数比较案例3&#xff1a;性能优化实例 COUNT函数与索引的关系详解…

VS Code / Cursor 将默认终端设置为 CMD 完整指南

文章目录 &#x1f9ed; 适用范围&#x1f4cc; 背景与问题分析&#x1f6e0; 配置步骤1. 打开设置&#xff08;settings.json&#xff09;2. 添加或更新配置3. 重启终端与编辑器 &#x1f4a1; 补充&#xff1a;支持多个终端配置&#x1f9ef; 常见问题排查✅ 总结 在 Windows…

数据库高可用架构设计:集群、负载均衡与故障转移实践

关键词:数据库高可用,HA架构,数据库集群,负载均衡,故障转移,SQL Server Always On,MySQL InnoDB Cluster,高可用性组,读写分离,灾难恢复 在当今瞬息万变的数字化时代,数据的价值日益凸显,数据库作为承载核心业务数据的基石,其可用性直接决定了业务的连续性与用户…

【C#】一个简单的http服务器项目开发过程详解

这跟安装NoteJs程序运行脚本文件搭建一个简单Http服务器一样&#xff0c;相比起来&#xff0c;它的优点是可以开发的应用是免安装&#xff0c;跨平台的&#xff0c;放在移动盘上便捷的&#xff0c;这里着重讲http服务器实现的过程&#xff0c;以便自主实现特定的功能和服务。 …

谷歌:贝叶斯框架优化LLM推理反思

&#x1f4d6;标题&#xff1a;Beyond Markovian: Reflective Exploration via Bayes-Adaptive RL for LLM Reasoning &#x1f310;来源&#xff1a;arXiv, 2505.20561 &#x1f31f;摘要 通过强化学习 (RL) 训练的大型语言模型 (LLM) 表现出强大的推理能力和紧急反射行为&a…