数据库CRUD一篇通

打印 上一主题 下一主题

主题 577|帖子 577|积分 1731


一、媒介

   

  • CRUD是数据库中非常基础的部分,也是我们后端开辟在日常工作中最紧张的一项工作。
  • 在上一篇文章中,我们已经大致讲解了怎样对数据库和数据库中的指定表进行增删改查的操作,接下来我将更加过细的讲解一下对表中怎样插入数据。
  
二、表中的新增操作(Insert into)


2.1 新增语法

   为表中新增数据的语法:
use 数据库名;
create table if not exists 表名(列名 数据范例,列名 数据范例,列名 数据范例);

insert into 表名 values(值,值,值,值…);
插入的值必须与列的个数和列的范例相符合,否则控制台会报错。

  
2.1.2 代码示例(一)

  1. create database if not exists test charset utf8;
  2. use test;
  3. create table if not exists student(id int,name varchar(20));
  4. insert into student values(1,'张三');
复制代码
  结果如下:


  2.1.2.2 代码示例(二)

  1. create database if not exists class charset utf8;
  2. use class;
  3. create table if not exists student(age int,name varchar(20),sex varchar(5),
  4.                                           class_id varchar(5));
  5. desc student;
  6. 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 代码示例(二)

  1. use class;
  2. insert into class (class_id) values (2);
  3. use class;
  4. insert into student (class_id) values (2);
  5. insert into student (name) values ('李四');
复制代码
  结果如下:


  2.2.2.2 代码示例(二)

  1. use class;
  2. insert into student (id) values(3);
  3. insert into student (name) values('王五');
  4. insert into student (id)(name) values(4,,'初一');
复制代码
  结果如下:


  2.3 一次插入多条数据

   为表中一次插入多条数据的语法:
use 数据库名;
insert into 表名values (值,值),(值,值), (值,值…);
  
2.3.2 代码示例

  1. use class;
  2. insert into student  values(10,'初二','男', '中文系一班'),
  3.                            (6,'初三','女','中文系一班'),(7,'初四','男','中文系二班');
复制代码
  结果如下:


  2.3.3 学习小贴士

   请留意:
因为我们的MySQL数据库是一个“客户端——服务器”布局的程序,一次插入多条数据的速度会比多次插入的速度更快,因为会涉及到网络交互的问题。多次插入会涉及到多次网络交互,以是我更保举一次插入多条数据,只管如许数据的体积会更大,但影响微乎其微。
  
2.4 如安在表中插入时间范例的数据


2.4.1 datetime范例数据插入代码示例

  1. use class;
  2. insert into student values(1,'张三','2022-01-01 12:00:00');
  3. select * from student;
复制代码
  结果如下:


  2.4.2 当下时刻的数据插入代码示例

  1. use class;
  2. insert into student values(2,'lisi',now());
  3. select * from student;
复制代码
  结果如下:


  2.4.3 学习小贴士

   请留意:
在SQL中我们不但能够自己指定数值也可以利用SQL语言捕获时间。其中now( )函数,就是用于捕获当下时间的函数。
  
三、表中的查询操作(Retrieve)

   SQL在查询的时候是可以进行一些简单的统计操作的,并且在进行数据查询时,是将服务器里的数据读出来返回给客户端,并且以暂时表的情势响应给客户端。这里的操作并不会修改数据库服务器上的原始数据,只是在最终响应里的“暂时结果”中做了计算。
  
3.1 创建表格后查询数据

  1. create database if not exists class charset utf8;
  2. use class;
  3. create table if not exists exam_result(id int, name varchar(20), chinese decimal(3,1),
  4.                                        math decimal(3,1), english decimal(3,1));
  5. insert into exam_result (id,name,chinese,math,english) values((1,'唐三藏',67,98,56),
  6.                             (2,'孙悟空',87.5,78,77),(3,'猪八戒',88,98,90),
  7.                             (4,'白龙马',55.5,86,45));
  8. desc exam_result;   
复制代码
  结果如下:

  在数据库的操作中,增删改的操作都是相对固定的,只有查询的方式会更加的五花八门。以是接下来我将会具体先容各种查询的操作。

3.2 全列查询


3.2.1 语法布局

   在指定表中查询数据的语法:
use 数据库名;
select * from 表名;
  
3.2.2 代码示例(一)

  1. use class;
  2. select * from exam_result;
复制代码
  结果如下:


  3.2.2代码示例(二)

  1. use class;
  2. 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 代码示例

  1. use class;
  2. select name, chinese from exam_result;
复制代码
  结果如下:


  3.4 查询字段为表达式


3.4.1 语法布局

   语法布局:select 表达式,表达式,表达式 from 表名;
在查询的时候,写作由列名构成的表达式,把这一列中的全部行都带入到表达式中参与运算。
  
3.4.2 代码示例(一)

  1. use class;
  2. select name,chinese - 10 from exam_result;
  3. select name,chinese from exam_result;
复制代码
  结果如下:


  3.4.2 代码示例(二)

  1. use class;
  2. select name,chinese + english + math from exam_result;
  3. select name,chinese from exam_result;
复制代码
  结果如下:


  3.4.3学习小贴士

   在列中的值null和任何数字相加,得出的结果都是null。
  
3.5 别名


3.5.1 语法布局

   语法布局:
use 数据库名;
select 表达式 as 别名 from 表名;
as的作用是查询的时候给列 / 表达式 指定别名。
  
3.5.2 代码示例

  1. use class;
  2. 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 代码示例(一)

  1. use class;
  2. select math from exam_result;
  3. select distinct math from exam_result;
复制代码
  结果如下:


  3.6.3 代码示例(二)

  1. use class;
  2. select distinct name,math from exam_result;
复制代码
  结果如下:


  3.6.3 代码示例(三)

  1. use class;
  2. insert into exam_result valuse (10, '唐三藏',null,98.0,null);
  3. 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 代码示例(一)

  1. use class;
  2. select name , math from exam_result;
复制代码
  结果如下:


  3.7.3 代码示例(二)

  1. use class;
  2. select name , math from exam_result order by math asc;
复制代码
  结果如下:


  3.7.3 代码示例(三)

  1. use class;
  2. select name , math from exam_result order by math asc;
复制代码
  结果如下:


  3.7.3 代码示例(四)

  1. use class;
  2. select name , math from exam_result order by chinese desc;
复制代码
  结果如下:


  3.7.3 代码示例(五)

  1. use class;
  2. select name, math, chinese from exam_result order by chinese desc;
复制代码
  结果如下:

    总结:
从代码四和代码五中,我们可以得出一个结论:即使将order by 指定的列并没有在select的时候表现查询出来,也是不影响最终的排序结果的。
  
3.7.3 代码示例(六)

  1. use class;
  2. select name,math + chinese + english from exam_result order by math + chinese + english;
复制代码
  结果如下:


  3.7.3 代码示例(七)

  1. use class;
  2. select name,math + chinese + english as total from exam_result order by total;
复制代码
  结果如下:


  3.7.3 代码示例(八)

  1. use class;
  2. select name,math,chinese,english from exam_result order by math, chinese;
复制代码
  结果如下:


  3.7.3 代码示例(九)

  1. use class;
  2. select name,math,chinese,english from exam_result order by math, chinese desc;
复制代码
  结果如下:


  3.7.3 代码示例(十)

  1. use class;
  2. select name,math,chinese,english from exam_result order by math desc, chinese desc;
复制代码
  结果如下:


  3.7.3 代码示例(十一)

  1. use class;
  2. 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 代码示例(一)

  1. use class;
  2. select name,english from exam_result where english < 60;
复制代码
  结果如下:


  3.8.2 代码示例(二)

  1. use class;
  2. select name,chinese,english from exam_result where chinese > english;
复制代码
  结果如下:


  3.8.2 代码示例(三)正确树模

  1. use class;
  2. select name,english + math + chinese as total from exam_result
  3.                                           where chinese + math + english > 100;
复制代码
  结果如下:


  3.8.2 代码示例(三)错误树模

  1. use class;
  2. 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 代码示例(四)

  1. use class;
  2. select name,chinese, english from exam_result where chinese > 80 and english > 80;
复制代码
  结果如下:


  3.8.2 代码示例(五)

  1. use class;
  2. 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 代码示例

  1. use class;
  2. select name,chinese from exam_result where chinese between 80 and 90;
  3. //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 代码示例

  1. use class;
  2. 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 代码示例(一)

  1. use class;
  2. select * from exam_result;
  3. 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 代码示例(二)

  1. use class;
  2. insert into exam_result values (6,'孙权',41,27,77),(7,'孙行者',44,58,74),
  3.                     (8,'行孙者',77.5,35.5,76),(9,'行者孙',54,21,75),(11,'孙',27,89,83);
  4. select* from exam_result where name like '孙%';
  5. select* from exam_result where name like '%孙';
  6. 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代码示例

  1. use class;
  2. select * from exam_result;
  3. 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代码示例(一)

  1. use class;
  2. select * from exam_result limit 3;//一次只显示3行数据
复制代码
  结果如下:

  3.9.2 null代码示例(二)

  1. use class;
  2. select * from exam_result;
  3. 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 修改一列数据代码示例

  1. use class;
  2. update exam_result set math = 80 where name = '孙悟空';
  3. select * from exam_result;
复制代码
  结果如下:

  4.3 修改多列数据代码示例

  1. use class;
  2. update exam_result set math = 60, chinese = 50 where name = '唐三藏';
  3. select name,math,chinese from exam_result where name = '唐三藏';
复制代码
  结果如下:

  4.4 修改表达式数据代码示例

  1. use class;//将总成绩倒数第三的同学数学分数+10
  2. select * from exam_result order by chinese + math + english limit 3;
  3. update exam_result set math = math + 10 order by chinese + math + english limit 3;
  4. select * from exam_result order by chinese + math + english limit 3;
复制代码
  结果如下:

  4.5 修改表达式数据代码示例

  1. use class;//将所有同学的语文成绩÷2
  2. update exam_result set chinese = chinese / 2;
  3. select * from exam_result;
复制代码
  结果如下:

  五、删除数据


5.1 怎样修改数据?

   语法布局:
delete from 表名 where 条件表达式 / order by / limit;
将符合条件的行从表中删撤消。
如果删除的是整张表中的数据,不会将表删除,但是会将表内的数据全部删除,表成为空表。并且这里的删除持久生效,会影响到数据库服务器硬盘中的数据。
但是drop table不一样,drop table是删除表,并且连带着表里的数据一起删除。
  5.2 删除某个条件下的数据

  1. use class;//删除孙悟空的考试成绩
  2. delete from exam_result where name = '孙悟空';
  3. select * from exam_result;
复制代码
  结果如下:

  5.3 删除整张表中的数据

  1. use class;//删除孙悟空的考试成绩
  2. delete from exam_result;
  3. select * from exam_result;
复制代码
  结果如下:

  六、数据库备份

   

  • 数据库最终都是存储在硬盘上的,以文件的情势表现的。(工作目录下会存有文件,这些二进制文件用来存储数据。)可以将这里的文件全部全量备份去其他呆板上,但缺点是无法频繁使用。
    2.mysqldump工具(MySQL自带的一个程序,该程序会把你的MySQL中的数据导出成一系列的insert语句,然后再把这些insert语句放到另一个MySQL中进行执行。)全量备份和实时备份都可以。
    3.mysql还有一个binlog功能(把mysql中的各种操作都通过日记记载下来,借助binlog让另一个数据库按照binlong的内容执行,也可以得到一样的数据。)该方法一般用于增量备份/实时备份。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表