文章目录
- 一、前言
- 二、表中的新增操作(Insert into)
- 三、表中的查询操作(Retrieve)
- 四、修改数据
- 五、删除数据
- 六、数据库备份
一、前言
- CRUD是数据库中非常基础的部分,也是我们后端开发在日常工作中最主要的一项工作。
- 在上一篇文章中,我们已经大致讲解了如何对数据库和数据库中的指定表进行增删改查的操作,接下来我将更加细致的讲解一下对表中如何插入数据。
二、表中的新增操作(Insert into)
2.1 新增语法
为表中新增数据的语法:
use 数据库名;
create table if not exists 表名(列名 数据类型,列名 数据类型,列名 数据类型);
insert into 表名 values(值,值,值,值…);
插入的值必须与列的个数和列的类型相符合,否则控制台会报错。
2.1.2 代码示例(一)
create database if not exists test charset utf8;
use test;
create table if not exists student(id int,name varchar(20));
insert into student values(1,'张三');
结果如下:
2.1.2.2 代码示例(二)
create database if not exists class charset utf8;
use class;
create table if not exists student(age int,name varchar(20),sex varchar(5),
class_id varchar(5));
desc student;
insert into student values(18,'张三','男','中文系1班');
结果如下:
2.1.3 学习小贴士
请注意:
1.表是MySQ服务器中存储的“数据集合”的基本组成结构,所以在使用表之前是需要通过use来指定某个确定的数据库的。
2.MySQL是支持在字符类型中插入中文的,如果报错大概率是因为创建数据库时没有指定编码方式。导致编解码方式不一致。
3.MySQL没有字符串的概念,所以输入字符时使用‘或者“都是可以的。
2.2 指定列插入语法
为表中指定列插入数据的语法:
use 数据库名;
insert into 表名 (列名,列名,列名…) values (值,值,值,…);
注意:插入的值必须与列的数量与列的类型相一致。
2.2.2 代码示例(二)
use class;
insert into class (class_id) values (2);
use class;
insert into student (class_id) values (2);
insert into student (name) values ('李四');
结果如下:
2.2.2.2 代码示例(二)
use class;
insert into student (id) values(3);
insert into student (name) values('王五');
insert into student (id)(name) values(4,,'初一');
结果如下:
2.3 一次插入多条数据
为表中一次插入多条数据的语法:
use 数据库名;
insert into 表名values (值,值),(值,值), (值,值…);
2.3.2 代码示例
use class;
insert into student values(10,'初二','男', '中文系一班'),
(6,'初三','女','中文系一班'),(7,'初四','男','中文系二班');
结果如下:
2.3.3 学习小贴士
请注意:
因为我们的MySQL数据库是一个“客户端——服务器”结构的程序,一次插入多条数据的速度会比多次插入的速度更快,因为会涉及到网络交互的问题。多次插入会涉及到多次网络交互,所以我更推荐一次插入多条数据,尽管这样数据的体积会更大,但影响微乎其微。
2.4 如何在表中插入时间类型的数据
2.4.1 datetime类型数据插入代码示例
use class;
insert into student values(1,'张三','2022-01-01 12:00:00');
select * from student;
结果如下:
2.4.2 当下时刻的数据插入代码示例
use class;
insert into student values(2,'lisi',now());
select * from student;
结果如下:
2.4.3 学习小贴士
请注意:
在SQL中我们不仅能够自己指定数值也可以利用SQL语言捕获时间。其中now( )函数,就是用于捕获当下时间的函数。
三、表中的查询操作(Retrieve)
SQL在查询的时候是可以进行一些简单的统计操作的,并且在进行数据查询时,是将服务器里的数据读出来返回给客户端,并且以临时表的形式响应给客户端。这里的操作并不会修改数据库服务器上的原始数据,只是在最终响应里的“临时结果”中做了计算。
3.1 创建表格后查询数据
create database if not exists class charset utf8;
use class;
create table if not exists 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,'白龙马',55.5,86,45));
desc exam_result;
结果如下:
在数据库的操作中,增删改的操作都是相对固定的,只有查询的方式会更加的五花八门。所以接下来我将会详细介绍各种查询的操作。
3.2 全列查询
3.2.1 语法结构
在指定表中查询数据的语法:
use 数据库名;
select * from 表名;
3.2.2 代码示例(一)
use class;
select * from exam_result;
结果如下:
3.2.2代码示例(二)
use class;
select * from student;
结果如下:
3.2.3 学习小贴士
1.*表示通配符,可以指代所有的列。
2.所谓全列查询就是将表中的所有数据展示出来;
3.客户端向服务器发起一个查询请求,服务器通过网络将查询出来的数据返回给客户端,并且以表格的形式打印出来。
4.但是请注意,我们MySQL数据库是一个“客户端—服务器”结构的软件,客户端进行的操作都会通过网络以请求的方式发送给服务器,服务器查询的结果页就会通过响应返回给客户端。
但如果此时你要访问的这个数据库里的当前表数据特别多的话,就会产生问题:
1.由于数据是存储在硬盘上的,所以极有可能将硬盘上的IO跑满,此时程序的其他部分想去访问硬盘就会非常的慢。
2.由于客户端和服务器是通过网络通信,所以也有可能吧网卡的带宽也给跑满,此时其他客户想要通过网络访问服务器也会非常慢,这样的拥堵就可能导致客户端无法顺利访问到数据库,这也就会进一步对系统造成影响。所以在针对数据量比较大的生产环境中,请不要随意使用select * 语句。
3.3 指定列查询
3.3.1 语法结构
指定列查询语法结构:select 列名,列名… from 表名;
3.3.2 代码示例
use class;
select name, chinese from exam_result;
结果如下:
3.4 查询字段为表达式
3.4.1 语法结构
语法结构:select 表达式,表达式,表达式 from 表名;
在查询的时候,写作由列名构成的表达式,把这一列中的所有行都带入到表达式中参与运算。
3.4.2 代码示例(一)
use class;
select name,chinese - 10 from exam_result;
select name,chinese from exam_result;
结果如下:
3.4.2 代码示例(二)
use class;
select name,chinese + english + math from exam_result;
select name,chinese from exam_result;
结果如下:
3.4.3学习小贴士
在列中的值null和任何数字相加,得出的结果都是null。
3.5 别名
3.5.1 语法结构
语法结构:
use 数据库名;
select 表达式 as 别名 from 表名;
as的作用是查询的时候给列 / 表达式 指定别名。
3.5.2 代码示例
use class;
select name,chinese + english + math as result from exam_result;
结果如下:
3.6 去重查询
3.6.1 什么叫做去重查询?
- 所谓去重查询就是利用:distinct 修饰某个列或多个列,这些列中值相同的行,只会保留一个。
3.6.2 语法结构
语法结构:
use 数据库名;
select distinct 列名 from 表名;
3.6.3 代码示例(一)
use class;
select math from exam_result;
select distinct math from exam_result;
结果如下:
3.6.3 代码示例(二)
use class;
select distinct name,math from exam_result;
结果如下:
3.6.3 代码示例(三)
use class;
insert into exam_result valuse (10, '唐三藏',null,98.0,null);
select distinct name,math from exam_result;
结果如下:
3.6.4 学后思考
让我们来想想为什么代码二和代码三产生的结果会不一样呢?
难道是因为我们新加的那句:insert into exam_result valuse (10, ‘唐三藏’,null,98.0,null)吗?
没错,其实并不是distinct失效了,而是当distinct修饰多个列名时,只有当多个列名同时重复的时候,表中的数据才会被过滤掉。
3.7 排序查询
3.7.1 什么是排序查询?
- 将数据以某列为基准进行升序或者降序的方式响应给客户端。
3.7.2 语法结构
语法结构:
use 数据库名;
select 列名 from 表名 order by 列名 asc/ desc;
若是后面没有加上desc,则默认是按照升序排序。
3.7.3 代码示例(一)
use class;
select name , math from exam_result;
结果如下:
3.7.3 代码示例(二)
use class;
select name , math from exam_result order by math asc;
结果如下:
3.7.3 代码示例(三)
use class;
select name , math from exam_result order by math asc;
结果如下:
3.7.3 代码示例(四)
use class;
select name , math from exam_result order by chinese desc;
结果如下:
3.7.3 代码示例(五)
use class;
select name, math, chinese from exam_result order by chinese desc;
结果如下:
总结:
从代码四和代码五中,我们可以得出一个结论:即使将order by 指定的列并没有在select的时候显示查询出来,也是不影响最终的排序效果的。
3.7.3 代码示例(六)
use class;
select name,math + chinese + english from exam_result order by math + chinese + english;
结果如下:
3.7.3 代码示例(七)
use class;
select name,math + chinese + english as total from exam_result order by total;
结果如下:
3.7.3 代码示例(八)
use class;
select name,math,chinese,english from exam_result order by math, chinese;
结果如下:
3.7.3 代码示例(九)
use class;
select name,math,chinese,english from exam_result order by math, chinese desc;
结果如下:
3.7.3 代码示例(十)
use class;
select name,math,chinese,english from exam_result order by math desc, chinese desc;
结果如下:
3.7.3 代码示例(十一)
use class;
select name,math,chinese,english from exam_result order by math desc, chinese;
结果如下:
总结:排序查询时不仅可以通过对某一列的值进行asc/desc的方式排序,也可以通过多列的指定来排序。
多列排序有先后之分,当前面的列排序后如果有重复值就按照后面列的排序方式排序。
3.7.4 学习小贴士
请注意:
1.MySQL是一个“客户端—服务器”结构的程序,当客户端把请求发给服务器之后,服务器进行查询数据,并且把查询到的结果进行排序之后,再组织成响应数据返回给客户端。
2.此时的排序操作仍然是针对临时数据来展开的,不会影响原有数据在MySQL服务器上的存储数据。
3.如果一个SQL语句不加order by,那么此时查询到的数据顺序是“无序"的。只有当加上了order by后查询出的数据顺序才可以依赖。
3.8 条件查询
3.8.1 如何进行条件查询?
语法结构:
use 数据库名;
select 列名 from 表名 where 条件表达式;
这条语句会指定具体的条件,按照条件针对数据进行筛选。
3.8.2 代码示例(一)
use class;
select name,english from exam_result where english < 60;
结果如下:
3.8.2 代码示例(二)
use class;
select name,chinese,english from exam_result where chinese > english;
结果如下:
3.8.2 代码示例(三)正确示范
use class;
select name,english + math + chinese as total from exam_result
where chinese + math + english > 100;
结果如下:
3.8.2 代码示例(三)错误示范
use class;
select name,english + math + chinese as total from exam_result where total > 100;
结果如下:
总结:
从上述两个SQL语句中,我们可以大胆推测出错原因是否是where语句中的total这个单词呢?
答案是对的,如果想要深刻了解错误原因那我们就要先来了解一下select 条件查询执行的顺序
(1)遍历表中的每个记录;
(2)把当前记录的值代入条件中,根据条件去进行筛选。
(3)如果条件成立则保留该条数据,然后再对该列上的表达式进行计算。
这也就意味着where语句是第二部执行的,执行where语句的时候total还处于“未定义” 的状态。
(4)如果有order by 则会在所有行都被获取到之后,表达式也计算完之后才会针对所有结果进行排序。
3.8.2 代码示例(四)
use class;
select name,chinese, english from exam_result where chinese > 80 and english > 80;
结果如下:
3.8.2 代码示例(五)
use class;
select name,chinese, english from exam_result where chinese > 80 or english > 80;
结果如下:
3.8.3 between…and…
3.8.3.1 语法结构
use 数据库名;
select 列名,列名 from 表名 列名 between 值 and 值…[闭区间];
3.8.3.2 between and 代码示例
use class;
select name,chinese from exam_result where chinese between 80 and 90;
//select name,chinese from exam_result where chinese >= 80 and chinese <= 90;
结果如下:
3.8.4 in 表示某些确定的值的选择
3.8.4.1 语法结构
use 数据库名;
select 列名,列名 from 表名 in(值,值,值,值)…
用于指定某些离散的值。
3.8.4.2 in 代码示例
use class;
select name,math from exam_result where math in (58, 59, 98, 99);
结果如下:
3.8.5 like 模糊匹配
3.8.5.1 什么叫做模糊匹配?
之前我们所描述的都是准确的筛选条件,而模糊匹配不同,模糊匹配一般要和通配符一起使用。所谓通配符就是一些能表示特定含义的特殊字符。
%:表示任意个任意字符;
_:代指一个任意字符;
3.8.5.2 语法结构
use 数据库名;
select 列名 from 表明 where 列名 like ;
3.8.5.3 代码示例(一)
use class;
select * from exam_result;
select * from exam_result where name like '孙%';
select * from exam_result where name like '孙_';
select * from exam_result where name like '孙__';
结果如下:
8.5.3.4 代码示例(二)
use class;
insert into exam_result values (6,'孙权',41,27,77),(7,'孙行者',44,58,74),
(8,'行孙者',77.5,35.5,76),(9,'行者孙',54,21,75),(11,'孙',27,89,83);
select* from exam_result where name like '孙%';
select* from exam_result where name like '%孙';
select* from exam_result where name like '%孙%';
结果如下:
3.8.6 如何判断数值是否为null?
3.8.6.1学习小贴士:
1.在SQL语句中,=被认为是不安全的,null = null 结果还是null,也就等同于false。所以不会被查询出。那么我们该如何解决这个问题呢?可以选择用is null来判定或者是<=>。
2.is null 只能对一个列进行判断,但是<=>可以对两个列同时进行判断。
3.8.6.2 null代码示例
use class;
select * from exam_result;
select * from exam_result where chinese = null;
select * from exam_result where chinese <=> null;
select * from exam_result where chinese is null;
select * from exam_result where chinese <=> english;
select * from exam_result where chinese is null && english is null;
结果如下:
3.9 分页查询
3.9.1学习小贴士:
1.在SQL服务器中保存了海量的数据,如果使用select * 一次性全部查询出来不仅会影响执行效率,也不方便阅读,所以这个时候我们就可以使用limit关键字来限制一次查询的个数,以达到分页查询的目的。
2.如果limit语句中存在order by的话,order by需要写在limit前面。
3.offset 表示偏移量。
3.9.2 null代码示例(一)
use class;
select * from exam_result limit 3;//一次只显示3行数据
结果如下:
3.9.2 null代码示例(二)
use class;
select * from exam_result;
select * from exam_result limit 3 ;
select * from exam_result limit 3 offset 0;
select * from exam_result limit 3 offset 3;
select * from exam_result limit 3 offset 6;
select * from exam_result limit 3 offset 9;
结果如下:
四、修改数据
4.1 如何修改数据?
语法结构:
update 表名 set 列名 = 值,set 列名= 值… where 条件表达式;
这个表达式限制了这次操作具体要修改哪些行的数据。使用update可以一次修改多个值,并且这里的修改持久生效,会影响到数据库服务器硬盘中的数据。
4.2 修改一列数据代码示例
use class;
update exam_result set math = 80 where name = '孙悟空';
select * from exam_result;
结果如下:
4.3 修改多列数据代码示例
use class;
update exam_result set math = 60, chinese = 50 where name = '唐三藏';
select name,math,chinese from exam_result where name = '唐三藏';
结果如下:
4.4 修改表达式数据代码示例
use class;//将总成绩倒数第三的同学数学分数+10
select * from exam_result order by chinese + math + english limit 3;
update exam_result set math = math + 10 order by chinese + math + english limit 3;
select * from exam_result order by chinese + math + english limit 3;
结果如下:
4.5 修改表达式数据代码示例
use class;//将所有同学的语文成绩÷2
update exam_result set chinese = chinese / 2;
select * from exam_result;
结果如下:
五、删除数据
5.1 如何修改数据?
语法结构:
delete from 表名 where 条件表达式 / order by / limit;
将符合条件的行从表中删除掉。
如果删除的是整张表中的数据,不会将表删除,但是会将表内的数据全部删除,表成为空表。并且这里的删除持久生效,会影响到数据库服务器硬盘中的数据。
但是drop table不一样,drop table是删除表,并且连带着表里的数据一起删除。
5.2 删除某个条件下的数据
use class;//删除孙悟空的考试成绩
delete from exam_result where name = '孙悟空';
select * from exam_result;
结果如下:
5.3 删除整张表中的数据
use class;//删除孙悟空的考试成绩
delete from exam_result;
select * from exam_result;
结果如下:
六、数据库备份
- 数据库最终都是存储在硬盘上的,以文件的形式体现的。(工作目录下会存有文件,这些二进制文件用来存储数据。)可以将这里的文件全部全量备份去其他机器上,但缺点是无法频繁使用。
2.mysqldump工具(MySQL自带的一个程序,该程序会把你的MySQL中的数据导出成一系列的insert语句,然后再把这些insert语句放到另一个MySQL中进行执行。)全量备份和实时备份都可以。
3.mysql还有一个binlog功能(把mysql中的各种操作都通过日志记录下来,借助binlog让另一个数据库按照binlong的内容执行,也可以得到一样的数据。)该方法一般用于增量备份/实时备份。