My Blog

Advance

MySQL 的高级部分

学习笔记,仅供参考

参考B站Mirco_Frank - MySQL 删库跑路


关键字:视图 | 事务 | 索引 | 存储过程 | 函数


思维导图

mind_map


🌳 视图(View)

所谓的视图,其实就是基于查询结果的一张虚拟表,用来 存放查询结果的,当下次再想查数据时,就不用重写 SQL 语句了。也可用来 保护数据信息,防止关键的数据被看到。

视图的操作仍然是增删改查这四个,下面依次列举。

创建视图

create view <vw_name> as select <field_name> from <tab_name>;   // 创建视图

查看视图

select tables;   // 查看有哪些视图,一般视图命名要加 vw_ 前缀以表示为视图

select * from <vw_name>;   // 查看视图的数据信息

desc <vw_name>; show create view <vw_name>;   // 查看视图的结构信息

show table status where comment='view' \G;   // 装逼操作,查询所有视图的状态

修改视图

alter view <vw_name> as [modify select statement];   // 用 alter 表示修改,然后修改查询语句即可

删除视图

drop view <vw_name>;   // 删除视图

另外,还能在创建视图时设置试图算法。

create algorithm=temporary view <vw_name> as [select statement];   // 设置算法类型

算法有三种:undefine(default), merge, temporary ,一般若用子查询创建 view 出错,可用 temporary 来解决问题。


🌴 事务(transaction)

事务一般用于金钱、货物交易等场所,它相当于一种安全措施。在这种安全措施下,允许你取消重来等操作。一旦结束了这种措施,那么你的操作全都成真。

下面以生活中的淘宝购物、转账等示例,展开说明。

wallet_balance

根据上面的现金表,完成 2 号转给 1 号 500 元。

★ start transaction;   // 开启事务

update wallet set balance=balance-500 where id=2;

★ savepoint <rollback_name>;   // 设置回滚点 (类似游戏中的存档点)

update wallet set balance=balance+500 where id=1;

★ commit;   // 提交事务,转账完成,一切成真

★ rollback;   // 回滚到最初位置,即刚开启事务时 (类似于虚拟机的快照,回到过去,败者食尘)

★ rollback to <rollback_name>;   // 回到指定的回滚点

注意 :若回滚到某 savepoint,那么它后面的 savepoint 就都不存在了

事务四大特点(ACID)

  1. atomicity 原子性 -> 事务为一个不可分割的工作单位,事务的操作要么全成,要么全败

  2. consistency 一致性 -> 事务结束后,数据要与事务中的操作一致

  3. isolation 隔离性 -> 每个事务之间相互隔离

  4. durability 持久性 -> 事务一旦提交,数据的改变就是永久写存的


🌵 索引(index)

索引的使用可以帮助快速查询,但增、删、改的效率都会变低,而且占用空间。所以使用索引应该慎重,当要频繁查询某表时,可以考虑添加 index,如:高考查分。

create index <field_index> on <tab_name>(field);   // 给某表中的字段添加索引

例:create index name_index on stu(name);

alter table <tab_name> add index <field_name>(field);   // 后期添加索引

drop index <field_name> on <tab_name>;   // 删除索引


🌾 存储过程(procedure)

存储过程就相当于脚本、函数,提前写好一些 SQL 语句,当要使用时直接调用即可

/* 修改 SQL 语句的结束标识,防止在写的过程中语句被执行 */
> delimiter //
> create procedure proc()  /* 创建过程 */
> begin

/* 下面为要写的 SQL 语句 */
> update wallet set balance=balance+50;
> ....;

> end //  -> /* 结束创建过程,用修改的 ‘//’ 结束 */
> delimiter ;  -> /* 改回标识 */

在写好过程后就可调用了

call proc();   // 调用过程

drop procedure proc;   // 删除过程

show create procedure proc;   // 查看过程


🌾 函数(functions)

菜鸟教程列举的函数 | W3C functions | MySQL 5.7 文档