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编码,实时传输给云端,云端识别后…...
基于Gromacs的蛋白质与小分子配体相互作用模拟教程
在生命科学的广阔领域中,蛋白质与小分子配体之间的相互作用扮演着至关重要的角色。这些相互作用不仅影响着生物体内的各种生命活动,如信号传导、代谢调控和药物作用等,同时也是药物设计和开发的核心内容。因此,深入理解并模拟这些…...
Ubuntu下python3.12安装, 分布式 LLM 推理 exo 安装调试过程, 运行自己的 AI 集群
创作不易 只因热爱!! 热衷分享,一起成长! “你的鼓励就是我努力付出的动力” —调试有点废,文章有点长,希望大家用心看完,肯定能学废,感谢. 1. Ubuntu下python3.12安装 1.1 导入 Python 的稳定版 PPA,不用编译 sudo add-apt-repository ppa:deadsnakes/ppa sudo…...
pytest-bdd 行为驱动自动化测试
引言 pytest-bdd 是一个专为Python设计的行为驱动开发(BDD)测试框架,它允许开发人员使用自然语言(如Gherkin)来编写测试用例,从而使测试用例更易于理解和维护。 安装 通过pip安装 pip install pytest-b…...
PostgreSQL11 | 触发器
本文章代码已在pgsql11.22版本上运行且通过,展示页由pgAdmin8.4版本提供 上一篇总结了原著的第十章有关pgsql的视图的用法,本篇将总结pgsql的触发器的用法。 触发器 使用触发器可以自动化完成一些在插入数据或修改数据时,某些需要同期同步的…...
cesium canvas广告牌
在有些业务中,对场景中的广告牌样式要求比较高,需要动态显示一些数据,这个时候,我们可以通过将复杂背景样式制作成图片,通过canvas绘制图片和动态数据,从而达到比较好的显示效果。 1 CanvasMarker 类封装 …...
使用Floyd算法求解两点间最短距离
Floyd算法 Floyd算法又称为Floyd-Warshell算法,其实Warshell算法是离散数学中求传递闭包的算法,两者的思想是一致的。Floyd算法是求解多源最短路时通常选用的算法,经过一次算法即可求出任意两点之间的最短距离,并且可以处理有负权…...
linux“how_paras.sh“ E212: 无法打开并写入文件
经过一番测试和查找, [6localhost bin]$ find / -name "hello.sh" 2>/dev/null /home/6/bin/hello.sh [6localhost bin]$ ls hello.sh ls: 无法访问hello.sh: 没有那个文件或目录,为什么在/bin文件下却不能打开, [6localhost …...
CSS mask-image 实现边缘淡出过渡效果
使用场景 在生产环境中,遇到一个需求,需要在一个深色风格的大屏页面中,嵌入 Google Maps。为了减少违和感,希望地图四边能够淡出过渡。 这里的“淡出过渡”,关键是淡出,而非降低透明度。 基于 Google Ma…...
电子元器件—电容和电感(一篇文章搞懂电路中的电容和电感)(笔记)(面试考试必备知识点)电容和电感作用、用途、使用、注意事项、特点等(面试必备)-笔记(详解)
作者:Whappy 座右铭:不曾拥有,何来失去! 时间:2024年8月2日08:40:04 一、电容的作用 储能: 电容器通过充电储存电荷在电容板上,形成电场储存电能。当需要释放储存的电能时,电荷…...
2024HDU Contest 5 Problem 5
题目链接 从大到小枚举gcd的值 d d d,以及编号为 d d d的倍数的点, [ d , 2 d , 3 d , … ] [d,2d,3d,\dots] [d,2d,3d,…]。 然后对于任何一条边 ( x , y ) (x,y) (x,y),如果 x x x的子树和 y y y的子树里都有编号为 d d d倍数的点…...
濮阳河南网站建设/网络营销推广要求
Push-Pull推挽输出Open-Drain开漏输出原理输出的器件是指输出脚内部集成有一对互补的MOSFET,当Q1导通、Q2截止时输出高电平;而当Q1截止导通、Q2导通时输出低电平开漏电路就是指以MOSFET的漏极为输出的电路。指内部输出和地之间有个N沟道的MOSFET(Q1)&…...
眉山网站定制/新野seo公司
本篇主要是为初次部署windows server 2008的朋友做图文指导,希望对您的提高能够有所帮助.步骤如下.1 放入windows server 2008 安装光盘后,重新启动计算机设置biso启动顺序(注意设置bios启动顺序为光盘启动),再启动后,出现如下安装画面.选择语言后点击下一步;<?xml:namespa…...
关键词网站/项目推广网
随着敏捷日益成为主流,各种各样的敏捷会议召开,一本又一本的敏捷图书出版,一个又一个的公司前赴后继的迈向敏捷,好一番火热景象。这让我回忆起了当年看报时的一个感受,当时每张报纸的显眼处都能看到牛皮癣和肝病的广告…...
数控机械加工网/百度怎么优化网站排名
uni-app搜索功能前后端开发(页面) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 借助的插件地址 插件地址 展示 前端是…...
广州正规网站建设公司/百度地图推广
新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 每日一道理 灯,带有一种明亮的光,每当深夜来临,是它陪伴着你,如此默默无闻。它是平凡的,外表华丽与否࿰…...
怎样购买网站程序/seo优化的基本流程
编辑:ll D50XT100-ASEMI大功率三相整流桥50A 1000V 型号:D50XT100 品牌:ASEMI 封装:DXT-5 电性参数:50A 1000V 电流:50A 电压:1000V 引脚数量:5 特性:大功率三相…...