📌前言:本篇博客介绍MySQL数据库增删改查的基础,学习MySQL之前要先安装好MySQL,如果还没有安装的小伙伴可以点这里博主前面的这篇博客,里面有详细的安装教程。
那我们废话不多说,直接进入主体!🚀🚀🚀
MySQL表的增删改查
一、CRUD
注释:在SQL中可以使用“
--
空格+描述”来表示注释说明
而CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写,基本上我们在使用和操作数据库的时候,大多数都是几个操作了。接下来我们逐一进行说明。
【回忆】因为接下来的操作我们都是围绕着表去进行操作的,所以我们复习回顾一下在上一篇博客中说到的关于数据库的操作:
🎈1. 创建表 create table 表名;
🎈2. 查看表 show tables;
🎈3. 查看表结构 desc 表名;
🎈4. 删除表 drop table 表名;
🎈5. 选中数据库 use 数据库名;
这里补充一点就是,没有什么语句可以说是查看现在选中的是哪个数据库,但是我们如果不记得是否选中了自己需要选的,可以多次执行use 数据库名
的语句,并不会有什么不良影响。
📢1.新增(Create)
语法:insert 【into】表名 values(值,值,值.....)
例子:
insert into books values('老人与海',15);
新增是在表里面增加数据,我们在之前的博客中写道每一列都必须要有它固定的数据类型,其实就是在新增的时候统一,可以更好整理信息。在这里我们演示中,先创建一个表:
CREATE TABLE student (
id INT,
sn INT comment '学号',
name VARCHAR(20) comment '姓名',
qq_mail VARCHAR(20) comment 'QQ邮箱'
--这里故意写成这样子,首先mysql中没有大小写区分,用INT和int都可以
--然后这里的comment是一种注释方式,后面的内容是不用执行的。
);
运行成功:
然后就是我们插入数据/新增数据的语句了:
insert into student values(1,2040231143,'张三','1752894294@qq.com');
输入并查询表中数据:
同时,我们可以输入多组数据,在数据之间用英文逗号隔开就行,每一个数据也要用英文括号阔起来,然后就可以输入多组数据啦,并且在没有以分号结尾之前,我们在每组数据之间还可以换行:
mysql> insert into student values(2,2040231144,'李四','123456789@qq.com'),
-> (3,2040231145,'王五','234567891@qq.com'),
-> (4,2040231146,'赵六','345678912@qq.com');
运行结果:
这里的返回就表示三行受到影响,也就是三行插入成功了!
这里我们有一个细节,就是在我们上面是三条数据一起插入的,那如果是一条一条插入呢,有什么差别吗,有些同学可能是就是多写几次insert,实际上是有很大区别的。
实际上,一次插入N条数据的速度要比分N次一次插入一条快很多(好几倍)。在每次插入数据的时候,客户端会传输sql给服务器,而多次传播比一次传播花费的时间成本要高很多。
这就是新增/插入语句。
📢2.查询(Retrieve)
接下来就是查询语句了,查询语句是最核心的也是最复杂的操作,因为我们增加减少数据只是占少数,但是我们经常要查数据,其实在上面的操作中我们在看修改变化中就出现了查询语句了。
1️⃣全列查询
语法:select * from 表名;
其中,这里的*
是通配符,就是表示一个表所有的列,就好像我们在玩扑克中斗地主的癞子玩法,就是一种通配符。
我们试一下: select * from student;
这里就是把一个表所有行和列都查找出来了,然后把查找的结果变成一个"临时表"。❗️ 注意:此处的查询结果临时表,不在硬盘上,而是在内存,随之进行输出之后,数据也会被释放,也就是查完给你看就释放了,不会长久保存。
这里做了一个图供大家理解:
❗️ 注意:这里的select操作也不会影响到硬盘中持久化保存的数据。
然后还有一点值得注意,像select * from 表名这种操作,也是一个危险操作,如果在生产环境的服务器上执行,很可能会带来灾难,生产环境保存的数据量可能非常大,TB级别,可能会瞬间把硬盘的IO吃满。不过在实际开发中,一般公司都会对SQL的执行时间做出监督,一旦发现这种"慢SQL",就会强制把这个SQL杀死。
所以除了用select * 查找之外,我们也可以查找其中一个列的数据,比如上面的student表中,我只想知道学生的名字,就可以执行:select name from student;
2️⃣ 指定列查询
语法:select 列名,列名 ... from 表名;
执行结果:
对比上面的全查询,这种查询就会显得高效很多。因此在平时的开发中还是这种指定列查询使用的比较多,语法就是select 列名,列名 ... from 表名;
3️⃣对指定字段进行的操作
除了上面的直接查询到需要知道的情况,我们也可以在查询中加入一些运算等表达式的字段,同样可以实现,这里我们先定义一张成绩表:
mysql> insert into grade values('张三',2040231143,85,99,102),
-> ('李四',2040231144,99,119,50),
-> ('王五',2040117314,80,80,81),
-> ('蛋蛋',2040131420,99,102,105),
-> ('哈哈',2040541234,60,70,32);
运行后打印的临时表:
然后我们就可以在查询的时候增加一些运算操作,在这里我们的成绩表中,比如我们想在查询的时候语文成绩的时候加十分,就可以:
我们想查询他们的总成绩的时候:
然后我们会发现,总成绩这里的说明那么长一段,能不能给他换个名字呀,这么长太难看了,诶,确实可以换,这时候我们可以查看字段指定别名,语法:在换名的列后面加as 新名字
这里的as就是相当于换名字,其实也可以不用as 直接接上total也是可以的,但是没有total会容易让人产生误会,还是加上更清晰。
还有一个操作是针对查询结果去重,语法:在需要去重的列名前加distinct
在这里为了演示插入一条和ggb一样的数据,然后我们再查:
对于上诉操作中,有几个值得我们注意的点:
- 在这里的运算中,临时表产生运算后的数据,不会影响到存储在硬盘中的数据,只是在显示的时候进行了运算而已。
- 在硬盘中存储的数据通过运算后可能会超出原本的数据范围,临时表的类型会自动的适应,保证计算结果是正确的。
- 上述操作都是一个或多个列来进行运算的,行与行之间不影响。
4️⃣ 对查询结果排序
在这里一样是针对临时表的操作,并不会影响到数据库服务器上的数据,我们可以对查询结果进行排序,语法是:
select 列名...from 表名 order by 列名 asc/desc
首先解释一下这里的语法,这里的order by
就是说按住哪一个列的数据进行排序,然后后面的asc/desc
是升序和降序的意思,如果后面不加,默认就是升序。
比如查询成绩按数学成绩由高到低排序:
select * from grade order by math desc;
💡查询结果:
再比如查询成绩按总成绩升序排序:
select name,chinese+math+english as total from grade order by chinese+math+english asc//这里用total也可以;
💡查询结果:
再比如我们有NULL数据的查询(被视为最小值):
对于这里的排序查询,可以指定更多的数据进行排序,比如select * from grade order by math,chinese desc;
他就按照先按数学排序,当数学成绩相等的时候,再比较语文成绩进行排序,我们这里的数学是默认的升序,语文是降序,所以得到的结果是这样的:
像数据库这种查询结果,如果不去指定排序,这里的结果的顺序是不可预期的,写代码的时候不能依赖默认排序。
5️⃣ 条件查询
对于查询结果,我们在正常生活中也经常使用到,可以筛选自己需要的结果,所以这里mysql也是有的,就是把不满足条件的数据过滤掉,语法是:
select 列名 from 表名 where 条件;
继续以这个成绩表作为例子:
这里分别说一下关于MySQL的条件操作:
1.>,>=,<,<=
,也就是比较,比如上面的成绩中,筛选语文高于数学的: where chinese > math
例子:
2. =,<=>
,这里的=
大家比较熟悉,但在这是比较的意思,而我们有一个更好的比较<=>
,直接用等号比,万一两边为空它是比较不出来的,而后者可以。比如:where math <=>chinese
例子:
3. between A and B
,这里是构造一个闭区间[A,B],在这范围内的数据输出,比如:where math between 75 and 90;
例子:
4. IN(option,....)
,这里是后面给固定的值,判断当前结果中是否有这几个值在其中,比如: where math in(80);
例子:
5.IS NULL/IS NOT NULL
,这里是专门用来比较空值的,比如:where chinese is null
。
例子:
6.LIKE
,这是一个模糊查询,我们有两个符号和它组合,一个是_
(下划线),另一个是%
,前者表示一个字符,后者可表示一个或多个字符,然后如查名字带张的,就可以是where name like '%张%
’,这里就表示名字里是有张的就行。
例子:
7. AND OR NOT
,这里就是相当于是&&
,||
和!
,判断语句是否为真的意思,比如:where math >80 and chinese >100;
例子:
❗️ 注意:有and
有or
要先运算or
再选and
这里就是基本的条件查询了,在这里,我们如果查询结果是三科成绩相加,然后又另命名为total,在条件查询中是不可以用total作为条件列的,也就是where字句不能使用别名,如:
6️⃣ 分页查询
在我们的查询中,为什么会有那么多页呢,一页到底不好吗,其实,在我们查询的过程中,如此庞大的数据库,查到的数据全显示在一页,这得浪费多少流量,我上面找到了,后面又不看,所以我们有了分页查询,每页固定信息量:
对于Sql中是用
limit
来实现分页查询的:select 表名 from 列名 limit 数
- 直接用
limit
查询数据(下面例子查三条)
limit+offset
offset就是查的起始位置,就是有起始位置查(例子从位置为1的地方开始往下查)
📢3.修改(Update)
终于跨过查询了,到了修改就比较简单了,语法:
update 表名 set 列名 = 值,列名 = 值 where 条件
❗️ 注意 !上面的查都是临时表,不会更改数据库服务器上的数据,但是这个就会改,所以在修改的时候一定要谨慎!
比如将张三的数学改为120:
这里的修改中,返回的Rows matched: 1 Changed: 1 Warnings: 0
就是修改了一行的数据。
📢4.删除(Delete)
delete from 表名 where 条件
Delect操作也很简单,就是删除数据,这里也要小心,一旦写错就有可能会影响到很多数据,如果我们直接是delete from 表名
,没有增加条件的话,就是默认删除所有数据。但是这里和删表不一样,这里表还存在,就是里面的数据没了,但这个表还在。
比如:
这就是删除。
以上便上MySQL表的增删改查(基础版),接下来就会进入到MySQL的增删改查(进阶版)了。欢迎关注。一起学习,共同努力!
还有一件事: