目录
[一、新增 - Create](#一、新增 - Create)
[二、查询 - Retrieve](#二、查询 - Retrieve)
[(六)、去重 - distinct](#(六)、去重 - distinct)
[(七)、排序 - order by](#(七)、排序 - order by)
[(八)、条件查询 - where](#(八)、条件查询 - where)
[(4)、!=,<> 不等于](#(4)、!=,<> 不等于)
[(5)、berween A and B](#(5)、berween A and B)
[(7)、is null、is not null](#(7)、is null、is not null)
[(九)、分页查询 - limit](#(九)、分页查询 - limit)
[1、从 0 开始,筛选 n 条结果](#1、从 0 开始,筛选 n 条结果)
[2、从 s 开始,筛选 n 条结果](#2、从 s 开始,筛选 n 条结果)
[3、从 s 开始,筛选 n 条结果](#3、从 s 开始,筛选 n 条结果)
[三、修改 - Update](#三、修改 - Update)
[四、删除 - Delete](#四、删除 - Delete)
增删改查也简称为CRUD
- C - Create 新增
- R - Retrieve 查询
- U - Update 更新
- D - Delete 删除
首先我们要明白增删改查操作的是哪一部分数据。
电脑上有一个数据库服务器 -> 管理着很多个数据库 -> 每一个数据库有很多数据表 -> 每张数据表中有很多数据行(记录)-> 每条数据行有很多列(字段)
而增删改查操作的是数据表中的数据行也就是记录。
一、新增 - Create
(一)、语法
insert into 表名 [(字段1[, 字段2] ...)] values ( 值[,值]...) [, 值[,值]...] ...
(二)、单行数据+全列插入
insert into 表名 [(字段1[, 字段2] ...)] values ( 值[,值]...);
在student表中插入一条数据

注意:前面的字段要和values的值要一一对应且数量相同。
如果values列表中的值与列的个数不匹配,会报一个错误

在全列插入时,可以不用再表名后指定列名,在values列表中按表中的定义字段的书安心设置相应的值
insert into 表名 values ( 值[,值]...);

(三)、多行数据+指定列插入
insert into 表名 [(指定列...)] values ( 值[,值]...) [, 值[,值]...] ...
在一条insert语句中,values部分可以用很多组values组,每一组表示要插入的一条数据行。

👧🏻:那么插入一条数据和插入多条数据哪一个效率高呢?
事实上来说在一个可控范围内,一次提交多条数据比一次提交一条数据效率高点。
👧🏻:如果在指定的name字段插入一条数据,那么id字段的值是什么呢?

id字段会用默认的值去填充,这个默认值为NULL。
二、查询 - Retrieve
(一)、语法
select [distinct] {* | {字段1[, 字段2] ...} from 表名
[where 条件] [order by 字段 [ASC | DESC]] limit n;
关键字:select:查询,distinct :去重,from,where,order by ,asc:升序,desc:降序,limit
(二)、全列查询
select * from 表名;
*号表示要查询表中所有的列
表名:表示要查询的是哪个表
对exam表进行全列查询:

(三)、指定列查询
select 列名 [,列名]... from 表名;
对exam表中的id,name,math三个字段进行查询:

(四)、查询字段为表达式
select 列名/表达式 from表名;
比如:1.表达式不包含字段

其中的10是数值类型,是让所有列中都包含一个表达式中的值,他本身并不存在exam表中。
2.表达式包含一个的字段 ------ 在chinese这一列的分数中加上10分:

3.表达式中包含多个字段 ------ 将chinese、math、english这三列进行相加:

(五)、别名
select 列名/表达式 [as] 别名 from 表名;

as可以省略,别名可以是任意的字符串

如果字符串中包含空格,字符串用单引号引起来。


在exam表中并没有总分这一列,而查询出的总分(表达式查询出来的结果集)是通过一个临时表返回给我们的,执行完之后临时表就删除了。
在MySQL中所有表达式查询结果都会通过临时表返回给用户。
给多个字段起别名:

(六)、去重 - distinct
select distinct 列名[,列名] [,列名]... from 表名;
当我们只查询math分数时,会发现里面含有重复的分数,但使用distinct关键字之后,里面重复的分数只保留一条

如果查询多个列,在去重时,所有列都相同才被判定为两条记录相同。

当查询结果中的所有列都相同才会认定为重复记录,才能去重成功。
(七)、排序 - order by
select 列名 from 表名 order by 列名/表达式/别名 asc|desc;
asc:升序 从小到大
desc:降序 从大到小
order by 查询结果中要根据我们指定的排序规则对结果进行排序
- 没有指定 order by 子句查询,返回的顺序是未定义的,永远不要依赖这个顺序。 默认MySQL根据哪个字段进行排序,是不确定的。
如果依赖某个排序规则,那么就明确指定order by子句中的排序字段。
对数学进行升序排序:

没有写排序规则的时候默认是升序排序,但还是建议明确指明排序规则

2. NULL 数据排序,视为比任何值都小,升序出现在最上面,降序出现在最下面

在数值比较时,NULL被是为比任何数值都小。
3. 使用表达式 及 别名排序
使用表达式排序:

使用别名排序:

在查询结果中可以看到孙大圣的总分为NULL
这是因为NULL在MySQL中
- 不论和什么值进行运算,返回的值都是NULL;
- NULL始终被判定为false;
- NULL的值不是我们以前学习过的其他编程语言中的0,在MySQL中就是NULL。
- 可以对多个字段进行排序,排序优先级与书写顺序有关
将chinese、math、english 这三个字段指定不同的排序规则:

(八)、条件查询 - where
条件查询根据指定的一些条件,过滤掉不符合条件记录,把符合条件的记录返回给用户。
使用的语法:select * from 表名 where 列名/表达式 运算符 条件;
1、比较运算符
|-----------------|-----------------------------------------|
| 运算符 | 说明 |
| >,>=,<.<= | 大于,大于等于,小于,小于等于 |
| = | 等于,null不安全,NULL=NULL,返回的结果是NULL |
| <=> | 等于,null安全, NULL<=>NULL,返回的结果是ture(1) |
| !=,<> | 不等于 |
| berween A and B | 范围匹配,[A,B] |
| in(option,...) | 如果是 option 中的任意一个,返回 TRUE(1) |
| is null | 是null |
| is not null | 不是null |
| like | 模糊匹配。 % 表示任意多个(包括 0 个)任意字符; _ 表示任意一个字 符 |
(1)、>,>=,<.<=
①、查询english< 90:

结果集中会自动过滤了值为null的列
②、比较math和english两列:

注意:一行数据中的两个列是可以进行比较的,但是不能跨行进行比较。
③、查询chinese、math、english相加的总分 < 200的数据:
当在where条件中使用别名是:

显示在 WHERE 子句中,找不到名为 total 的列,这是于MySQL语句顺序有关

在表中查询数据时,MySQL语句顺序:
- 先确定表,先执行from;
- 然后根据where指定的查询条件把符合条件的数据过滤出来,执行的是where语句;
- 其次执行select后面的指定列,这些列是需要加入到最终的结果集中;
- 最后,根据order by子句中指定的列按照排序规则进行排序
在where条件中要使用完整的表达式,不能使用别名。
(2)、=
在MySQL中判断相等时用的是 = ,赋值时也是 = 。

NULL和NULL进行比较时,返回的结果是NULL
(3)、<=>
<=> 专门对NULL来做判断

(4)、!=,<> 不等于
(5)、berween A and B

(6)、in(option,...)
如果是 option 中的任意一个,返回 TRUE(1),否则是false

(7)、is null、is not null

(8)、like
模糊匹配。 % 表示任意多个(包括 0 个)任意字符; _ 表示任意一个字符

一个_相当于一个占位符,有几个_必须匹配几个字符。
2、逻辑运算符
|-----|--------------------------------|
| 运算符 | 说明 |
| and | 多个条件必须都为 TRUE(1) ,结果才是 TRUE(1) |
| or | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
| not | 条件为 TRUE(1) ,结果为 FALSE(0) |
(1)、and
查询chinese > 60 并且 math >80的数据:

(2)、or
查询chinese > 60 或者 math >80的数据

优先级:not > and > or

(九)、分页查询 - limit
limit 限制查询结果集的条数
1、从 0 开始,筛选 n 条结果
select * from 表名[where 条件] [order by 列名 asc|desc] limit n;

2、从 s 开始,筛选 n 条结果
select * from 表名 [where 条件] [order by 列名 asc|desc] limit s n;

3、从 s 开始,筛选 n 条结果
select * from 表名 [where 条件] [order by 列名 asc|desc] limit n offset s;

三、修改 - Update
(一)、语法
update 表名 set 列名 = 值 [,列名 = 值] [,列名 = 值]... where 条件 order by 列名 asc|desc limit n;
where 条件在修改时必须加上,否则表中所有的记录都被更新。
对某一名学生的数学成绩修改成90:

只要找到符合的条件记录,就会一次性把符合的记录全部都修改。
四、删除 - Delete
(一)、语法
delete from 表名 where 条件 order by 列名 asc|desc limit n;
where 条件在修改时必须加上,否则表中所有的记录都被删除。
删除某一位学生的记录:

在这篇文章中,讲了对表进行新增、查询、更新、删除的操作,其中查询有全列查询、指定列查询、条件查询、区间查询、模糊查询、分页查询等等。