【MySQL】——用一文领悟表的增删查改
目录
前言
在🔥《库操作&&表操作》🔥一文中,我们已经知道如何对表进行创建、修改、删除
但那是对表的结构而言,具体怎么对表的数据进行操作,我们还没有讲解
这也是本章的介绍对象——表的增删查改
🍃1.表的增加
🍙1.1增——insert
insert用于向表中插入新的行数据记录
插入的行数据记录,并不是依照列一个一个严格插入的
可以选择全插入,也可以选择一些列进行插入
语法:
insert into 表名(列名1,列名2,......) values(列值1,列值2,......);
特殊语法:
- 全列插入,直接省略括号中列名
insert into 表名 values(列值1,列值2,......);
- 多列插入,每个行数据用()包裹,用','分离
insert into 表名(列名1,列名2,......) values(列值1,列值2,......),(列值1,列值2,......),......;
示例:
创建一张表students
create table students(
-> id int unsigned primary key auto_increment,
-> sn int not NULL unique,
-> name varchar(20) not null,
-> qq varchar(20)
-> );
指定列插入一条数据记录
全列插入一条数据记录
多行插入多条数据记录
查看表
🍙1.2插入否则更新
当我们想要插入的数据记录,在表中已经存在时,会插入失败
这时候,我们可以选择将表中原本的数据记录更新成我们想要插入的数据记录
即发生数据冲突就更新
一般冲突分为两种
- 主键冲突
- 唯一键冲突
🤔如何解决?
💡在数据冲突的时候,选择性地进行同步更新
语法:
insert ....... duplicate key update 列名1=列值1,列名2=列值2,......;
示例:
插入的数据记录产生冲突,选择更新
查看表👇
🍤1.2.1影响行说明
当表中有数据冲突,我们进行选择性更新时
可以发现,有两行数据被影响了
当我们插入的数据不发生数据冲突
只有一行被影响
当我们选择性更新,数据冲突的值和update的值相等
没有行被影响
说明:
- 0 row affected:表中有冲突数据,但冲突数据和update的值相等
- 1 row affected:表中没有冲突数据,数据被插入
- 2 row affected:表中有冲突数据,并且数据已经被更新
🍂2.表的查询
🍘2.1查询——select
一般用来显示表
但实际上,select只是将结果进行显示,并不是单独对表进行显示
如:select 1+1;
全列查询
语法 :
select * from 表名;
说明:
我们一般不支持全列查询
正常工作中的表的数据记录,都多得可怕,并不是我们现在编写的寥寥几行
查询的列越多,意味着传输的数据量越大,速度越慢
并且可能会影响到索引的使用
指定列查询
语法:
select 列名1,列名2,...... from 表名;
说明:
指定列查询的时候
显示是按照select后面的列名顺序进行显示,而不是按照创建表时,定义列名的顺序
🍘2.2特殊表查询
🍥2.2.1添加表达式
select可以显示表达式的结果
进行表的查询的时候,如果有需求,我们可以添加表达式
示例:
现在有一张成绩表
表上的信息只有每个人的姓名、语文成绩、数学成绩、英语成绩
现在,我希望了解每个人的三科总成绩
我需要对表多添加一列总成绩吗?
直接在select 后面添加表达式即可
select name,chinese,english,math,math+english+chinese from exam_result;
结果
这样,简单粗暴了很多
🍥2.2.2起别名
有些时候,显示的列名过长,会造成显示不美观
为了让显示的效果更好,更美观,我们可以对复杂的列名另起别名
语法:
select 列名1 as 别名1,....... from 表名;
- select只管显示结果,对列起别名后,显示时使用别名进行显示
示例:
select name,chinese,english,math,math+english+chinese as '总分' from exam_result;
结果👇
🍥2.2.3结果去重
当进行显示的时候,会发现有重复的数据
有时候重复数据我们并不希望看到,就可以对显示结果进行去重
语法:
select distinct 列名,...... from 表名;
- 将关键字distinct添加在指定列名前,显示该列数据时就会自动去重
示例:
98重复了
我们现在再次select,并对math进行去重
显示的数据当中,已经没有重复数据了。
🍘2.3where条件
如果说 select * from 表名 中的from,是为了定位表的
那么where条件,则是用来定位表中确切的数据记录
语法:
select ...... from where 条件;
where后面的条件,一般需要配合一些运算符
比较运算符
运算符 | 说明 |
>,>=,<,<= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL不安全,例如NULL=NULL的结果是NULL |
<=> | 等于,NULL安全,例如NULL<=>NULL的结果是TRUE(1) |
!=,<> | 不等于 |
between a0 and a1 | 范围匹配[a0,a1],如果a0 <=value<=a1,返回TRUE(1) |
in(option,...) | 如果是option中的任意一个,返回TRUE(1) |
is null | 是NULL |
is not null | 不是NULL |
like | 模糊匹配,%表示任意多个(包括零个)任意字符;_表示一个字符 |
逻辑运算符
运算符 | 说明 |
and | 多个条件必须都为TRUE(1),结果才是TRUE(1) |
or | 任意一个条件为TRUE(1),结果为TRUE(1) |
not | 条件为TRUE(1),结果为FALSE(0) |
示例:
查询英语不及格的同学以及英语成绩(<60)
查询语文成绩在[80,90]之间的同学以及语文成绩
🍘2.4结果排序——order by
我们需要对一些数据进行排序的时候,就需要使用order by
语法:
select ...... from 表名 ...... order by 列名 [asc|desc];
- asc为升序排序,从小到大
- desc为降序,从大到小
- 默认为asc
示例:
将同学及数学成绩,按数学成绩升序显示
从小到大依次显示,没有指定排序,则默认为升序
查询同学们各门成绩,依次按 数学降序,英语升序、语文升序的方式显示
发现,即使唐三藏的英语成绩和语文成绩都很差,但还是在第一位
因为,多列排序,排序优先级按照书写顺序
💣注意:没有order by子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
🍘2.5筛选分页结果
大厂中的数据库,存储的信息量是很大的,所以一般几千行起步
我们可以用where进行筛选
但有些时候,我们也必须仔细查看
我们可以使用 limit 对数据进行分页,减少select一次性显示的数据
语法:
-- 起始下标为 0
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
示例:
第一页,显示从0到第3条数据记录
第二页,显示从4开始到第6条数据记录
第三页,显示从7开始到第9条数据记录
💣注意:当剩余记录不满足分页需要的数据记录条数时,显示剩余条数即可
🐳3.表的删除
🧊️3.1删除——delete
当我们不需要表中的每个行数据记录时,可以使用delete进行删除
语法:
delete from 表名 where 条件;
- 删除表中where指定的行数据记录
- where 条件 可以省略
示例:删除孙悟空同学的考试成绩
先查看一下孙悟空同学的考试成绩
将孙悟空同学的考试成绩删除
再次查看孙悟空同学的考试成绩
Empty 表示孙悟空的考试成绩没有了,已经被删除了
💣注意:使用delete进行删除的时候,一旦省略where 条件,将删除整张表的数据
🧊️3.2截断——truncate
当你想删除整张表的数据时
不仅可以用delete,也可以使用teuncate
语法:
truncate table 表名;
- truncate进行删除时,并没有where进行筛选,就是直接删除整张表的数据
🧊️3.3 delete和truncate的区别
truncate是用来删除整张表的,delete也可以用来删除整张表
但为什么一定要多一个truncate拥有重复的功能?
区别:
- delete删除整张表时,不会重置主键的AUTO_INCREMENT值
- truncate删除整张表时,会重置主键的AUTO_INCREMENT值
验证一下:
现在有一个表test
它的列id拥有主键约束,并且自增长
目前主键的AUTO_INCREMNT值为127
使用delete对整张表进行删除
再次查看主键的AUTO_INCREMNT值
仍为127,说明delete删除整张表的数据,并不会重置AUTO_INCREMNT的值
现在使用truncate对表进行重复删除
再次查看主键的AUTO_INCREMNT值
发现:AUTO_INCREMNT直接消失了,代表被重置了!
说明:
truncate在删除整张表数据的同时,重置主键的自增长值
delete在删除整张表数据的同时,不会重置主键的自增长值
为什么会这样?😣
💡delete的删除,是真正地对内容删除,将内容进行清空
💡truncate的删除,并不是真正地对内容删除,并不对内容进行操作
以下为个人想法:
表的本质,就是一个文件
truncate对其删除,更像是将其状态设置为已删除
当表重新被插入数据的时候,直接覆盖原本状态为已删除的数据即可
整张表已经被设置为已删除
后面重新插入数据,也是从头开始插入
所以,在将表的状态设置为已删除的同时,也会重置主键自增长的值!
✨4.表的更新
🍁4.1更新——update
使用update可以对表中的数据进行更新,也是修改
语法:
update 表名 set 列名1=expr1,...... where 条件;
- 将表中where指定的数据记录的列名1的值更改为expr1
- where 可以省略
示例:将孙悟空通信的数学成绩变更为80分
先查看一下孙悟空同学的数学成绩
将孙悟空同学的数学成绩更新为80分
结果👇
💣注意:一般进行更新的时候,建议不要省略where,一旦省略,将变成全表更新!
总结
本文章带大家认识了表的增删查改的操作
但要彻底熟悉,需要勤加练习,多多实操才是
✨如果本文有帮助,点个赞发个评论鼓励一下✨
原文地址:https://blog.csdn.net/2402_85267481/article/details/144308015
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!