MySQL:基础增删查改
MySQL:基础增删查改
- 插入
- 插入冲突
- 查询
- distinct
- where
- order by
- limit
- 删除
- delete
- truncate
- 更新
插入
- 基本插入语法:
insert [into] 表名 (列1, 列2 ...) values (值1, 值2 ...);
into可以省略(列1, 列2 ...)与后面的(值1, 值2)一一对应- 如果插入时数据完全按照表从左往右的顺序,
(列1, 列2 ...)可省略
示例:
create table students(
id int unsigned primary key auto_increment,
sn int not null unique comment '学号',
name varchar(20) not null,
tel varchar(20)
);
一次性指定所有值,那么省略(列1, 列2 ...)部分:
insert into students values (100, 20240001, '张三', NULL);
插入时只指定部分值,那么就需要通过(列1, 列2 ...)来指定:
insert into students (id, sn, name) values (101, 20240006, '小明');
也可以一次性插入多行,每一行的数据用(值1, 值2 ...)表示,不同行数据之间用逗号隔开:
insert into students (id, sn, name) values
(105, 20240052, '小张'),
(109, 20240096, '小李');
此处换行只是为了方便展示,换行对SQL语句的效果不会造成影响。
之前的插入结果如下:

插入冲突
在插入数据时,有可能因为主键和唯一键的存在,导致冲突而插入失败。此时可以利用插入替换,或者直接替换。
插入替换:
- 插入替换语法:
insert ... on duplicate key update 列1=值1, 列2=值2 ...;
其中insert ...表示一个完整的插入语句,该语句的作用是:insert语句如果冲突,则执行后面的列1=值1, 列2=值2 ...进行值替换。
示例:
insert into students (id, sn, name) values (101, 20240066, '昊天')
on duplicate key update sn=20240066;
之前插入时,已经插入了(101, 20240006, '小明'),所以这个插入会发生主键冲突,导致插入失败。而on duplicate key update sn=20240066的作用就是,如果插入失败,说明主键已经存在,那么修改其学号为20240066。
最后该学生的sn从20240006变成了20240066:

插入替换的作用是:插入失败时,只替换部分指定的值,保留部分原先的值。
直接替换:
插入时,也可以直接替换,只需把insert改为replace即可:
replace [into] 表名 (列1, 列2 ...) values (值1, 值2 ...);
这种直接替换,如果插入时发生冲突,会直接删除原先的行,重新插入当前行。
replace into students (id,sn,name) values (109, 20240100, '小杨');
执行以上语句时,由于已经有id=109的数据存在,会发生主键冲突,此时会直接删除原先的行,插入这一行:

整个id=109的数据,都变成刚刚的内容了,就好像执行了一个insert语句。
查询
示例表格:
create table exam_result (
id ind unsigned primary akey auto_increment,
name varchar(20) not null comment '同学姓名',
chinese float default 0.0 comment '语文成绩',
math float default 0.0 comment '数学成绩',
english float default 0.0 comment '英语成绩'
);
示例数据:
insert into exam_result (name, chinese, math, english) values
('小明', 67, 98, 56),
('小红', 87, 78, 77),
('小翠', 88, 98, 90),
('小朱', 82, 84, 67),
('小雨', 55, 85, 45),
('小鑫', 70, 73, 78),
('小彤', 75, 65, 30),
('小朵', NULL, NULL, NULL);
- 基本查询语法
select 表达式1, 表达式2 ... from 表名;
此处的表达式含义非常广,它可以是列名,通配符*,或者基本字面量,计算式等。
- 通配符
*做表达式,输出所有的列

测试表中,有id, name, chinses, math, english列,通过*全部都查询出来了
- 列名做表达式,输出指定的列

此处的表达式为name, chinese,所以只输出这两列。
- 基本字面量与计算式做表达式,输出计算结果

此处的'name'与刚刚的name不同,此处的''name'是一个字符串,而不是列名,所以输出的是name字符串本身。而第三列用1024 + 2048做表达式,输出的就是计算结果。
在计算表达式时,如果指定了表,那么这个表有几行,表达式就计算多少次。如果表达式中没有依赖表中的列,而是单纯的计算,那么可以不指定表名:

这次的查询中,没有指定表名,也没有使用表的列,那么表达式默认只计算一次,输出一行。
计算的意义在于:列与列之间同样可以计算!

第二列中,通过chinese + english + math计算出了总分。
但是这样看表的话,chinese + english + math这个整体作为列名有点长了,此时可以使用as来对列重命名。
- 使用
as对列重命名:
select 表达式1 as 新名1, 表达式2 as 新名2 ... from 表名;
as也可以省略:
select 表达式1 新名1, 表达式2 新名2 ... from 表名;

此处使用chinese + english + math as total将总分的整体重命名了,最后输出结果更加直观,当然也可以省略as,写为:chinese + english + math total。
distinct
直接查询math列:

此处出现了两个98,能否对查询结果去重?
此时就需要用到distinct关键字。
- 使用
distinct对查询结果去重:
select distinct 表达式1, 表达式2 ... from 表名;

这次查询就只有一个98了。
where
观察一下之前的查询,会发现我们一直在对列做限制,而每次查询出来的行数目是一样的。如果说我们想对数据的值做限制,比如“数学成绩大于等于60分”,那么就需要where子句。
- 通过
where子句来查询符合要求的数据:
select 表达式1, 表达式2 ... from 表名 where 表达式;
表达式中常用的运算符如下:
| 运算符 | 说明 |
|---|---|
>,>=,<,<= | 大于,大于等于,小于,小于等于 |
= | 等于,任何值与NULL比较结果为NULL |
<=> | 等于,其他值与NULL比较为false,NULL与NULL比较为true |
!=,<> | 不等于 |
between x and y | 范围匹配[x, y]闭区间,如果x <= value <= y返回true |
in (option1, option2 ...) | 如果是其中一个option返回true |
is null | 如果是NULL返回true |
is not null | 如果不是NULL返回true |
like | 模糊匹配,%表示多个字符,_表示一个字符 |
not like | 反向模糊匹配,%表示多个字符,_表示一个字符 |
and | 逻辑与 |
or | 逻辑或 |
not | 逻辑取反 |
如果你学过任意编程语言,上表格很好理解。另外的,以上所有操作都可以通过小括号()调整优先级。
- 查询英语小于
60分的同学:
select name, english from exam_result where english < 60;

- 查询数学成绩为临界值(
58, 59, 98, 99)的学生:
select name, math from exam_result where math in (58, 59, 98, 99);

- 查询数学成绩大于成绩的同学:
select name, math, english from exam_result where math > english;

- 查询总分
200以上的同学:
select name, math + english + chinese as total from exam_result
where math + english + chinese > 200;

前面已经将math + english + chinese重命名为了total,那么后面的where能不能写为:where total > 200?

查询时报错了,找不到total这个列,这是为什么,明明已经重命名了。这和SQL语句的执行顺序有关,回顾以下语句:
select name, math + english + chinese as total from exam_result where total > 200;
其执行顺序为:
- 确定要操作的表,执行
from exam_result - 确定要查询什么条件的数据,执行
where total > 200 - 最后确定查询哪些列,执行
select name, math + english + chinese as total
你会发现,在还没有重命名的时候,where就先使用了total,所以会发生报错。
order by
如果想要对查询的结果进行排序,就需要order by子句。
- 通过
order by子句对查询结果排序:
select ... from 表名 where ... order by 列1 asc|desc, 列2 asc|desc ... ;
asc表示升序,desc表示降序,如果不指定那么默认为asc升序。
- 以数学成绩升序展示所有成绩:
select name, math, chinese, english from exam_result order by math asc;

此处NULL被放在了第一列,在SQL中认为NULL比所有值都小。
此处小明和小翠的数学都是98分,为什么小翠的顺序更靠后呢?在查询时,我们只指定了根据math排序,如果math相同,那么顺序是不确定的。
比如根据数学降序:
select name, math, chinese, english from exam_result order by math asc;

你会发现降序的结果不是升序结果的逆置,小明依然比小翠更靠前。如果想要更加确切的排序,那么就需要指定多个列的排序,比如:”如果数学成绩相同,语文成绩高的更前“,此时可以通过order by指定多个列:
order by math desc, chinese desc;
以上order by的执行效果为:先根据math进行逆序排序,如果math相同,再根据chinese逆序排序。如果chinese相同,那么结果就是不确定的了,此时你可以继续往后加排序条件,比如english desc。
select name, math, chinese, english from exam_result
order by math desc, chinese desc;

此时结果就是确定的了,小翠和小明数学成绩相同,此时触发语文成绩判断,小翠的成绩比小明高,所以小翠靠前。
- 以总分降序查询:
select name, chinese + math + english as total from exam_result
order by chinese + math + english desc;

问题来了,排序时能不能直接用别名order by total呢?

这次居然可以用别名total了,和之前where的查询情况不一样!这依然和SQL语句的执行顺序有关。
order by是在整个表查询结束后,也就是select name, chinese + math + english as total这个整体执行完毕,得到了所有符合条件的结果,order by才能进行排序。所以执行到order by时,as total的重命名语句已经生效了,order by可以使用这个别名。
总结一下目前的语句执行顺序:
- 确定要操作的表,执行
from ... - 确定要查询什么条件的数据,执行
where ... - 确定查询哪些列,执行
select ... - 对查询结果进行排序,执行
order by ...
limit
假设已经查询好数据,排序完成了,如果只需要取用前三条数据,这要如何完成?此时就需要limit,其用于展示查询到的数据的指定部分。
- 输出前
x条数据:
select ... from 表名 where ... order by ... limit x;
- 输出下标为
[x, y]的数据(下标从0开始):
select ... from 表名 where ... order by ... limit x, y;
select ... from 表名 where ... order by ... limit x offset y;
直接查询:

查询前三行:
select * from exam_result limit 3;

查询第2到5行:
select * from exam_result limit 1, 4;

[2, 5]的下标是[1, 4],注意不要搞错了。
limit的执行顺序非常靠后,在整个数据查询,排序完毕后,才执行limit。
删除
MySQL中,有两种删除数据的方法,分别是delete和truncate,两者功能略有差别。
delete
- 通过
delete删除数据
delete from 表名 where ... order by ... limit ...;
- 删除整张表的数据:
delete from exam_result;

执行select时查询不到任何数据,说明确实删除成功了。在show create table时,字段auto_increment=9,说明delete是不会清空自增长的。
在执行改代码将数据插入回去:
insert into exam_result (name, chinese, math, english) values
('小明', 67, 98, 56),
('小红', 87, 78, 77),
('小翠', 88, 98, 90),
('小朱', 82, 84, 67),
('小雨', 55, 85, 45),
('小鑫', 70, 73, 78),
('小彤', 75, 65, 30),
('小朵', NULL, NULL, NULL);
此时id从9开始自增长了:

2. 删除小朵所在行:
delete from exam_result where name = '小朵';

truncate
相比于delete,truncate有以下特点:
truncate只能用于删除整个表truncate不经过事务,速度更快- 会重置
auto_increment
- 使用
truncate清空表的所有数据:
truncate table 表名;
此处的table可以省略,直接truncate 表名。

truncate后,auto_increment字段的值就被重置了。
更新
- 更新表中数据
update 表名 set 列1 = 值1, 列2 = 值2 where ... order by ... limit ...
- 将小红的英语成绩改为
100:
update exam_result set english = 100 where name = '小红';

此处如果不加where子句,那么所有学生的英语成绩都会变成100。
- 将数学成绩倒数的三名同学,数学成绩加上
10分:
update exam_result set math = math + 10 order by math asc limit 3;

相关文章:
MySQL:基础增删查改
MySQL:基础增删查改 插入插入冲突 查询distinctwhereorder bylimit 删除deletetruncate 更新 插入 基本插入语法: insert [into] 表名 (列1, 列2 ...) values (值1, 值2 ...);into可以省略(列1, 列2 ...)与后面的(值1, 值2)一一对应如果插入时数据完全…...
Apache DolphinScheduler 1.3.4升级至3.1.2版本过程中的踩坑记录
因为在工作中需要推动Apache DolphinScheduler的升级,经过预研,从1.3.4到3.1.2有的体验了很大的提升,在性能和功能性有了很多的改善,推荐升级。 查看官方的升级文档,可知有提供升级脚本,如果只是跨小版本的…...
最后一块石头的重量(超级妙的背包问题)
1049. 最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x < y。那么粉碎的可能结果…...
如何评估和提升审查者在前端代码审查中的专业技能?
评估和提升审查者在前端代码审查中的专业技能可以通过以下步骤: 技能评估: 定期进行技能评估,了解审查者在前端开发各方面的能力,包括但不限于HTML、CSS、JavaScript、框架使用、代码规范等。 代码审查实践: 通过实…...
C++(区别于C的)基础内容总结
参考: C 教程 | 菜鸟教程 (runoob.com) 简介 C 被认为是一种中级语言,它综合了高级语言和低级语言的特点。 C 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。C 进一步扩充和完善了 C 语言,最初命名为带类的C&…...
实现代码灵活性:用Roslyn动态编译和执行存储在数据库中的C#代码
在许多现代应用程序中,动态编译和执行代码是提升灵活性和功能的一种强大技术。本文将介绍如何使用Roslyn编译器平台动态编译和执行存储在数据库中的C#代码,并结合实际公司案例来说明这些技术的应用场景。 1. 引言 在很多应用场景中,我们可能…...
探索哈希表:C++中的实现与操作详解【Map、Set、数据结构】
探索哈希表:C中的实现与操作详解 介绍 哈希表(Hash Table)是一种常见的数据结构,它提供了一种高效的键值对存储方式,能够快速进行插入、删除和查找操作。在这篇博客中,我们将详细介绍哈希表的概念、在C中的…...
Python酷库之旅-第三方库Pandas(062)
目录 一、用法精讲 241、pandas.Series.view方法 241-1、语法 241-2、参数 241-3、功能 241-4、返回值 241-5、说明 241-6、用法 241-6-1、数据准备 241-6-2、代码示例 241-6-3、结果输出 242、pandas.Series.compare方法 242-1、语法 242-2、参数 242-3、功能 …...
python学习之旅(基础篇看这篇足够了!!!)
目录 前言 1.输入输出 1.1 输入 1.2 输出 2. 变量与常量 2.1 变量 2.2 常量 2.3 赋值 2.4格式化输出 3. 数据类型 4. 四则运算 5.“真与假” 5.1 布尔数 5.2 比较运算和逻辑运算 5.3 布尔表达式 6.判断语句 6.1 基本的if语句 6.2 if-else语句 6.3 if-elif-el…...
Azure OpenAI Embeddings vs OpenAI Embeddings
题意:Azure OpenAI 嵌入与 OpenAI 嵌入的比较 问题背景: Is anyone getting different results from Azure OpenAI embeddings deployment using text-embedding-ada-002 than the ones from OpenAI? Same text, same model, and the results are cons…...
重生奇迹MU职业成长三步走
在重生奇迹MU游戏中,转职是最重要的玩法之一。每个职业在转职后都会发生巨大的变化,经过三次转职后,你才有资格成为该游戏中最强大的冒险者。 一转,一切才刚刚开始 玩家完成第一次转职任务后,标志着我们成功度过了游…...
2024年中国数据中台行业研究报告
数据中台丨研究报告 核心摘要: 数据中台是企业数字化建设的重要构成,其通过整合企业基础设施和数据能力,实现数据资产化和服务复用,降低运营成本,支撑业务创新。受宏观经济影响,部分企业减少了对数据中台等…...
MySQL——数据表的基本操作(一)创建数据表
数据库创建成功后,就需要创建数据表。所谓创建数据表指的是在已存在的数据库中建立新表。需要注意的是,在操作数据表之前,应该使用 “ USE 数据库名 ” 指定操作是在哪个数据库中进行,否则会抛出 “ No database selected ” 错误。创建数据表…...
EPLAN EDZ 文件太大导入很慢如何解决?
目前各个品牌都在提供 EPLAN EDZ部件库文件,但是一般都是一个总的EDZ文件,导入过程中,因为电脑配置和其他问题,导致导入过程中EPLAN会崩溃或者长时间不动。 我们分析下EDZ文件的构成,这是个压缩文件,换了个壳而已。用压缩软件把edz打开,这里不是解压,直接右键,用解压…...
刷题——缺失的第一个正整数
缺失的第一个正整数_牛客题霸_牛客网 我选择了一个我比较能看懂的, int minNumberDisappeared(vector<int>& nums) {// write code heremap<int, int>hash;int n nums.size();//哈希表记录数组中出现的每个数字for(int i 0; i < n; i)hash[n…...
代理设置--一些库的代理设置
首先最好能获取一个免费代理,来继续下面的阅读和实验 也可以在本机设置代理,具体流程由于比较敏感,请自行搜索 代理设置成功后的测试网站是 http://www.httpbin.org/get , 访问该链接可以得到请求相关的信息,返回结果中的 ori…...
Debezium系列之:PostgreSQL数据库赋予账号数据采集权限的详细步骤
Debezium系列之:PostgreSQL数据库赋予账号数据采集权限的详细步骤 一、账号需要的权限二、创建账号,赋予登陆、复制权限三、赋予账号数据库权限四、赋予账号对表的权限五、创建PostgreSQL数据库复制组六、账号权限授予完整案例七、扩展——分区表设置八、扩展-撤销账号的权限…...
javascript:判断输入值是数字还是字母
1 代码示例 要判断输入值是数字还是字母,我们可以通过JavaScript获取输入框的值,然后使用isNaN函数来检查输入值是否为数字。 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><s…...
Java-排序算法-复盘知识点
刷了24道简单排序题,18道中等排序题之后,给排序算法来个简单的复盘(从明天开始刷动态规划咯) 1.对于找多数元素(出现次数超过一半的元素)可以使用摩尔投票法。 2.HashSet的add方法非常实用:如…...
HarmonyOS 原生智能之语音识别实战
HarmonyOS 原生智能之语音识别实战 背景 公司很多业务场景使用到了语音识别功能,当时我们的语音团队自研了语音识别模型,方案是云端模型加端侧SDK交互,端侧负责做语音采集、VAD、opus编码,实时传输给云端,云端识别后…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
