mysql笔记10(高级部分--跟数据库管理有关)

文章目录

  • 一、视图(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('字符串');

⑤ select 配合 if函数 使用

参考文章

六、内容出处

mysql

相关推荐
建投数据13 分钟前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi1 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀1 小时前
Redis梳理
数据库·redis·缓存
独行soc1 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天2 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺2 小时前
分布式系统架构:服务容错
数据库·架构
冷眼看人间恩怨3 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
独行soc3 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain3 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship3 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存