Mysql数据库-视图(详细,附图)

本文章将基于黑马程序员的 "Mysql数据库从入门到精通"教程 的视图部分进行归纳总结,如有侵权请联系删除!!
在这里插入图片描述

一、基本用法

(1)创建、删改查

在这里插入图片描述

//创建
create [or replace] view view1 as select * from table1 [with cascaded | local check option];
//查询
show table view view1;
select * from view1;
//修改
create [or replace] view view1 as select * from table1 [with cascaded | local check option];
alter view view1 as select * from table2 [with cascaded | local check option];
//删除
drop view [if exists] view1;

①关键词解析

  1. 如果要去替换某一视图,那么可以加上or replace关键字
  2. select当中所查询的表就是这个视图所关联的基表(也叫基础表)
  3. 虽然创建与修改的视图的sql好像相同,但是创建视图语句的or replace可加可不加,修改视图语句的关键在于or replace

②业务示例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)向视图中添加数据(增)

之前提到过视图当中实际上并不存储数据,具体数据都是存在于基表当中的,也就意味着我们插入的数据实际上都插入到基表当中去了

insert into view1 values(..,..,..);

在这里插入图片描述

①基表与视图中数据的变化

  1. 基表中的变化
    在这里插入图片描述
  2. 视图的变化
    在这里插入图片描述
  3. 但是再次查询视图时发现 id=30 的该条数据并不存在,因为创建视图时指定了条件为id<=20,也就意味着通过视图插入的数据居然在这个视图中查询不到。

为了避免这种情况出现,mysql当中在创建视图时提供了一种语法:我们可以在sql中加上 with cascaded/local check option检查选项

二、检查选项

(1)cascaded级联

在这里插入图片描述

①业务示例

  1. 重新编写创建视图sql并加上cascaded检查选项
    在这里插入图片描述
  2. 插入数据
    在这里插入图片描述
    出现 check option failed检查选项失败 报错,成功阻止该条与创建视图时所制定的条件相违背的数据插入

②逻辑解析

  1. 因为创建视图v1的sql语句未加上检查选项,那么接下来对该v1视图进行增删改操作都不会去检查它的条件
  2. 再定义一个视图v2,它是基于v1视图的,但是条件与v1中不相同且指定了cascaded(级联)检查选项。一旦加上该检查选项,那么当我们再去操作v2视图时会去检查是否满足v2的条件。由于加的是cascaded级联,那么它不仅要去检查当前操作是否满足v2的条件,还要去检查是否满足v1的条件,就相当于在v1视图中也加上了检查选项参数。假如v1又关联了另外一个视图,那么就相当于在它所依赖的视图后面也加上了cascaded检查选项
    在这里插入图片描述
  3. 但是假设此时又新建视图v3,它是基于视图v2的,但是它并没有加检查选项
    在这里插入图片描述
    在这里插入图片描述
    因为11满足v3、v2与v1的条件,是必然能够成功添加的。
    虽然17不满足v3的条件,但是因为sql中没有加检查选项,所以它就不会被视图v3的条件阻止,而且它也满足视图v2的条件,会跟随v2的cascaded检查选项向下检查到视图v1,再次满足v1的条件后就可以将这条数据成功插入。
    同理,虽然28不满足v3的条件,但是因为sql中没有加检查选项,所以它就不会被视图v3的条件阻止,而且它也满足视图v2的条件,会跟随v2的cascaded检查选项向下检查到视图v1,但是因为不满足v1的条件,那么最终就会被阻止执行。

(2)local迭代

local检查选项同样会递归去查找所依赖的视图,并且看依赖的视图中是否同样有定义检查选项,若有则进行校验条件,若没有则不进行校验条件。
若视图当中的一行数据对应于基础表中的一行数据,此时视图才可以更新;如果我们执行了一个聚合统计函数,使得基础表当中的两行数据才对应于视图当中的一行数据,那么此时该视图是不能做更新操作的。
在这里插入图片描述

①逻辑解析

在这里插入图片描述
以上sql语句全部都能够正常执行
在这里插入图片描述
2. local检查选项同样会递归去查找所依赖的视图,并且看依赖的视图中是否同样有定义检查选项,若有则进行校验条件,若没有则不进行校验条件

三、视图的更新

在这里插入图片描述

(1)视图与基表的一对一关系

若视图当中的一行数据对应于基础表中的一行数据,此时视图才可以更新;假如我们执行了一个聚合统计函数,使得基础表当中的两行数据才对应于视图当中的一行数据,那么此时该视图是不能做更新操作的。

  1. 视图与基表一对一
    在这里插入图片描述在这里插入图片描述
  2. 建立聚合函数视图并插入数据
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    会报错,提示当前视图不能执行插入操作。
    因为视图在使用了聚合函数以后,视图内的数据与表中数据不对应,所以此时视图不能进行插入或更新。

四、视图的作用

在这里插入图片描述

(1)安全

对于数据库当中的操作我们是可以进行用户授权的,通过授予用户权限来限定每个用户能在mysql上看到哪些数据库、操作哪些数据库,能够看到与操作哪些表。但是对于mysql数据库当中的授权只能将权限限制到表级,无法限制到字段,但是通过视图就可以。比如想要让用户只看到student表中的id与name两个字段,不让他看到学号字段,那么就能创建一个只有id与name两个字段的视图

(2)数据独立

假如基础表的某一字段名称发生变化,例如由’name’变为’stuName’,此时可以针对视图进行更新操作即可,为’stuName’起一个别名’name’,就能屏蔽基表的变化对业务的影响,这样也能保证一些敏感数据的安全性
在这里插入图片描述

(3)例题

在这里插入图片描述
1.
在这里插入图片描述
2.
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Craaaayon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值