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

相关推荐
是孑然呀11 分钟前
【小记】word批量生成准考证
笔记·学习·excel
辛一一1 小时前
neo4j图数据库基本概念和向量使用
数据库·neo4j
巨龙之路2 小时前
什么是时序数据库?
数据库·时序数据库
蔡蓝2 小时前
binlog日志以及MySQL的数据同步
数据库·mysql
是店小二呀3 小时前
【金仓数据库征文】金融行业中的国产化数据库替代应用实践
数据库·金融·数据库平替用金仓·金仓数据库2025征文
炒空心菜菜4 小时前
SparkSQL 连接 MySQL 并添加新数据:实战指南
大数据·开发语言·数据库·后端·mysql·spark
专注于大数据技术栈4 小时前
Mac上安装Mysql的详细步骤及配置
mysql
多多*4 小时前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle
爱喝酸奶的桃酥4 小时前
MYSQL数据库集群高可用和数据监控平台
java·数据库·mysql
毫秒AI获客4 小时前
小红书多账号运营效率优化:技术方案与自动化实践
笔记