视图view


视图的概念

视图是一张虚拟表,他的数据来自于其他表的联合,磁盘上不会出现视图文件
它可以在链表查询时,将连表语句直接转换成一个视图,从而使多表操作变成单表操作
注意:连表超过3张表时,才使用视图

视图的创建

语法

  1. create view 视图的名字 as select 连表查询内容
  2. //例子
  3. create view v_player_game as
  4. select p.id as p_id,p.player_name,g.id as g_id,g.game_name from player_info as p, player_game as pg, game_info as g where p.id = pg.fk_player_id and pg.fk_game_id = g.id

触发器(trigger)


触发器就是一个事件,我们可以给一个表定义一个触发器,当这个表的数据被修改时,会执行触发器的语句
触发器的应用场合:
1、卖家卖出一件商品之后, 库存量 - 1
2、系统新注册一个用户, 用户统计量 + 1
3、删除妻子时,自动将丈夫也销毁掉

触发器的类型

新增触发器 在新增数据时,进行触发
修改触发器 在修改数据时,进行触发
删除触发器 在删除数据时,进行触发

触发器的时机

1、在数据变化之前,触发 before
如果在触发器,需要使用数据变化之前的数据,我们可以使用关键字old来获取
2、在数据变化之后,触发 after
如果在触发器,需要使用数据变化之后的数据,我们可以使用关键字new来获取

语法

create trigger 触发器的名字 触发的时机 触发器的类型 on 作用在哪张表
for each row begin
//触发的内容
end;



//例子
create trigger trgger_wife_delete before delete on wife_info 
for each row BEGIN
    delete from husband_info where fk_wife_id = old.id;
end;

事务(重点)


概念

事务: 一段具有明确开始和结束标记的 并且执行顺序是有序的一个过程
事务举例: 1天的生活 :7:00 起床 7:30 出门 —> 9:20 上课 —> 12:20 吃饭
—> 2:00 上课 —> 6:00 吃饭 —> 6.40 上晚自习 —> 8:30 放学 —> 10:00 到家
—> 12:00 上床 —> 2:00 看手机

*事务的4个特性(ACID)

原子性atomicity:
事务是一个完整的个体,不能再分 对于数据库的事务来讲:就是指事务 是完整的,要么统一成功,要么统一失败
隔离性isolation:
事务与事务之间是相互隔离的,互不干扰的。
一致性consistency:
在事务处理的过程中,数据必须要保证一致性,也就是不能出错。初中:能量守恒
持久性durability:
事务一旦确认,那么它的结果就应该持久化到硬盘中,并且同一事务不能再次对它进行修改。

事务的处理方式

确认事务 commit
回滚事务 rollback

MySQL操作事务

视图/触发器/事务 - 图1

*事务的隔离级别

多个事务,可能操作同一批数据,为了保证该数据的一致性问题,数据库同样会针对数据进行上锁

视图/触发器/事务 - 图2

1、可串行化(serializable)

将事务按照排队的方式,依次去操作数据,同一时刻只有一个事务可以操作它。
这种隔离级别:数据的一致性最好,它一定能保证数据是准确的
但是:它的性能也是最低的

2、可重复读(repeatable-read)

这隔离级别,仅次于可串行化,它此时就允许少量的事务,同一时刻操作相同的数据
性能上有所提升,但是:数据的一致性上,稍微有所下降
它会造成一种错觉:幻读
幻读:A 先查询一帮数据,并且针对这一大帮做了修改,或删除。B在A修改,或删除之后,他也修改了其中的某一条数据,
A再次查询数据库时,将会有一种幻象,感觉他自己没修改完,或删除完

3、读已提交(read-committed)

这隔离级别,又比可重复读低一些,它此时就允许大量的事务,同一时刻操作相同的数据,
性能上有了进一步的提升,但是:数据的一致性上,造成的问题更大
它会造成一种错误:不可重复读
不可重复读: 你和你女朋友 2个人 公用1张卡,卡里有1000元钱, 你现在请你的朋友吃饭,在你吃饭期间,你女朋友买个一个包花费了800元,等你吃完饭需要结账时:发现卡里只有200元,你可能就不够了,你就尴尬了,你就没法再做任何处理了……

4、读未提交(read-uncommitted)

它的隔离级别最低,它就相当于没有上锁,同一时刻所有的事务都可以操作相同的数据,
性能最高,但是一致性最差,造成的问题最严重
它会造成一种错误:脏读
脏读: 你有一张银行卡,银行卡中突然多了500W , 你就承诺 给你所有的朋友借钱(打了包票),然后又莫名其妙的500W又消失了,现在问你,你该咋办?
你拿着数据库可能 回滚的数据,在做业务,这是最危险的!!!

当然:4种隔离级别:可串行化 读未提交 几乎没有人使用,使用最多的是:可重复读

面试题:InnoDB和MyIsam的区别

存储引擎:就类似于游戏系统中的游戏引擎,它是整个RDBMS中最核心的东西,它决定了数据如何存储,如何获取,如何控制事务,如何控制外键 等一系列的功能

在MySQL中使用最多的是:InnoDB MyIsam
1、InnoDB 是MySQL 默认使用一种存储引擎,表的存储上,它是将一张表划分为2个文件:XXX.frm (表的表结构文件) XXX.ibd (数据和索引文件)
MyIsam 表的存储上,它是将一张表划分为3个文件:XXX.frm (表的表结构文件) XXX.MYD (数据文件) XXX.MYI (索引文件)
2、InnoDB 支持数据库的事务,而MyIsam 不支持数据库的事务
3、MyIsam 在做CRUD时,性能远高于 InnoDB
4、InnoDB 支持外键约束,但是MyIsam 连外键约束都不支持