写在最前面的话
哈喽,宝子们,今天给大家带来的是MySql数据库的CRUD(增删改查),CRUD是数据库非常基础的部分,也是后端开发日常工作中最主要的一项工作,接下来让我们一起进入学习吧,感谢大家的支持!喜欢的话可以三连哦~~~
目录
语法:
insert into 表名 values(值,值...);--此处的值要与列的个数与类型匹配
执行上述SQL语句后,运行结果如下所示:
语法:
insert into 表名(列名,列名...) values(值,值...);
执行上述SQL语句后,运行结果如下所示:
语法:
insert into 表名 values(值,值...),(值,值...),...;
执行上述SQL语句后,运行结果如下所示:
当多行需要数据插入的时候,多行插入相比于单行插入在速度上要快上许多,为什么这么说呢?因为我们mysql是一个客户端服务器结构的程序,当三行数据执行单行插入的时候就进行了三次网络交互,但是当三行数据执行多行插入的时候只进行了一次网络交互,因此多行插入速度更快。
三次网络交互:
一次网络交互:
时间日期如何插入? (以datetime类型为例)
先构造一张数据表:
- -- 创建考试成绩表
- 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, 90),
- (4,'曹孟德', 82, 84, 67),
- (5,'刘玄德', 55.5, 85, 45),
- (6,'孙权', 70, 73, 78.5),
- (7,'宋公明', 75, 65, 30);
把表中所有的行和列都查询出来。
语法:
selecr * from 表名--*表示“通配符”,可以代指所有的列
执行上述SQL语句后,运行结果如下所示:
一个表的列数可能是非常多的,某个场景的操作下,只需要关注其中几个列。
语法:
select 列名,列名... from 表名;
执行上述SQL语句后,运行结果如下所示:
一边查询,一边进行计算。在查询的时候写做由列名构成的表达式,把这一列中所有的行都代入到表达式中参与运算(此处运算数据是临时数据)。
例如:想查询所有同学数学成绩都-10分的效果
select name,math-10 from exam_result;
执行上述SQL语句后,运行结果如下所示:
例如:计算每个同学的总成绩
select name,chinese+math+english from exam_result;
执行上述SQL语句后,运行结果如下所示:
综上,SQL在查询的时候,可以进行一些简单的统计操作。
查询的时候给列/表达式指定别名(也可以给表指定别名)。
语法:
select 表达式 as 别名 from 表名 (as 别名);
执行上述SQL语句后,运行结果如下所示:
引用distinct修饰某个列/多个列,值相同的行只保留一个。
用例:
- --去重前:
- select name,distinct math from exam_result;
- --去重后:
- select distinct name,distinct math from exam_result;
执行上述SQL语句后,运行结果如下所示:
查询的时候使用order by修饰列把行进行排序。
语法:
select 列名 from 表名 order by 列名 asc/desc;
注意:asc为升序,desc为降序,默认升序。
执行上述SQL语句后,运行结果如下所示:
select name,chinese+math+english as total from exam_result order by total asc;
执行上述SQL语句后,运行结果如下所示:
select * from exam_result order by math,chinese asc;
执行上述SQL语句后,运行结果如下所示:
order by指定的列,如果你select的时候没有把这一列查出来,也不影响使用排序
测试用例:
select name,math from exam_result order by chinese asc;
执行上述SQL语句后,运行结果如下所示:
修改测试用例:
select name,math,chinese from exam_result order by chinese asc;
执行上述SQL语句后,运行结果如下所示:
指定具体条件,按照条件针对数据进行筛选。
语法:
select 列名 from 表名 where 条件;
筛选条件一般通过运算符来组成。
运算符 | 说明 |
>,>=,<,<= | 大于,大于等于,小于,小于等于 |
= | 比较相等,SQL没有“==”,NULL不安全。例如NULL=NULL 结果是NULL |
<=> | 比较相等,NULL安全,例如NULL<=>NULL的结果是TRUE(1) |
!=,<> | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,[a0,a1],如果a0<=value<=a1,返回TRUE(1) |
IN(option,...) | 如果是()中的任意一个值,返回TRUE(1) |
IS NULL | 是NULL |
IS NOT NULL | 不是NULL |
LIKE | 模糊匹配。%表示任意多个(包括0)任意字符;_表示任意一个字符 |
补充知识:模糊匹配是通过一些特殊符号描述出规则/特征,筛选出哪些值符合规则/特征。
运算符 | 说明 |
AND | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1),结果为 FALSE(0) |
查询英语不及格的同学及英语成绩 ( < 60)
select name,english from exam_result where english<60;
查询语文成绩好于英语成绩的同学
select name,chinese,english from exam_result where chinese>english;
查询总分在 200 分以下的同学
select name,chinese+math+english from exam_result where chinese+math+english<200;
查询语文成绩大于80分,且英语成绩大于80分的同学
select name,chinese,english from exam_result where chinese>80 and english>80;
查询语文成绩大于80分,或英语成绩大于80分的同学
select name,chinese,english from exam_result where chinese>80 or english>80;
BETWEEN ... AND...
查询语文成绩在 [80, 90] 分的同学及语文成绩
select name,chinese from exam_result where chinese between 80 and 90;
使用AND也可以实现
select name,chinese from exam_result where chinese >= 80 and chinese <=90;
IN
查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
select name,math from exam_result where math in(58,59,98,99);
使用 OR 也可以实现
select name,math from exam_result where math=58 or math=59 or math=98 math=99;
孙%:查询以孙开头的
%孙:查询以孙结尾的
%孙%:查询包含孙的
% 匹配任意多个(包括 0 个)字符
select name from exam_result where name like '孙%';
_ 匹配严格的一个任意字符
select name from exam_result where name like '孙_';
其实使用select*这种方式查询是比较危险的,那么日常工作中我们如果需要保证一次查询,并且查询出来的数据准确的话,我们需要使用 分页查询,limit可以限制当前查询最多能查看几个结果。
用例:
select * from exam_result limit 3;
执行上述SQL语句后,运行结果如下所示:
此时显示出前三条,那么如果需要查看下面记录怎么显示,使用offset 偏移量 即可。
用例:
select * from exam_result limit 3 offset 3;
执行上述SQL语句后,运行结果如下所示:
语法:
- update 表名 set 列名 = 值 ... (where 条件);
- --此处的where限制具体要修改哪些数据
用例:
将孙悟空同学的数学成绩变更为 80 分
update exam_result set math=60 where name='孙悟空';
将总成绩倒数前三的 3 位同学的数学成绩加上 5 分
update exam_result set math=math+5 order by chinese+math+english limit 3;
将所有同学的语文成绩更新为原来的 0.5 倍
update exam_result set chinese = chinese*0.5;--update后面不加条件就是全列修改
用例:
将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
update exam_result set math=60,chinese=70 where name='曹孟德';
将孙悟空同学的英语成绩变为原来的0.8倍,语文成绩变为原来的0.5倍
update exam_result set english = english*0.8,chinese = chinese*0.5 where name = '孙悟空';
语法:
- delete from 表名 (where 条件/order by/limit);
- --根据括号内条件把符合的数据从表中删掉
用例:
删除孙悟空同学的考试成绩
delete from exam_result where name = '孙悟空';
删除整表数据
delete from exam_result;
拓展知识:这里的删除表delete和drop table不一样,前者只是删除表里的数据,表还在,后者则是把表的数据与表一起删除。
希望各位读者阅读后都能有所收获,如果喜欢本篇博客的可以点赞+关注+收藏!!!同时也欢迎各位大神如果在阅读过程中发现文章有错误也可私信指正错误,我们下一篇博客再见~~~