文章目录
- 一、视图(view)
-
- [1. 作用](#1. 作用)
- [2. CRUD--跟表操作几乎相同](#2. CRUD--跟表操作几乎相同)
-
- [① 创建](#① 创建)
- [② 显示视图](#② 显示视图)
- [③ 查看视图相关详细信息](#③ 查看视图相关详细信息)
- [④ 删除视图](#④ 删除视图)
- [⑤ 更新视图](#⑤ 更新视图)
- [3. 视图算法](#3. 视图算法)
-
- [① 创建视图时指定视图算法](#① 创建视图时指定视图算法)
- [② 后期navicat里修改视图算法](#② 后期navicat里修改视图算法)
- [③ 注](#③ 注)
- 二、事务(transaction)
-
- [1. 事务的提出](#1. 事务的提出)
- [2. 举例理解](#2. 举例理解)
-
- [① commit -- 一起执行](#① commit -- 一起执行)
- [② rollback -- 一起回滚](#② rollback -- 一起回滚)
- [③ rollback to -- 回滚点](#③ rollback to -- 回滚点)
- [④ 注意](#④ 注意)
- [3. ACID -- 事务的四大特性](#3. ACID -- 事务的四大特性)
- [4. 注意:使用条件](#4. 注意:使用条件)
- 三、索引(index)
-
- [1. 概念](#1. 概念)
- [2. 优缺点](#2. 优缺点)
- [3. CRUD](#3. CRUD)
-
- [① 创建索引](#① 创建索引)
- [② 更新索引](#② 更新索引)
- [③ 删除索引](#③ 删除索引)
- [④ 查看](#④ 查看)
- 四、存储过程
-
- [1. 用途](#1. 用途)
- [2. delimiter](#2. delimiter)
- [3. 举例理解](#3. 举例理解)
-
- [① 设计存储过程](#① 设计存储过程)
- [② 查看存储过程](#② 查看存储过程)
- [③ 显示数据库里所有的存储过程](#③ 显示数据库里所有的存储过程)
- [④ 删除存储过程](#④ 删除存储过程)
- 五、函数
-
- [1. number](#1. number)
-
- [① 生成一个随机数](#① 生成一个随机数)
- [② 数据库里抽奖](#② 数据库里抽奖)
- [③ 向上取整](#③ 向上取整)
- [④ 四舍五入](#④ 四舍五入)
- [⑤ 向下取整](#⑤ 向下取整)
- [⑥ 截取数字](#⑥ 截取数字)
- [⑦ 随机排序](#⑦ 随机排序)
- [2. string](#2. string)
-
- [① 全转换成大写](#① 全转换成大写)
- [② 全转换成小写](#② 全转换成小写)
- [③ 截取字符串](#③ 截取字符串)
- [④ 拼接字符串](#④ 拼接字符串)
- [3. 其它函数](#3. 其它函数)
-
- [① 获取当前时间](#① 获取当前时间)
- [② 获取当前时间戳](#② 获取当前时间戳)
- [③ 以年月日形式呈现当前时间](#③ 以年月日形式呈现当前时间)
- [④ 加密函数](#④ 加密函数)
- [⑤ select 配合 if函数 使用](#⑤ select 配合 if函数 使用)
- 六、内容出处
一、视图(view)
1. 作用
① 视图相当于一个虚拟的表,作用在于筛选,防止无关业务人员看到敏感数据。
② 视图也是在有意地隐藏表结构,说白了还是在隐藏敏感数据。
③ 从某种意义上来说它降低了sql的复杂度,有助于实现快速查询
2. CRUD--跟表操作几乎相同
① 创建
create view 视图名 as select 字段名,字段名 from 表名
例如:
① (普通创建)
由此可见,vw_stu这个视图就刻意隐藏了学生性别、年龄等信息,班长拿到的可能就是这个视图里的信息(不含身份证号、详细家庭住址等敏感信息),保护学生隐私
之后查找某个同学的电话时就不需要再写一遍sql语句了,直接在vw_stu这个视图里检索就可以了
② (加入多表查询的内容)
② 显示视图
① 在navicat里查看
② 终端用命令查看:show tables;
视图名前面应该加一个vw_前缀,从而和普通表进行区分
③ 查看视图相关详细信息
显示当前数据库中所有视图的配置信息:
show table status where comment = 'view' \G
④ 删除视图
drop view 视图名;
⑤ 更新视图
alter view 视图名 as select 字段名, 字段名 from 表名
alter view vw_stu_2 drop 字段名;这种写法会报错
3. 视图算法
① merge:合并算法
② temptable:临时表算法
① 创建视图时指定视图算法
create algorithm= view 视图名 as select 字段名,字段名 from 表名;
② 后期navicat里修改视图算法
③ 注
网课里提到将子查询语句运用到视图里时,如果发现结果跟预期的不一样,这个跟视图算法有关,将其调整为temptable即可。
但是下述语句,我在navicat里依次将视图算法调整为undefined、merge、temptable,发现总能运行出正确结果。gpt说这是因为视图算法影响的是查询的执行方式,但不一定会导致语义上的错误。即使视图算法不是temptable,查询优化器仍然能够根据上下文正确解析和执行我们的sql语句。
二、事务(transaction)
1. 事务的提出
淘宝购物时,我们点击立即购买,但是还没付款。此时还没付款的钱在哪里,难道直接更新到了阿里的账户?我们点击付款以后钱去了哪里?点击确认收货之后钱又在哪里,难道我们付完款以后钱就直接到了商家的账户?
进行转账操作时,我们输入完金额等所有信息以后,会让我们再次确认是否真的要把这些钱转过去,点击确认之后才会真正把钱转给对方。那么点击确认之前的钱在哪?
可以想一下,难道只是下了个订单就要让我们账户的数据减少,阿里的账户数据增加?那万一过几天我们反悔了呢,难道还要再让阿里的账户数据减少,我们账户的数据增加么?那要是每个人都下一单但是不付款,过几天再退了,服务器不就炸了么?
因此总要有一个确定性的东西,执行完这个步骤以后再更新数据,我们把这个东西叫作事务。例如:点击确认转账之后,才会真的把钱转过去;点击确认收货之后,钱才会到达商家账户。由此保证了数据的安全性和一致性。事务这个东西要么干脆一块执行,要么回滚
mysql中最重要的东西,跟钱有关。涉及到钱这种比较严谨的东西的话,一般都会用到事务。
2. 举例理解
情境:接下来会有一个转账的操作(转账跟钱有关,所以一般都比较严谨),一定会有一个确定的操作 -- 是否真的要执行转账操作(事务要么一起执行,要么一起回滚掉)
① commit -- 一起执行
此时去navicat里刷新一下,发现数据都没变
此时再刷新,发现钱已经从1号的账户转到了2号的账户
② rollback -- 一起回滚
在公司里遇到跟钱有关的转账操作,一般都会用事务,从而保证资金的准确性。万一哪天服务器崩了,数据到人家账户上了,卖家发货了,但是对面不承认,此时就可以rollback。
navicat里刷新一下,发现数据都没变
③ rollback to -- 回滚点
回滚点就类似于git或者虚拟机里的快照
刷新一下可以发现只有四条数据
④ 注意
只要commit,就不能再rollback。例如:淘宝买东西,我都确认收货了,钱也已经到卖家账户了,此时就不能再反悔让人家退钱了。
3. ACID -- 事务的四大特性
① atomicity 原子性:说白了就是不能再分了。事务是一个整体,要么一起执行,要么一起不执行
② consistency 一致性:一旦commit或者rollback,数据库里的数据也要随之改变。事务已经结束,数据也必须达到相应的完整状态
③ isolation 隔离性:每个事务都是相互隔离的,不能说1号和2号进行交易,结果3、4号的数据也被更改了
④ durability 持久性:事务一旦commit,就不可能再更改了,相当于在数据库中永久地写存
4. 注意:使用条件
在mysql中,只有当建表时把数据库引擎指定为InnoDB,才能使用事务。虽然事务是一个通用的数据库特性,但是在mysql中,其它引擎(例如:MyISAM)不支持事务。
三、索引(index)
1. 概念
mysql中索引的概念以及分类 该文缺点:混淆了唯一键约束和唯一索引的sql语句
① 搜索引擎会用到全文索引。mysql不支持中文索引(解决方案:使用sphinx),但是不知道现在支不支持(dba知道)
2. 优缺点
优点:查询速度快(例如新华字典前面的索引,按拼音、按笔画可以快速找到某个字)
缺点:① 会极大地降低CRUD的效率 ② 占空间① 有些公司会强制要求将哪些东西设置成索引、哪些东西不能设置成索引
② 为什么要创建索引?
答:该数据被频繁地搜索(例如:高考总分设置一个普通索引),创建索引可以提高查询效率③ 一般情况下都是创建一个索引
④ 有时会给公共字段创建索引
⑤ 注意:如果该表内数据非常少,就没必要创建索引(例如:给性别创建索引就没必要)
3. CRUD
① 创建索引
创建普通索引:create index 索引名 on 表名(字段名);
创建唯一索引:create unique index 索引名 on 表名(字段名);
创建全文索引:create fulltext index 索引名 on 表名(字段名);
创建主键索引:alter table 表名 add primary key(字段名);
注:① 创建主键约束时会自动创建主键索引,创建唯一键约束时会自动创建唯一索引
② 主键索引只能通过主键约束创建,但是普通索引和唯一索引可以单独创建
③ 设置唯一索引,使用删除唯一键的sql语句后,发现唯一索引随之被删除了
设置唯一键约束,使用删除唯一索引的sql语句后,发现唯一键随之被删除了
为某张表同一个字段设置唯一索引和设置唯一键约束。这样一来就算删除唯一键约束,也不会对唯一索引产生影响。(唯一键约束和唯一索引的设置顺序以及删除顺序互不影响)
② 更新索引
① alter table 表名 add (unique / fulltext) index 索引名(字段名);
其实相当于新创一个索引,跟 ① 中create语句效果相同
② 主键索引用更新主键约束的sql语句
③ 删除索引
① 普通、全文、唯一索引都这样删:drop index 索引名 on 表名;
② 主键索引用删除主键约束的sql语句
④ 查看
索引的目的主要是提高查询效率。创建索引后,可以通过select语句利用索引进行检索。通常数据库会自动使用检索来优化查询。
我们可以发现用唯一索引和不用唯一索引查出来数据的顺序不同。
但是对这张表而言,用不用没啥差别,不知道为什么
四、存储过程
1. 用途
dba用于模块化设计的一个东西,支持CRUD、事务等各种操作,相当于sql里的一个函数
2. delimiter
mysql中默认以分号作为语句的结尾,例如:show databases; + 回车 就会执行这条语句。但是存储过程里会有很多sql,每次写个分号就直接把命令发送到服务器,那肯定不行啊。因此mysql出了一个delimiter,delimieter //语句执行之后,mysql下面的语句就不以分号结尾了,而是以 // 作为结尾。
3. 举例理解
① 设计存储过程
情境:双11了,给每个用户都发一个红包,然后把所有用户的昵称都改成tom。这个操作用视图肯定不行(视图只能查),明显就是存储过程。双11之前,dba先把这个存储过程给写了,到指定时间后,一条命令调用存储过程,然后它就会默认执行之前设计过的所有sql,不需要再一点一点去写了,类似于函数调用
② 查看存储过程
show create procedure 存储过程名;
③ 显示数据库里所有的存储过程
show procedure status \G
④ 删除存储过程
drop procedure 存储过程名;
五、函数
1. number
① 生成一个随机数
select rand();
② 数据库里抽奖
select * from 表名 order by rand() limit 抽几个人;
程序员做开发后端时,如果能从数据库的角度去解决问题,就不从service层解决
③ 向上取整
select ceil(数字);
④ 四舍五入
select round(数字);
⑤ 向下取整
select floor(数字);
⑥ 截取数字
select truncate(数字,取几位小数);
⑦ 随机排序
select * from 表名 order by rand();
2. string
① 全转换成大写
select ucase('字符串');
② 全转换成小写
select lcase('字符串');
③ 截取字符串
从左边从头开始截取:select left('字符串', 取几位);
从右边从头开始截取:select right('字符串', 取几位);
从左边任意位置开始截取:select substring('字符串', 从哪个位置开始截取, 取几位);
④ 拼接字符串
select concat('字符串1', '字符串2');
concat另一个用法
select concat(字段名,'想用什么符号隔开', 字段名) from student;
3. 其它函数
① 获取当前时间
select now();
② 获取当前时间戳
select unix_timestamp();
③ 以年月日形式呈现当前时间
select year(now()) year, month(now()) month, day(now()) day;
④ 加密函数
select sha('字符串');