MySQL:基础增删查改

news2024/11/22 18:58:08

MySQL:基础增删查改

    • 插入
      • 插入冲突
    • 查询
      • distinct
      • where
      • order by
      • limit
    • 删除
      • delete
      • truncate
    • 更新


插入

  • 基本插入语法:
insert [into] 表名 (1,2 ...) values (1,2 ...);
  1. into可以省略
  2. (列1, 列2 ...)与后面的(值1, 值2)一一对应
  3. 如果插入时数据完全按照表从左往右的顺序,(列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 update1=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

最后该学生的sn20240006变成了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 表名;

此处的表达式含义非常广,它可以是列名,通配符*,或者基本字面量,计算式等。

  1. 通配符*做表达式,输出所有的列

在这里插入图片描述

测试表中,有id, name, chinses, math, english列,通过*全部都查询出来了

  1. 列名做表达式,输出指定的列

在这里插入图片描述

此处的表达式为name, chinese,所以只输出这两列。

  1. 基本字面量与计算式做表达式,输出计算结果

在这里插入图片描述

此处的'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比较为falseNULLNULL比较为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逻辑取反

如果你学过任意编程语言,上表格很好理解。另外的,以上所有操作都可以通过小括号()调整优先级。

  1. 查询英语小于60分的同学:
select name, english from exam_result where english < 60;

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

  1. 查询总分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;

其执行顺序为:

  1. 确定要操作的表,执行from exam_result
  2. 确定要查询什么条件的数据,执行where total > 200
  3. 最后确定查询哪些列,执行select name, math + english + chinese as total

你会发现,在还没有重命名的时候,where就先使用了total,所以会发生报错。


order by

如果想要对查询的结果进行排序,就需要order by子句。

  • 通过order by子句对查询结果排序:
select ... from 表名 where ... order by1 asc|desc,2 asc|desc ... ;

asc表示升序,desc表示降序,如果不指定那么默认为asc升序。

  1. 以数学成绩升序展示所有成绩:
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;

在这里插入图片描述

此时结果就是确定的了,小翠小明数学成绩相同,此时触发语文成绩判断,小翠的成绩比小明高,所以小翠靠前。

  1. 以总分降序查询:
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可以使用这个别名。

总结一下目前的语句执行顺序:

  1. 确定要操作的表,执行from ...
  2. 确定要查询什么条件的数据,执行where ...
  3. 确定查询哪些列,执行select ...
  4. 对查询结果进行排序,执行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中,有两种删除数据的方法,分别是deletetruncate,两者功能略有差别。

delete

  • 通过delete删除数据
delete from 表名 where ... order by ... limit ...;
  1. 删除整张表的数据:
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);

此时id9开始自增长了:

在这里插入图片描述
2. 删除小朵所在行:

delete from exam_result where name = '小朵';

在这里插入图片描述

truncate

相比于deletetruncate有以下特点:

  1. truncate只能用于删除整个表
  2. truncate不经过事务,速度更快
  3. 会重置auto_increment
  • 使用truncate清空表的所有数据:
truncate table 表名;

此处的table可以省略,直接truncate 表名

在这里插入图片描述

truncate后,auto_increment字段的值就被重置了。


更新

  • 更新表中数据
update 表名 set1 =1,2 =2 where ... order by ... limit ...
  1. 将小红的英语成绩改为100
update exam_result set english = 100 where name = '小红';

在这里插入图片描述

此处如果不加where子句,那么所有学生的英语成绩都会变成100

  1. 将数学成绩倒数的三名同学,数学成绩加上10分:
update exam_result set math = math + 10 order by math asc limit 3;

在这里插入图片描述


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

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

相关文章

药明康德:头顶达摩克利斯之剑

头顶达摩克里斯之剑&#xff0c;CXO龙头——药明康德的日子好过吗&#xff1f; 在行业下行周期、美国法案阴霾压力之下&#xff0c;药明康德交出今年上半年的成绩单&#xff0c;营收净利双双下滑&#xff0c;净利润更是同比减少20.2%。 看起来情况糟糕&#xff0c;但显然让被法…

基于YOLOv8的船舶检测系统

基于YOLOv8的船舶检测系统 (价格85) 包含 【散货船&#xff0c;集装箱船&#xff0c;渔船&#xff0c;杂货船&#xff0c;矿砂船&#xff0c;客船】 6个类 通过PYQT构建UI界面&#xff0c;包含图片检测&#xff0c;视频检测&#xff0c;摄像头实时检测。 &#xff08;该…

【竞技宝】DOTA2雪如意:ame水人逆转 XG力克NAVI

北京时间2024年8月2日,DOTA2雪如意杯在昨天将迎来淘汰赛首个比赛日,本日一共进行四场比赛,第二场比赛由NAVI对阵XG。本场比赛双方前两局战至1-1平,决胜局XG前期局势很劣,但中期拖住局势等到了ame水人装备成型,最终XG2-1击败NAVI。以下是本场比赛的详细战报。 第一局: 首局比赛…

领夹无线麦克风哪个牌子好,麦克风哪个好,2024年无线麦克风推荐

​无论是采访、Vlog还是直播&#xff0c;清晰的音频录制都极为重要。作为一名有经验的自媒体人&#xff0c;我深知哪些无线领夹麦克风能够在不破坏预算的情况下提供出色的录音效果。以下是我个人推荐的几个高性能、低价位的无线领夹麦克风&#xff0c;它们将使你的音频录制更上…

深度学习,机器学习,强化学习

深度学习、机器学习、python、人工智能项目代做和指导答疑&#xff5e;擅长&#xff08;svm、罗辑回归、贝叶斯、决策树、xgboost等&#xff09;机器学习算法、各种opencv图像处理、图像分类模型&#xff08;vgg、resnet、mobilenet、efficientnet、densenet等&#xff09;、人…

协同作战:Axure 团队协作功能全解析

前言 在当今快节奏的数字产品开发领域&#xff0c;团队协作不仅是成功的关键&#xff0c;更是创新的催化剂。 Axure&#xff0c;作为一款领先的原型设计工具&#xff0c;其内置的团队协作功能为设计师、产品经理和开发人员提供了一个无缝的沟通和协作平台。 让我们一起探索这…

每日一题——贪心算法

1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 一开始有点理解错他的意思&#xff0c;以为是i是题目中会给出&#xff0c;所以一开始没有什么思路&#xff0c;然后当看了题解之后&#xff0c;就知道了原来i是自己订的&#xff0c…

【hloc】 项目流程

hloc 项目流程 1. 数据集准备2. 特征提取3. 匹配特征4. 三维重建5. 定位6. 结果评估7. 示例脚本 这个项目涉及到了视觉定位和三维重建的一系列步骤&#xff0c;从特征提取、匹配、三维重建到定位和结果评估。通过提供的脚本文件&#xff0c;用户可以方便地运行整个流程。 1. 数…

PLC-Recorder对于数据采集时间戳偏差的修正功能

目录 一、修正原理 二、使用步骤 1、初始状态&#xff0c;计算修正系数 2、启动和使用 3、修正系数的手动修改 三、修正前后的效果对比 1、修正前的时间偏差曲线 2、修正后的效果曲线 四、注意事项 1、控制器可能的时钟波动 2、平移参数评估 3、参数保存 五、关于…

红酒与夜晚:享受静谧的品酒时光

当夜幕低垂&#xff0c;星光点点&#xff0c;世界仿佛进入了一个宁静而神秘的领域。在这样的夜晚&#xff0c;与一瓶定制红酒洒派红酒&#xff08;Bold & Generous&#xff09;相伴&#xff0c;便是一场令人陶醉的品酒之旅&#xff0c;让人在静谧中感受生活的美好。 一、夜…

【深度学习】【语音TTS】OpenVoice: Versatile Instant Voice Cloning,论文

https://github.com/myshell-ai/OpenVoice https://arxiv.org/abs/2312.01479 文章目录 摘要1 引言2 方法2.1 直观思路2.2 模型结构2.3 训练细节3 结果4 结论摘要 我们介绍了OpenVoice,一种多功能的即时语音克隆方法,只需参考说话者的短音频片段即可复制其声音,并生成多语…

数据结构(7):查找

1 查找的基本概念 概念 常见操作 评价指标 平均查找长度&#xff01;&#xff01;&#xff01;&#xff01; ✖前面表示长度 后边表示个数! 处于的是总共的紫色的个数 总结 2 顺序查找、折半查找、分块查找 2.1 顺序查找 适用于线性表&#xff01; 正常代码 哨兵&#xff…

Java类和对象引入

目录 1.类与对象引入 2.类与对象关系示意图 3.类与对象的区别和联系 4.属性/成员变量 基本介绍 注意事项和细节说明 5.如何创建对象 先声明再创建 直接创建 6.如何访问属性 基本语法 7.类和对象的内存分配机制&#xff08;重要&#xff09; 案例演示&#xff…

string类的模拟实现(C++)

一、前言 想要模拟实现一个库中的类&#xff0c;那就要首先要熟悉如何使用这个类。建议通过下面博客&#xff0c;完成对Cstring类的学习。 C的string类-CSDN博客 二、模拟实现 我们将从string的成员函数即成员变量入手&#xff0c;模拟实现string类。 成员变量 string类的…

Spring Boot项目实现调用腾讯云进行人脸识别

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 背景 随着科技的不断发展&#xff0c;人脸识别技术已经成为了一种日益重要的身份验证和安全监控手段。腾讯云人脸识别功能便是其中之一&#xff0c;而Java语言又是现在最为常用且高效的编程语言之一。本篇论…

mongoDB 的安装和使用【docker compose,springboot】

一 介绍 NoSQL数据库 NoSQL&#xff1a;Not Only SQL ,本质也是一种数据库的技术&#xff0c;相对于传统数据库技术&#xff0c;它不会遵循一些约束&#xff0c;比如&#xff1a;sql标准、ACID属性&#xff0c;表结构等。 Nosql优点 l 满足对数据库的高并发读写 l 对海量数…

思维+dfs,CF 269C - Flawed Flow

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 269C - Flawed Flow 二、解题报告 1、思路分析 考虑源点相连的边的方向是确定的&#xff0c;因为流量是从源点往外流的 我们设cap[u] 为 和u相连边的容量和&#xff0c;显然入边容量要和出边容量相等&…

6.C基础_输入输出函数

putchar 功能&#xff1a;输出一个字符 函数声明&#xff1a; int putchar(int c);返回值&#xff1a;参数c的ASCLL码值 c&#xff1a;要输出的字符&#xff0c;可以为字符常量、字符变量或表达式 注意点&#xff1a;输出的结果不带\n getchar 功能&#xff1a;从键盘读…

Day28 | 56. 合并区间 738.单调递增的数字 968.监控二叉树

语言 Java 56. 合并区间 合并区间 题目 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 思路 创建…

基于单片机的ELF可执行文件加载以及Bootloader程序实现程序切换

目录 1.ELF可执行文件加载 1.1 ELF文件分类 1.2 ELF文件格式 1.3链接地址 ​编辑 2.Bootloader程序切换 2.1 Bootloader介绍 2.2 代码实现 1.ELF可执行文件加载 ELF&#xff08;Executable and Linkable Format&#xff09;文件是一种标准的文件格式&#xff0c;用于可…