对于MySQL数据库,笔者在上篇文章就详细的介绍了如何使用及其创建数据表/删除表等操作,上篇文章是基础,这篇文章是升华部分!!对于MySQL数据库的增删改查会是将来我们在进行工作中最经常使用的部分!!那么,这就需要我们着重进行了解了!!
注意:本文是在上篇文章的基础上进行扩展的!!如果你是一个MySQL小白,那么,请先看之前的那篇文章,如果你已经接触过MySQL,那么请忽略!!!!!!!
https://blog.csdn.net/weixin_64308540/article/details/129690968?spm=1001.2014.3001.5502
对于MySQL数据库的增删改查,主要涉及四个过程:增加(Create),查询(Retrive),更新(Update),删除(Delete)!!那么,接下来的部分,我们便深入了解一下MySQL的增删改查吧!!
在进行表数据的增删改查之前,我们仍然需要先选中某一个数据库!!因此笔者的准备操作为:
//查看所有数据库 show databases; //选中名称为:java_1的数据库 use java_1; //查看java_1数据库中的所有表 show tables; //在java_1数据库中,创建名称为student的表,表中有三种数据 create table student(id int,name varchar(20),age int); //查看student的表结构 desc student;
经过上述的代码,我们在MySQL中,可以看出……
那么,有了上述的操作,我们便可以在student表中,进行数据的增删改查了!
- 新增/插入数据 insert into 表名 values(值,值,值,…………);
insert into student values(1,'张三',10);
在这插入数据的时候,我们需要注意的是:插入数据写的代码,需要与定义数据表的时候所创建的类型,相对应!!!
当然,在插入的时候,我们也可以指定列来进行插入数据!!
insert into student(id,name) values(2,'李四'); //注意:需要指定插入的列,与插入的数据相匹配!
通过查看数据表student中的数据,我们可以看出……
//查看数据表student中的数据 select * from student;
对于这个代码,我们在后面进行讲述!!
对于我们第二次插入的数据,指定列插入的情况,其余没有插入的列,会出现默认值null!!
当然,我们也能一次插入多组数据!!
insert into student values(3,'王五',11),(4,'赵大',12),(5,'钱二',13);
这个是对于数据表student全部插入多组数据,当然也能选择某个列进行多组插入数据!!这里便不再讲解!!语法一致!!
那我们再次查看表中的数据!
//查看数据表student中的数据 select * from student;
此时,根据结果,我们可以看出,成功的插入了多组数据!!
需要重点照顾的是:时间,日期类型的插入!!重点照顾!!
先创建一个表吧!!
create table homework(id int,createTime datetime);
上述创建了一个数据表,名称为homework
查看homework的表结构!
那么,接下来,我们就可以进行时间日期的插入了!!
1.手动插入时间!!
insert into homework values(1,'2023-02-22 14:14:14'); //严格按照这种写法来!!
值得注意的是:在手动插入时间日期的时候,我们需要严格按照标准来!!
注意区分!!
- 插入瞬间的时间日期!!
sql提供了一个特殊的函数now(),来表示插入瞬间的时间日期!!
insert into homework values(2,now());
经过这个now()函数的插入,我们在查看数据表homework的所有数据的时候:可以看出时间对比!!
由于笔者的忙碌(笨),导致浪费了几秒钟!!抱歉!!当然这也能看出笔者写作的不易!!
2.查找操作
对于数据库的查找操作也很重要!!
- 全列查找:查找这个数据表的所有的行和列!(这个数据表中有啥,都给找出来!)
select* from 表名
select *from student;
虽然上述的这个代码,能够显示出来所有的行和列,但是,这个操作却是很不安全!!假如数据库的数据很多,几亿??几十亿??这种select* 的操作将会很不安全!!
- 指定列查询 select 列名,列名,……from 表名
select id,name from student;
我们需要注意一下指定列查询与全列查询的区别!!
通过指定列查询,我们可以减少不必要的查询!!
- 查询还可以是表达式!查询的过程中,可以做出简单的运算(列和列之间的运算)
select id+10,name from student;
注意一下运行结果中id列的区别!!
当我们再次进行查询的时候……
select id,name from student;
经过结果,我们可以看出原始的数据并没有发生改变!!吓死宝宝了可!
因此,在查询的时候,通过简单的运算,并不会改变原始的数据!只是会创建一个临时表,跟原始数据无关!!
当然,,我们也可以把多个列放在一块进行运算!!
创建一个数据表!并进行插入数据!
-- 创建考试成绩表 DROP TABLE IF EXISTS exam_result; CREATE TABLE exam_result ( id INT, name VARCHAR(20), chinese DECIMAL(3,1), math DECIMAL(3,1), english DECIMAL(3,1) ); -- 插入测试数据 INSERT INTO exam_result (id,name, chinese, math, english) VALUES (1,'唐三藏', 67, 98, 56), (2,'孙悟空', 87.5, 78, 77), (3,'猪悟能', 88, 98.5, 90), (4,'曹孟德', 82, 84, 67), (5,'刘玄德', 55.5, 85, 45), (6,'孙权', 70, 73, 78.5), (7,'宋公明', 75, 65, 30);
查看表中的所有数据!
select * from exam_result;
在这个基础上,我们来进行多个列放在一起进行运算的操作!!
select name,chinese+math+english from exam_result;
按照表达式查询,临时表的列名与表达式一样!这样很不直观!!很不好看!!
4.因此,我们可以通过as 来定义别名!!
select name,chinese+math+english as total from exam_result;
我们可以通过两个列名的对比,来看出别名的好处/优势!!
5.去重查询 distinct 可以针对指定的列进行去重查询(把重复的行去掉,只保留一行)
select distinct math from exam_result;
很明显上述代码的最后结果,没有重复的数据!!
需要注意的是:distinct指定多个列的时候,要求这些列的值都相同,才视为重复!!
6.查询结果排序 order by 子句(指定某些列进行排序(升序,降序))!
按照数学成绩进行升序排序!!
select name,math from exam_result order by math;
对于该段的代码,我们的运行结果为:
对于MySQL而言,如果你不指定排序,那么,输出的MySQL结果,可能是随机的!!是不可预期的!!
如:
select * from student;
就比如这个代码而言:
虽然目前看着很有顺序,但是,当你的数据多了起来!比如:几万??几亿??几十亿??又会是一个不一样的结果!!希望可以注意一下!!
当然order by 也可以对多个列进行排序,中间用逗号分割!!(注意:对多个列进行排序的时候,写在前面的列优先排序,当出现数据一样的情况下,会在根据第二个列来进行排序!!
降序排序!!主要用到了desc
对数学成绩进行降序排序!
select name , math from exam_result order by math desc;
该段代码的最后结果为:
上述笔者讲述了一个升序排序,一个降序排序!!那么,希望大家能够注意一下语法问题!!!
我们也可以对多个列进行降序排序:如:先按照数学成绩降序排序,如果数学成绩相同,则按照语文成绩进行降序排序!!
select * from exam_result order by math desc,chinese desc;
运行结果为:
在日常生活中,我们所遇到的排序,大多数是按照多个列来进行排序的,那么,咱们最关键的就是要明确排序的列之间的主次关系!!
7.条件查询
所谓的条件查询,就是在查询的时候,指定筛选条件,符合条件的留下,不符合条件的直接pass!
条件查询,主要依靠:where子句+表达式来完成条件查询!
查询英语成绩小于60的
select * from exam_result where english<60;
经过上述的代码,我们可以看出来,所保留的结果都是英语成绩小于60的数据!!
对于该过程,我们可以理解为:
针对该数据库的表进行遍历,取出每一行的数据,把数据代入到条件中,看条件是否符合!如果为真,则保留,如果为假,则pass,进行下一条!
条件查询可以使用表达式作为条件!
筛选总分小于200的!
select * from exam_result where chinese+math+english < 200;
对于该段代码,我们需要注意表达式!!代码的运行结果为:
对于上述的结果,不相信的老铁,可以用计算器来算算哟!!
当然,在上述的这个代码中,指定的条件,在select中可以出现也可以不出现!
select name ,chinese+math+english from exam_result where chinese+math+english < 200;
该段代码的运行结果为:
值得注意的是:上述的运行结果,虽然chinses+math+english的列名,不怎么美观,但是,笔者仍然没有指定别名!!所以大家千万不要在where筛选的条件中加入别名!!这个是错误!!!
//错误 //where中不能加入别名! select name ,chinese+math+english as total from exam_result where total < 200;
对于该错误的代码,最后的运行结果为:
对于这个代码,这就需要我们来深入了解一下MySQL的执行顺序了!!
在上述的这个错误实列代码中,执行规则为:
- 遍历每一行
- 把这一行带入到where的条件中
- 符合条件的结果,再根据select这里指定的列进行查询/计算
注意:别名不能当作where的条件!这个和当前的sql语句的执行顺序有关,也是MySQL对于语法所规定的!!
and 和or语句
查询语文大于80并且英语大于80
select *from exam_result where chinese >80 and english >80;
运行结果为:
查询语文大于80或者英语大于80的!
select *from exam_result where chinese >80 or english >80;
运行结果为:
between……and…… 前闭后闭区间(包含两侧边界)
筛选语文成绩在80到90之间的
写法1:
select * from exam_result where chinese>=80 and chinese<=90;
该段代码的运行结果为:
写法2:
select * from exam_result where chinese between 80 and 90;
该段代码的运行结果为:
in
数学成绩在58或者59或者98或者99之间的
写法1:
select * from exam_result where math=58 or math=59 or math=98 or math=99;
写法2:
select * from exam_result where math in(58,59,98,99);
模糊查询:like----->模糊匹配
所谓的模糊查询:不要求元素完全相识,只要满足一定的规则就可以了!
like只支持两种用法!!
使用% |
表示任意0个或者任意N个 |
使用_(下划线) |
表示任意一个字符 |
比如:查找名字性孙的同学:
select * from exam_result where name like '孙%';
查找以孙结尾的名字
select * from exam_result where name like '%孙';
查找包含孙的名字
select * from exam_result where name like '%孙%';
对于_(下划线)的使用不多,所以更多的还是使用%作为模糊查询!!
分页查询(在很多地方都可以见到)
就比如400多条的数据,,总不能一页全部显示出来吧!!所以,我们可能需要分页,分成40多页,一页十个数据……
使用limit关键字:限制查询结果是几个!!
查询前3条的数据!
select * from exam_result limit 3;
当然,对于limit,我们还能搭配offset进行使用!!声明从哪一条开始查询(从0开始计数(下标))!
查询下标为3开始的3条数据!(从第四个数据开始)
select * from exam_result limit 3 offset 3;
查询下标为6开始的3条数据!(从第七个数据开始)
select * from exam_result limit 3 offset 6;
limit限制最多显示几条数据,如果数据不够,那么,有几个算几个!!
当然,我们进行了limit的分页查询,那么,我看也可以进行和之前的那些进行查询条件进行搭配使用!!
比如:我们要查询总分前三名的同学信息:
- 计算每个同学总成绩(表达式查询)
- 按照成绩进行排名(降序)
- 取前三条记录
那么,请看接下来的代码吧!!
select name,chinese+math+english as total from exam_result order by total desc limit 3;
该段代码的运行结果为:
3.修改 update 关键字
对于修改是一个很简单的语法,但是,对于大多数同学会记不住!!感觉太简单了,不用记,看看就行了,但是,等到后序在使用的时候,就会导致出现不会/写不出的情况!!
基础的语法为:
update 表名 set 列名=值,列名=值,………… where 条件;(order by/limit等也能使用)
将孙悟空的数学成绩修改为80分;
update exam_result set math=80 where name='孙悟空';
代码的运行结果显示,我们修改成功了!!
然后我们在查看一下孙悟空同学的成绩即可看出是否修改!!
select * from exam_result where name='孙悟空';
根据运行结果,我们可以看出,孙悟空的数学成绩成功的改为80分了!!
当然,对于修改的操作,我们也可以对多个列进行修改!!
将曹孟德的语文,数学,英语成绩都改为99分!
update exam_result set chinese=99,math=99,english=99 where name='曹孟德';
然后我们在查看一下曹孟德的成绩
select * from exam_result where name='曹孟德';
那么,请看接下来的运行结果!
当然,我们也可以对所有的数据进行指定列进行修改!!
将总分为前三名的数学成绩都减30分!!
update exam_result set math=math-30 order by chinese+math+english limit 3;
代码的运行结果为:
当然,如果你要是msth=math+30,那么,你就要考虑数据是否超出定义的范围了!!!
如果超出数据定义的范围,那么,可能会出现警告/不进行修改!!
将所有同学的语文成绩都改为0.5倍!!
update exam_result set chinese=chinese/2 ;
那么,需要我们注意一下,该段代码的最后运行结果!
显而易见的:出现了警告!!那么,我们可以查看一下警告!
show warnings;
根据上述的警告原因,我们可以看出,数据的第2行和第5行发生了截断!!主要还是由于定义的数据与发生截断后的数据(小数点后几位)不匹配!!
所以update 的修改操作很危险!!
4.删除记录(行) 以行为单位的删除 delete
最基础的语法为:
delete from 表名 where条件;(order by/limit也可以使用)
删除姓孙同学的记录!
delete from exam_result where name='孙%';
那么,我们查看一下表中所有的同学,看看还有没有孙姓的学生?
select * from exam_result;
根据最后的结果显示,表中没有孙姓的同学了!!
因此,delete 就是把条件匹配出来的结果全部删除!
当然,如果我们在delete删除的时候,不加where 或者order 等条件,那么,将会删除表中所有的数据,这个做法跟删除表没啥区别了!!
当然,如果要删除的数据量很大,很大,我们可以在删除的时候用CTRL+C(^C)进行强制中断!!
小结一下,瞬间开心!
增加 |
insert |
insert into 表名 values(值,值,值,…………); |
查找 |
select |
select* from 表名 |
修改 |
update |
update 表名 set 列名=值,列名=值,………… where 条件;(order by/limit等也能使用) |
删除 |
delete |
delete from 表名 where条件;(order by/limit也可以使用) |
到此为止,MySQL数据库的基础语法,笔者已经讲解的差不多了!!若有其他不足之处,那么,请移步其他文章!!尴尬!!害拍嘴喷!!