【MySQL】数据操作语句(DML)

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习计网、mysql和算法
✈️专栏:MySQL学习
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

  • 一、增
      • 1.1 insert
      • 1.2 插入或更新
      • 1.3 replace
      • 1.4 将查询结果插入到指定的表中
  • 二、查
      • 2.1 select
      • 2.2 全列查询 + 指定列查询
      • 2.3 查询字段为表达式
      • 2.4 去重
      • 2.5 where子句(过滤筛选)
      • 2.6 排序order by
      • 2.7 筛选分页结果limit
  • 三、改
      • 3.1 update
      • 3.2 案例1:将孙悟空的数学成绩变更为 80 分
      • 3:3 案例2:将曹孟德的数学成绩变更为 60 分,语文成绩变更为 70 分
      • 3.4 案例3:将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
      • 3.5 案例4:将所有同学的语文成绩更新为原来的 2 倍
  • 四、删
      • 4.1 delete
      • 4.2 截断表truncate
      • 4.3 案例1:删除孙悟空同学的考试成绩
      • 4.4 案例2:删除总分是倒数第一的同学
  • 五、补充:where子句案例
      • 5.1 英语成绩<60的同学及英语成绩
      • 5.2 语文成绩在 [80, 90] 分的同学及语文成绩
      • 5.3 数学成绩是58或者59或者98或者99分的同学及数学成绩
      • 5.4 姓孙的同学及孙某同学(模糊匹配)
      • 5.5 语文成绩好于英语成绩的同学
      • 5.6 总分在 200 分以下的同学(执行顺序问题)
      • 5.7 语文成绩 > 80 并且不姓孙的同学
      • 5.8 筛选出孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
  • 六、补充:order by子句案例
      • 6.1 同学及数学成绩,按数学成绩升序显示
      • 6.2 同学及英语成绩,按英语成绩升序排序
      • 6.3 查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
      • 6.4 查询同学及总分,由高到低
      • 6.5 查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示

一、增

1.1 insert

【语法】

insert into 表名 (字段1, 字段2, ...) values (1,2, ...);
  • 插入数据时要确保插入的数据类型格式正确,符合表定义的约束条件(如主键、唯一性约束、非空约束等),以避免出现错误。

  • 可以省略into

  • 可以省略(字段1, 字段2, ...),如果将列名部分全部省略,默认是全列插入;当然也可以指定列名插入。

  • 支持批量插入。

insert into 表名 (字段1, 字段2, ...) values (1,2, ...), (1,2, ...), ...;

【使用案例】

  • 单行数据 + 全列插入

在这里插入图片描述

  • 多行数据 + 指定列插入

在这里插入图片描述

1.2 插入或更新

由于主键或者唯一键对应的值已经存在,那么一定会导致插入失败

在这里插入图片描述

在这种情况下,可以选择性的进行同步更新操作

语法如下:

insert into 表名 (字段1,...) values (1,...) on duplicate key update1 =1,2 =2,3 =3, ...;

如果表中已经存在相同的唯一键或主键,则会更新已存在的记录;如果不存在,则会插入新记录。

【使用案例】

假设有一个名为 users的表,其中id列是主键,name列是唯一键,要插入一条数据,如果已存在相同的name,则更新对应的age,如果不存在,则插入新记录,可以这样写:

在这里插入图片描述

那么问题来了,我们怎么知道是执行了插入操作还是更新操作?

方法一:可以通过MySQL数据库返回的信息来判断

-- 0 row affected: 表中有冲突数据,更新的内容还是和表中原有的数据冲突
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,并且数据已经被更新

方法二:通过MySQL函数获取受到影响的数据行数

select row_count();

1.3 replace

替换其实类似于insert into ... on duplicate key update,但是在某些情况下具有不同的行为。具体来说,替换会尝试插入一条新记录,如果表中已存在与新记录具有相同唯一键或主键的记录,则会删除已存在的记录,然后插入新记录,是一种比较暴力的做法。

基本语法如下:

replace into 表名 (1,2, ...) values (1,2, ...);

【使用案例】

假设有一个名为 users的表,其中id列是主键,name列是唯一键,要插入一条数据,如果已存在相同的主键或唯一键,则替换已存在的记录,可以这样写:

在这里插入图片描述

1.4 将查询结果插入到指定的表中

insert into 表名 [指定列] select ...
  • [指定列]是可选项,指定要插入数据的目标表的列名。如果省略了列名,则默认假定插入的数据顺序与表中列的顺序相同。
  • select ...: 指定要插入的数据来源。这个select查询语句将返回一组数据,这些数据将会被插入到目标表中。

举例来说,假设有一个名为target_table的表,具有列col1col2col3,并且表数据如下:

在这里插入图片描述

然后新建一个名为nums表结构(结果需要和target_table 一样)

在这里插入图片描述

最后将target_table中所有的数据插入到nums

在这里插入图片描述

二、查

2.1 select

select是用于从数据库中检索数据的关键字,是SQL最常用的语句之一。通过select语句,你可以从一个或多个表中检索出符合特定条件的数据,并根据需要对数据进行排序分组等操作。

【语法】

select distinct1,2,... from 表名 where 条件 order by 列名 limit 行数;
  • distinct可以对表中重复的数据去重

  • 列1, 列2, ... 是要检索的列的列表;如果需要检索所有列,则可以使用通配符 *

  • where 子句用于指定检索数据的条件,可以根据需求添加,当然也可以省略。

  • order by 子句用于对检索出的数据进行排序。

  • limit 子句用于限制检索出的数据行数,可以指定从检索结果的开头返回的行数,也可以指定起始位置和行数。

接下来一一介绍select的一些重要功能。已知表的结构以及数据如下所示:

在这里插入图片描述

2.2 全列查询 + 指定列查询

全列查询是指使用通配符*来检索表中的所有列数据

select * from 表名; 

在这里插入图片描述

往后不建议使用*进行全列查询。因为查询的列越多,意味着需要传输的数据量越大。同时可能会影响到索引的使用(遍历)。

因此我们可以使用指定列查询:指定列的顺序可以不用按定义表的顺序来

select1,2, ... from 表名;

在这里插入图片描述

2.3 查询字段为表达式

  • select可以计算表达式。
    在这里插入图片描述

假设需要计算出chinesemathenglish三科加起来的总成绩:

在这里插入图片描述

我们也可以通过 别名(as关键字) 来指定返回的字段名。这样可以方便地在查询结果中使用计算后的值,并且不会影响原始数据。注意:as也可以省略不写。

在这里插入图片描述

2.4 去重

使用distinct关键字。这会删除结果集中重复的行,只保留唯一的行。

select distinct 指定列 from 列名;

在这里插入图片描述

在以上表的数据中,数学成绩存在重复,因此可以使用去重查询

在这里插入图片描述

2.5 where子句(过滤筛选)

where其实相当于C/C++中的if

  • 比较运算符
运算符说明
>, >=, <, <=大于,大于等于,小于,小于等于
=等于。不能用此运算符来判断是否等于NULL
<=>等于。专门用来判断是否等于NULL(建议用 is null
!=不等于。不能用此运算符来判断是否不等于null,建议使用is not null
<>不等于。不能用此运算符来判断是否不等于null,建议使用is not null
between a0 and a1范围匹配[a0, a1],如果a0 <= value <= a1,返回1(true)
in (option, ...)如果是option中的任意一个,返回1(true)
is nullnull
is not null不是null
like模糊匹配%表示任意多个(包括 0 个)任意字符;_表示任意一个字符
  • 逻辑运算符
运算符说明
and相当于C/C++中的&&
or相当于C/C++中的或
not相当于C/C++中的!

大家看完这几道题,就能很好掌握where子句了。点击跳转

2.6 排序order by

MySQL中,可以使用order by子句对查询结果进行排序。order by子句允许你按照一个或多个列的值对结果进行排序,可以按照升序(从小到大)或者降序(从大到小)的顺序进行排序。

select 列名 from 表名 order by1 [ASC/DESC],2 [ASC/DESC], ...;
# -- ASC 为升序(从小到大)
# -- DESC 为降序(从大到小)
# -- 默认为升序ASC

大家看完这几道题,就能很好掌握order by了。点击跳转

2.7 筛选分页结果limit

MySQL中,当一个表的数据非常大的时候,按照以上方法会导致查询出来的效果不太明显,你可以使用limit子句来实现分页功能

建议:对未知表进行查询时,最好加一条 limit 1,避免因为表中数据过大,查询全表数据导致数据库卡死

  • 写法一:读取表中的前n
select * from 列表 limit n;

在这里插入图片描述

  • 写法二:从某行row开始读取n
select * from 列表 limit row, n;
# row - 开始位置(下标从0开始,0表示第一条记录)
# n - 步长。从开始位置开始,连续读取多少条记录

在这里插入图片描述

  • 写法三:和写法二类似
select * from 列表 limit n, offset row;
# row - 起始位置
# n - 步长

在这里插入图片描述

三、改

3.1 update

mysql中,可以使用update语句对查询到的结果进行列值更新(修改)。

【语法】

update 表名 set column1 = value1, column2 = value2, ... [where condition] [order by] [limit];

解释一下各个部分的含义:

  • set 用于指定要更新的列column和它们的新值value
  • column1, column2, ... 要更新的列的名称。
  • value1, value2, ... 要将相应列设置为的新值。
  • where 可选项,用于指定筛选条件,只有满足条件的记录才会被更新如果省略where子句,则所有记录都将被更新。
  • order by 可选项
  • limit 可选项

3.2 案例1:将孙悟空的数学成绩变更为 80 分

update exam_result set math=80 where name='孙悟空';

在这里插入图片描述

3:3 案例2:将曹孟德的数学成绩变更为 60 分,语文成绩变更为 70 分

update exam_result set math=60,chinese=70 where name='曹孟德';

在这里插入图片描述

3.4 案例3:将总成绩倒数前三的 3 位同学的数学成绩加上 30 分

update exam_result set math=math+30 order by chinese+math+english asc limit 3;

注意:mysql不支持math += 30这种语法

在这里插入图片描述

3.5 案例4:将所有同学的语文成绩更新为原来的 2 倍

select name,chinese from exam_result;

在这里插入图片描述

四、删

4.1 delete

delete语句用于从表中删除记录。它可以根据指定的条件删除一行或多行数据。

delete from 表名 [where condition] [order by] [limit];
# 如果省略where子句,表中的所有数据将会被删除
# 不省略,则仅在满足条件的记录才会被删除。
# 注意:delete只会删除数据,不会删除表结构

请注意,删除操作是不可逆的,因此在执行delete语句之前,请务必谨慎考虑并确保您真正希望删除这些记录。

4.2 截断表truncate

truncatedelete一样都是用于从表中删除数据的SQL命令

truncate [table] 表名

但它们之间有一些重要的区别:

  • 只能对整表操作,不能像delete一样针对部分数据操作。
  • truncate会重置auto_increment项,而delete不会。
  • truncate在删除数据的时候,并不经过事务,也就是说它不会将操作记录保存在日志文件中,同时也使得truncate操作更加快速。

4.3 案例1:删除孙悟空同学的考试成绩

delete from exam_result where name='孙悟空';

在这里插入图片描述

4.4 案例2:删除总分是倒数第一的同学

delete from exam_result order by chinese+english+math asc limit 1;

在这里插入图片描述

五、补充:where子句案例

5.1 英语成绩<60的同学及英语成绩

select name 姓名, english 英语成绩 from exam_result where english<60;

在这里插入图片描述

5.2 语文成绩在 [80, 90] 分的同学及语文成绩

select name 姓名,chinese 语文成绩 from exam_result where chinese >= 80 and chinese <= 90;

在这里插入图片描述

但是以上代码不够优雅,对于这种范围匹配,还可以用between and

select name 姓名,chinese 语文成绩 from exam_result where chinese between 80 and 90;

在这里插入图片描述

5.3 数学成绩是58或者59或者98或者99分的同学及数学成绩

select name,math from exam_result where math=58 or math=59 or math=98 or math=99;

在这里插入图片描述

但是以上代码不够优雅,在mysql中,可以使用 in操作符来检查某个表达式是否在一个列表中的多个值之中。当某个表达式的值与列表中的任何一个值匹配时,in操作符将返回1true),否则返回0false)。

select name,math from exam_result where math in (58,59,98,99);

在这里插入图片描述

5.4 姓孙的同学及孙某同学(模糊匹配)

这道题考察的是模糊匹配like

  • 姓孙的同学:可能叫,可能叫孙某,可能叫孙某某 …,因此要用 %来表示任意字符
select name from exam_result where name like '孙%';

在这里插入图片描述

  • 孙某同学:则需要使用 _表示任意一个字符
select name from exam_result where name like '孙_';

在这里插入图片描述

5.5 语文成绩好于英语成绩的同学

select name,chinese,english from exam_result where chinese>english;

在这里插入图片描述

5.6 总分在 200 分以下的同学(执行顺序问题)

select name 姓名,chinese+math+english 总分 from exam_result where chinese+math+english<200;

在这里插入图片描述

这里有一个问题:where子句后面的表达式chinese+math+english太长了,而前面我们将其重命名为总分,所以直接简写成总分<200即可。

在这里插入图片描述

mysql直接报错了error,这里其实涉及 mysql的执行顺序问题

在这里插入图片描述

总结:别名不能用在where条件中使用

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

select name,chinese from exam_result where chinese>80 and name not like '孙%';

在这里插入图片描述

5.8 筛选出孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80

select name,chinese,math,english from exam_result where name like '孙_' or chinese+math+english>200 and chinese<math and english > 80;

在这里插入图片描述

六、补充:order by子句案例

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

select name,math from exam_result order by math asc;

在这里插入图片描述

6.2 同学及英语成绩,按英语成绩升序排序

select name,english from exam_result order by english asc;

在这里插入图片描述

需要注意的是:null视为比任何值都小。

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

这将按照数学成绩降序排列,然后在数学成绩相同的情况下按照英语成绩升序排列,最后在数学和英语成绩都相同时按照语文成绩升序排列。

select name,math,english,chinese from exam_result order by math desc,english asc,chinese asc;

在这里插入图片描述

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

  • order by子句中可以使用表达式
select name,chinese+math+english from exam_result order by chinese+math+english desc;

在这里插入图片描述

  • order by子句中可以使用列别名
select name,chinese+math+english 总分 from exam_result order by 总分 desc;

在这里插入图片描述

为什么这里就可以使用别名了,而where子句后面不能使用别名?同样可以一起再来分析执行顺序:

在这里插入图片描述

总之,order by子句是在整个过程中最后执行的语句。

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

select name,math from exam_result where name like '孙%' or name like '曹%' order by math desc;

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1017. 负二进制转换

解题思路 相关代码 class Solution {public String baseNeg2(int n) {if(n0) return "0";String s"";while(n!0)if(Math.abs(n)%20){nn/(-2);ss0;}else{ss1; n (n-1)/(-2);}String t reverse(s);return t;}public String reverse(String s){Str…

大广赛车机主体设计实践指南:必备技能速成攻略解读!

车机主体设计是什么 汽车作为代步工具距今已有 130 多年的历史。目前&#xff0c;在视觉范围内如此关注车载 HMI 的历史也只是近十年的事情&#xff0c;因为在过去&#xff0c;人们最注重的还是汽车技术的发展。但随着以交通安全为主的自动驾驶技术的不断发展&#xff0c;智能…

【nginx】使用nginx部署https协议

一、客户有证书提供 客户有证书的&#xff0c;或者有域名申请了免费证书的&#xff0c;直接根据下面的第5步骤&#xff0c;配置nginx即可。 二、 自己生成证书 1. 安装openssl-Win64 OpenSSL v3.1.1 Light 附下载地址 Win32/Win64 OpenSSL Installer for Windows - Shinin…

网站统计中的数据收集原理及实现

网站数据统计分析工具是网站站长和运营人员经常使用的一种工具&#xff0c;比较常用的有谷歌分析、百度统计和腾讯分析等等。所有这些统计分析工具的第一步都是网站访问数据的收集。目前主流的数据收集方式基本都是基于javascript的。本文将简要分析这种数据收集的原理&#xf…

宏集PLC如何为楼宇自动化行业提供空调、供暖与通风的解决方案?

一、应用背景 楼宇自动化行业是通过将先进的技术和系统应用于建筑物中&#xff0c;以提高其运营效率、舒适度和能源利用效率的行业&#xff0c;其目标是使建筑物能够自动监控、调节和控制各种设备和系统&#xff0c;包括照明系统、空调系统、安全系统、通风系统、电力供应系统…

建模实例评点(2)领域类图-食谱

1 00:00:00,290 --> 00:00:04,120 这是之前我们给一个用户 2 00:00:04,130 --> 00:00:05,360 给他出食谱的 3 00:00:05,370 --> 00:00:06,480 这样做的一个 4 00:00:06,650 --> 00:00:08,000 你认为你系统最重要的 5 00:00:08,010 --> 00:00:09,360 一个核心…

计算机网络 实验指导 实验8

三层交换机的访问控制 1.实验拓扑图&#xff1a; 名称接口IP地址网关Switch AF0/1192.168.1.1/24F0/2172.1.1.1/24Switch BF0/1192.168.1.2/24F0/2172.2.2.1/24PC1172.1.1.2/24172.1.1.1PC2172.1.1.3/24172.1.1.1PC3172.2.2.2/24172.2.2.1PC4172.2.2.3/24172.2.2.1 2.实验目的…

支付宝会员签到领取积分

一、背景 跟一位喜欢薅羊毛的好友聊天&#xff0c;说现在好多app上的积分能兑换实物&#xff0c;就是需要每天自己去点开app签到&#xff0c;app太多签不过来或者有的时候会忘记签到&#xff0c;虽然流程不复杂&#xff0c;但要是有款工具每天自动签到就好了。 我给他介绍了一…

市场首款!华邦电子发布内置PQC算法的闪存产品

3月27日&#xff0c;全球领先的半导体内存解决方案供应商华邦电子股份有限公司推出TrustME Secure Flash W77Q系列的最新扩展&#xff0c;包括256Mb、512Mb和1Gb器件。 这些突破性的安全闪存设备是市场上首款针对后量子密码学&#xff08;PQC&#xff09;实施Leighton-Micali签…

nginx支持的多种负载均衡策略

目录 1.轮询&#xff08;默认&#xff09; 2. ip_hash 3. 加权轮询&#xff08;weight&#xff09; 4. fair&#xff08;第三方&#xff09; 5. 最少连接&#xff08;least_conn&#xff09; 1.轮询&#xff08;默认&#xff09; 将请求依次分配给每个服务器&#xff0c;确…

Linux:IO多路转接之poll

文章目录 select的缺点pollstruct pollfd解决缺点的方式 代码实现 本篇总结的是poll的相关内容&#xff0c;在总结poll的内容前&#xff0c;先回顾一下select的缺点 select的缺点 select的缺点也比较明显 等待的fd是有上限的&#xff0c;在我们当前这个版本来说&#xff0c;…

信号处理之(文件批处理+小波分解+波形图的生成)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、前期准备工作之数据自动读取二、前期准备工作之信号分解&#xff08;小波分解&#xff09;三、前期准备工作之数据可视化&#xff08;波形图展示&#xff0…

Redis的配置文件详解

单位&#xff1a;Redis配置对大小写不敏感&#xff01; 注意这里&#xff1a;任何写法都可&#xff0c;不区分大小写。 units are case insensitive so 1GB 1Gb 1gB are all the same.包含&#xff1a;搭建Redis集群时&#xff0c;可以使用includes包含其他配置文件网络&…

个推助力小米汽车APP实现智能用户触达,打造智能出行新体验

4月3日&#xff0c;小米SU7首批交付仪式在北京亦庄的小米汽车工厂总装车间举行&#xff0c;全国28城交付中心也同步开启首批交付。随着小米SU7系列汽车的正式发售和交付&#xff0c;小米汽车APP迎来了用户体量的爆发式增长。 小米汽车APP是小米汽车官方推出的手机应用&#xff…

大型语言模型(LLMs)面试常见问题解析

概述 这篇文章[1]是关于大型语言模型&#xff08;LLMs&#xff09;的面试问题和答案&#xff0c;旨在帮助读者准备相关职位的面试。 token&#xff1f; 在大型语言模型中&#xff0c;token 指的是什么&#xff1f; 分词&#xff08;Tokenization&#xff09;&#xff1a;可以将…

力扣热题100_链表_138_随机链表的复制

文章目录 题目链接解题思路解题代码 题目链接 138. 随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&a…

事件时间+时间窗口,最后一个窗口不执行问题踩坑与源码分析

事件时间时间窗口&#xff0c;最后一个窗口不执行问题踩坑与源码分析 1. 结论 在使用事件时间和时间窗口的过程中&#xff0c;当最后一个事件的事件时间未达到时间窗口的最大时间&#xff0c;窗口不会触发。 举例说明&#xff0c;在按小时的滚动窗口中&#xff0c;假设当前时…

开启虚拟机时出现此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态怎么解决

问题描述 虚拟机安装完成后&#xff0c;点击开启此虚拟机弹出系统提示 原因分析&#xff1a; Intel VT-x 处于禁用状态&#xff0c;需要开启。 解决方案&#xff1a; 以联系小新笔记本电脑为例&#xff0c;进入BIOS界面&#xff0c;将Intel Virtual Technology设置成Enabl…

STL--迭代器的介绍

一.迭代器介绍&#x1f357; 迭代器是 C 标准模板库&#xff08;STL&#xff09;中的一个重要概念。简单来说&#xff0c;迭代器就像是一个指针&#xff0c;用于访问和遍历容器中的元素&#xff08;比如数组、链表、集合等&#xff09;。迭代器提供了一种统一的方法来访问容器…

力扣1448---统计二叉树中好节点的数量(Java、DFS、中等题)

题目描述&#xff1a; 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,3,null,1,5] 输出…