作者简介:大家好,我是未央;
博客首页:未央.303
系列专栏:Mysql系列
每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!
前言
今天我们将进入到.MySQL表的增删改查(基础)的章节,本章节主要介绍了.MySQL表的增删改查中的一些基础的操作,对于我们学习MySQL有着重要的意义,并且其中有很多需要注意的地方,我也会详细标准,防止各位踩坑,接下来就让我们进入到.MySQL表的增删改查(基础)学习!!!!!!!!!!!
一、CRUD
定义:即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写
MySQL的工作就是 组织管理数据,即 需要先保存,保存好了 后续好进行增删改查
二、新增(Create)
2.1 单行数据,全列插入
语法格式:
insert into 表名 values(值,值,值......)
注意:
1.insert 和 values 都是关键字
2.插入的值可以有若干个,值的个数 要和 表的列数 相匹配;值的类型 需要和 列的类型 相匹配
举例说明:在已经创建好的表student中插入元素(1.’zhangsan')
已经建好的表student和他的结构如图;
往里面插入元素(1.’zhangsan');
此时,插入数据成功
需要注意的是,在SQL中表示字符串,可以用单引号,也可以用双引号,它们是等价的关系;SQL里没有 字符类型
插入失败的几种情况;
1.当值的个数要和表的列数不相匹配时;
2.值的类型 需要和 列的类型不相匹配
3.对于想要插入中文数据时
此处需要修改MySQL的配置
注意:
如果有刚刚使用 MySQL数据库 的小伙伴,啥都没有设置
会发现,如果插入的数据是中文的话,那么都会插入数据错误
我的这个中文数据插入成功,是因为在之前已经配置好了
2.2 单行数据,指定列插入
语法格式:
insert into 表名(列名1,列名2,列名3,......) values (值1,值2,值3,......);
举例说明:在创建好的表student中指定name列插入'lisi';
指定了 name 这一列进行插入‘lisi’;
其他未被指定的列(id),填入的值就是这一列的默认值,默认的默认值就是啥也不填,也就是NULL;
2.3 插入多组数据输入
insert 语句还可以一次插入多条记录
说白了,就是 在values后面,带有多组(),每个()之间采用,来进行分割;
语法格式:
insert into 表名 values (值1,值2...), (值3,值4...), (值5,值6...)
举例说明:在创建好的表student插入多组记录(1,‘zhangsan’),(2,‘lisi’);
2.4 多组数据+指定列插入
将上述2.2,2.3方法结合在一起即可;
语法格式:
insert into 表名(列名1,列名2,列名3,...) values (值1,值2,...),(值3,值4,...),...;
举例说明:在创建好的表student中指定id,name两列插入‘1’,‘张三’;‘2’,’李四‘;’3‘,‘王五’。
注意:
在MySQL里面,"一次插入一条记录,分多次插入" 相比于 "一次插入多条记录" 来说,要慢上很多
如果要是"一次插入一条,分多次来插入",就会有多个 请求/响应;
如果要是"一次插入多条记录",就一个 请求/响应 就够了
另外一方面,MySQL服务器方面,是通过一系列的复杂的数据结构来组织数据的,
每一次的插入操作其实都是比较耗时的(在数据结构中进行一定的便利操作 找到合适的位置)
如果是"一次插入一条,分多次来插入",服务器这边的准备工作就要准备多次;
如果要是"一次插入多条记录",服务器准备工作就只需要做一次就可以了
三、查询(retrieve)
查询是MySQL中最最重要也是最最复杂的操作;
接下来我们就介绍查询的多种类型:
3.1 全列查询
定义:全列查询顾名思义就是直接把整个表的数据都查询出来;
语法格式:
select * from 表名;
注意:*是通配符,表示匹配任意的列(所有的列)
例如;查询创建好的表student;
ps:
此操作就把student表全都构建出来了
但是实际上这是一个"临时表",这个表格并不是 服务器上数据的本体
这里就会出现一个关键性的问题:
如果当前数据库里面的数据特别多,那么 执行上述 select * 会发生什么情况呢?服务器需要先读取磁盘,把这些数据都查询出来,再通过网卡把数据传输给客户端
由于数据量非常大,极有可能把磁盘IO吃满,或者把网络带宽吃满
直观感受:卡(会卡多久不知道......)
如果当前操作的数据库是生产环境的服务器,因为 select * 就可能导致生产环境服务器卡顿,从而影响外面用户的使用体验
万一真的执行了这个操作的话,赶紧按住 ctrl+c 取消操作!!!
执行一些SQL的时候如果执行的时间比较长,随时可以按 ctrl+c 来中断
在控制台执行,ctrl+c 一般都是有效的;在图形化界面上,ctrl+c 是否还是有效,那就不清楚了
3.2 指定列查询
定义:就是指定你想要查询某一(一部分)列单独进行查询;
语法格式:
select 列名,列名,列名.... from 表名;
举例:在表student中单独查询id列;
ps:
当我们省略掉一些不必要的列的时候,就可以节省大量的磁盘IO和网络带宽了
MySQL是客户端/服务器结构的程序,在此处看到的结果这张表,同样也是"临时表",只是在客户端这里显示成了这个样子,而不是说服务器上 就真的有一个这样的 里面只存了id 的这张表 注意: select所有的操作的结果都是"临时表",可能会把显示在客户端上的结果进行了加工,但是不会影响到数据库服务器原有的数据。
3.3 查询字段为表达式
定义:即让查询结果带有一些计算;
注意:表达式查询,这里进行的计算,都是列和列之间的计算,而不是行和行之间的计算
举例说明:
1.先创建一个表exam_result;
注意:decimal(3,1):
成绩得要是 90.5或88.8这样的形式,形如100、5.23这样的形式其实就是非法字符
2. 查看这个表的结构:
3.接下来我们插入一些数据:
4.我们查看此时 表exam_result中的结构;
5.此时我们进行操作让每个人的语文成绩增加10分’;
注意:
ps1:
如果说,加的数字超过了decimal(3,1)的限制会怎么样呢?
答案是,不会怎么样
得到的结果是"临时表","临时表"的列的类型并不是严格和原有表的类型一致
"临时表"会尽可能的保证显示结果是正确的
当我们操作让每个人的语文成绩增加20分’;
但是 尝试往原始的表中插入一个超出范围的数据,那是不可以的
ps2:
如果尝试把 字符串 和 数字 进行算术运算,就可能会报错,也可能会出现警告:
可以使用 show warnings 查看警告的详细情况:
3.4 查询的时候起别名(as)
定义:会发现"临时表"中 显示的列名 会非常特别的长,很不好看,也并不直观
此时就可以通过取别名的方式来消除这种困扰;
语法格式:
原名+as+别名;
所以我们将其用total别名来表示;
注意:
当然,as也可以省略,不过个人建议还是写上最好;
不写as的时候,不一定能看清楚;
3.5 去重查询(distinct)
定义:顾名思义就是去掉表名中重复的列名;
语法格式:
select distinct 列名 from 表名;
举例说明:去掉数学成绩列中重复的列名
1.先查看每个人的数学成绩;
2. 此时采用去重查询;
3.6 排序查询(order by)
定义:排序查询,在查询过程中,对于查询到的结果,进行排序
注意:这里的"排序",针对的只是"临时表",对于数据库上原来存储的数据没有影响
语法格式:
select 列名 from 表名 order by 列名 asc/desc;
ps:
asc表示升序查询;desc表示降序查询;(descending缩写)
举例:我们可以把 exam_result表 按照 chinese的成绩顺序 升序或者降序排序:
ps:
如果数据中存在NLUU的话,则当成最小值;
扩展1:order by 也可以针对带有别名的表达式进行排序:
扩展2:order by 进行排序的时候,还可以指定多个列来进行排序!!!
当指定多个列排序的时候
就相当于:如果第一列不分胜负(数据相同),再按照第二列进行比较.
先按照 math 成绩降序排序,有 math 成绩一样的,按照 chinese 成绩升序排序
3.7 条件查询(where)
定义:所谓条件查询就是按照指定的条件进行筛选,查询;
语法格式:
select 列名 from 表名 where 条件;
常见的条件:
1.条件运算符;
2. 逻辑运算符
![]()
举例说明:
1.查询英语成绩不及格的同学姓名及其英语成绩
2.查询语文成绩比英语成绩好的同学
3.查询总分在200以下的同学
注意:
这句查询是没有问题的,可是 当我们在条件查询中 使用了别名时:
故可知:即 条件查询不允许使用别名
3.8 分页查询(limit...offset...)
定义:
分页查询,让查询的结果,只取其中的一个部分
从而能够降低开销,加快查询速度
语法格式:
select 列名 from 表名 limit N offset M;
注意:
1.使用 limit 关键字,来限制返回的结果条数(说白了 就是显示形成的"临时表"里面有多少条记录)
2.使用 offset 关键字,来确定从第几条开始进行返回
3.其中M表示从第M条开始查询;N表示最多返回N条记录; (其中M为0时,表示从第1条开始查询,类似数组下标)
4.上面的 offset M 可以省略,如果省略的话,表示从一开始的记录开始返回
select 列名 from 表名 limit N;
举例说明:
1.直接查询整个 exam_result表的前3条记录;
2. 查询整个 exam_result表中id为456的记录;
3.当然 如果不足的话,有几条记录 就返回(显示)几条记录:
一共有9条记录:
执行以下命令行:
从第9条记录开始,虽然说需要显示3条记录,但是不够了,所以只能显示1条记录
ps:
limit 是可以和order by,where等子句搭配使用的
查询总成绩前三名的同学的信息
四、修改(update)
定义:
此处的修改,是针对数据库服务器进行的了,这里的修改是持续有效的
也就是说,这里的修改使磁盘上面保存的内容也变了,后面再怎么查询,也只是变化后的查询结果了(与前面临时表进行区分)
语法格式:
update 表名 set 列名 = 值1 (,列名 = 值2,...) where 子句;
实质:针对哪个表的 哪些行 哪些列,改成啥样的值;
举例说明:
1.把表exam_result 中"孙悟空"同学 的数学成绩改为80分;
查询可得:
2.将"曹孟德"同学的数学成绩变更为60分,语文成绩变更为70分
查看可得:
3.将总成绩倒数前3的同学的数学成绩减去30分
总成绩最差先找出来:
原先,他们三个人的math成绩:
![]()
现在,把他们的成绩改一下:
ps:
update 后面的条件很关键
修改操作,是针对条件修改之后,剩下的数据进行修改
换句话说,如果没写条件,意位着就是针对所有行都进行修改
举例:当未指出update后面的条件时;
发现对所有的Chinese都变成0;
五、删除(delete)
定义:删除语句 是最最简单的,但又是最最危险的语句。
语法格式:
delete from 表名 where 条件;
一般用于删除符合条件的行;
举例说明:
1.删除唐三藏同学的相关记录;
注意:
如果没有条件的话,即 delete from 表名;
意味着就把表里面的数据全部都删了,意味着只剩下一个空的表;
此处就直接把exam_result表里面的数据给删除完了;
六、总结
今天我们对于MySQL的增删改查(基础)就介绍到这里,这里面知识点覆盖很多,并且需要注意的地方也有很多,需要我们认真的进行学习,以及及时进行相关的复习;
下一节我们将进入MySQL表的增删改查(进阶),内容也会越来越复杂,让我们一起学习并且充分掌握这些知识,一起加油!!!!!希望能得到各位的点赞,关注!!!!