MySQL:CRUD
文章目录
- 一,MySQL表的增删改查
- 二,新增(Create)
- 2-1 单个新增
- 2-2 多个新增
- 2-3 编码集
- 三,查询(Retrieve)
- 3-1 指定列
- 3-2 去重数据
- 3-2 排序数据
- 3-4 条件查询
- 3-5 分页查询
- 四,更新 (Update)
- 4-1 条件修改
- 五,删除(Delete)
- 5-1 DELETE
一,MySQL表的增删改查
在我们电脑上,有多个数据库,每个数据库都有多个表,每个表都有多个行,每个行都有多个列,将这些位置位置信息都拿到后,我们才能得到我们需要的数据,本篇博客会对数据库的增删改查进行讲解。
为什么这篇博客标题叫CRUD
,因为CRUD
的全称为C:Create
,R:Retrieve
,U:Update
,D:Delete
,分别是创建,检查,更新,删除。
二,新增(Create)
2-1 单个新增
这里的新增,我们来讲解一下在一个表中新增行的操作,在表中新增行,我们需要将我们想要的数据对应到每个表中的列的数据类型当中,使用到的语法是INSERT INTO
,在这里我们要记住,插入数据库的表是需要和表中的对象一一对应。
数据表样例
代码格式:
我们来随意插入一个数据
在这种插入模式当中,这基本上就是插入一个数据行的正确方式,还有一些错误的方式如果有字段名没有被指定数据,那么数据的值会被置为NULL
,如果数据表当中设置了这个数据类型的默认值,那么会使用这个数据的默认值,但是如果数据表指定了这个数据类型不能为空,且没有默认值,那么数据库会阻止访问插入。
还是就是数据类型和插入的值类型不对应,那么这种情况,数据库的整形会兼容一些字符串类型,如果字符串的数据可以转化为整形,数据库插入会允许插入,并且将字符串转化为整形
- 简化新增
简化新增的指令样例,只需把需要添加的数据在VALUES
中列出来就行了
INSERT INTO student VALUES(数据1,数据2,......);
演示代码
但是这种简化的插入是有很多缺陷的,在后面的写代码的过程中尽量不要使用这种方式,如果表的结构发生了变化,再次使用这种方式可能会发生问题
2-2 多个新增
如果一条一条的去写添加数据实在是太累了,SQL
为我们提供了一种一次性添加多个数据的指令
指令格式:
INSERT INTO 表名 (字段1, 字段2, ...)
VALUES(值1-1, 值1-2, ...), -- 第一条数据(值2-1, 值2-2, ...), -- 第二条数据(值3-1, 值3-2, ...); -- 第三条数据(最后一条不加逗号)
演示代码:
这种一次写入多个数据的方式会比一次写入一个数据的方式要好很多,可以节省网络和性能开销,每次执行一次指令都要开启一个事务,每次执行一个插入指令,都要使用磁盘的IO
,还有就是网络的开销,所以一次插入所有的数据比一个一个插入的效率要高那么一点
2-3 编码集
之前我们的操作使用的字符编码集是UTF-8
,这种编码集可以支持很多的语言,那如果我们换一个字符编码集来试试,
mysql> create database textsql1 character set latin1;
创建一个以拉丁为字符编码集的数据库,创建一个表,并且向里面插入的字符串数据是中文。
演示结果
mysql> INSERT INTO student(id,name) VALUES(1,"赶出好");
ERROR 1366 (HY000): Incorrect string value: '\xB8\xCF\xB3\xF6\xBA\xC3' for column 'name' at row 1
mysql>
这里报错了,这个错误是由于字符编码不匹配导致的,MySQL
无法正确解析插入的中文字符
三,查询(Retrieve)
查询数据库中的数据,我们一般使用的是select
指令
SELECT * FROM TABLE;
演示代码:
但是这种查询在真正的业务代码中是很危险的,因为在业务代码中涉及到的数据库的容量可能有几十TB,一次性这样查询根本什么都查不到
所以我们查询数据需要指定我们需要的数据,指定数据一般有指定行和指定列
3-1 指定列
指定列的指定一般是
select id,subject from GRADE;
演示结果
当然,我们也可以查询列里面没有的数据
这里的10不在数据库当中,只是查询的时候我们想要将他显示出来。
查询列,我们也可以对列表进行值的修改。
根据这个特性,我们可以在查询数据表当中的数据时,将一些数据累加起来
这里的总分是我们给表中的类型命的新名,本身在数据表当中并不存在
3-2 去重数据
当我只在表中查询math数据时
这里会有两个90
的数据,SQL
语言给我们提供了一个distinct
关键字让我们可以去除列相同的数据
那么这里就只剩一个90
的数据了,但是distinct
去除一行的数据需要每一列的数据都相同才会去除
这里存在一个id
不相同所以即使math
相同也不会去除数据
3-2 排序数据
排序数据就是在查询数据表的时候,规定一种从上到下的排序规则,通过增加order by
来指定规则,我们来演示一下
这里我们对math
成绩进行升序排序,从math
成绩低的一直排序到成绩高的
这里我们对math
进行降序就是使用DESC
,从成绩高的一直排到成绩低的,在我们没有写规则的时候默认时升序排序。
数据排序我们也可以使用别名
数据排序我们设计多个规则。
这里我们设置了两个排序规则,当math
数据相同的时候,使用chinese
进行降序排序
3-4 条件查询
条件查询,我们主要记住WHERE
关键字,在WHERE
关键字后面加上条件语句,符合条件的行显示结果
基本语法
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件;
关键元素 一系列列名
,表名
,条件
我们来用之前创建的table
来演示一下
SELECT * FROM exam WHERE math<90;
演示结果会显示math
成绩小于90
的行元素
在SQL
语言中和其它语言的比较方式有所不同
我们来类举几个不同的比较方式
<=>:表示两个数据是否相同,但是不是也有=
来比较相同吗,那这个有什么特别的。当我们用=
来比较两个数据时,其中有一个数据是NULL
,那么返回值必定会是NULL
,因为在SQL
语言中NULL
真的就是NULL
,表示空值,和其它的语言不一样,NULL
是0
的宏,但是使用<=>
来比较NULL
和其它数据,它会返回true
或者false
。所以<=>
比=
多一个就是可以用来比较NULL
。
演示代码:
SELECT NULL<=>NULL;
SELECT NULL=NULL;
BETWEEN … AND …:表示区间范围
演示代码
SELECT * FROM exam WHERE math BETWEEN 50 AND 80;
演示结果
这里只显示math
大于50
小于80
的数据
WHERE
的条件用法还有:IN
,LIKE
,IS NULL
,IS NOT NULL
,AND
,OR
,NOT
,这里很杂了,不太需要记忆,以后用到那个就再搜索就可以了。我们要注意一下,在组合条件中NOT
的优先级大于AND
,AND
的优先级是大于OR
的
3-5 分页查询
当我们在业务代码中查询浏览数据时,直接用SELECT * FROM TABLE;
,可能会导致满屏幕的数据,甚至卡死,因为数据实在是太多了,可能有几百TB的数据,那么这样我们就需要一段一段地查询
分页查询格式
SELECT * FROM exam LIMIT 数量 OFFSET 起始位置;
或者
SELECT * FROM exam LIMIT 起始位置,数量;
四,更新 (Update)
更新就是更新表单里面的数据,一般用于程序后端发送一个修改请求,然后SQL
语言执行更新操作
4-1 条件修改
UPDATE exam SET math=100 WHERE english=70;
SELECT * FROM exam ORDER BY english ASC;
这里我们将英语成绩为70
的同学的数学成绩全部置为100
演示结果:
五,删除(Delete)
在 SQL
中删除数据主要有两种方式:删除表中的特定记录(DELETE)
和清空整个表(TRUNCATE)
,在 Navicat
中也可以通过可视化操作完成。以下是详细方法:
5-1 DELETE
删除格式
DELETE FROM 表名
WHERE 条件; -- 必须指定条件,否则会删除表中所有记录!
演示代码
DELETE FROM exam WHERE chinese<80;
SELECT * FROM exam;
演示结果
这里我们将chinese
分数低于80
的数据行全部删除,再输出剩余的数据,这里我们一定要加WHERE
条件,如果不加条件,直接运行SQL
语句会删除表中的所有数据