Advance
MySQL 的高级部分
学习笔记,仅供参考
关键字:视图 | 事务 | 索引 | 存储过程 | 函数
思维导图:
🌳 视图(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)
事务一般用于金钱、货物交易等场所,它相当于一种安全措施。在这种安全措施下,允许你取消重来等操作。一旦结束了这种措施,那么你的操作全都成真。
下面以生活中的淘宝购物、转账等示例,展开说明。
根据上面的现金表,完成 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)
atomicity 原子性 -> 事务为一个不可分割的工作单位,事务的操作要么全成,要么全败
consistency 一致性 -> 事务结束后,数据要与事务中的操作一致
isolation 隔离性 -> 每个事务之间相互隔离
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;
// 查看过程