本文章将基于黑马程序员的 "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;
①关键词解析
- 如果要去替换某一视图,那么可以加上or replace关键字
- select当中所查询的表就是这个视图所关联的基表(也叫基础表)
- 虽然创建与修改的视图的sql好像相同,但是创建视图语句的or replace可加可不加,修改视图语句的关键在于or replace
②业务示例
(2)向视图中添加数据(增)
之前提到过视图当中实际上并不存储数据,具体数据都是存在于基表当中的,也就意味着我们插入的数据实际上都插入到基表当中去了
insert into view1 values(..,..,..);
①基表与视图中数据的变化
- 基表中的变化
- 视图的变化
- 但是再次查询视图时发现 id=30 的该条数据并不存在,因为创建视图时指定了条件为id<=20,也就意味着通过视图插入的数据居然在这个视图中查询不到。
为了避免这种情况出现,mysql当中在创建视图时提供了一种语法:我们可以在sql中加上 with cascaded/local check option检查选项
二、检查选项
(1)cascaded级联
①业务示例
- 重新编写创建视图sql并加上cascaded检查选项
- 插入数据
出现 check option failed检查选项失败 报错,成功阻止该条与创建视图时所制定的条件相违背的数据插入
②逻辑解析
- 因为创建视图v1的sql语句未加上检查选项,那么接下来对该v1视图进行增删改操作都不会去检查它的条件
- 再定义一个视图v2,它是基于v1视图的,但是条件与v1中不相同且指定了cascaded(级联)检查选项。一旦加上该检查选项,那么当我们再去操作v2视图时会去检查是否满足v2的条件。由于加的是cascaded级联,那么它不仅要去检查当前操作是否满足v2的条件,还要去检查是否满足v1的条件,就相当于在v1视图中也加上了检查选项参数。假如v1又关联了另外一个视图,那么就相当于在它所依赖的视图后面也加上了cascaded检查选项
- 但是假设此时又新建视图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)安全
对于数据库当中的操作我们是可以进行用户授权的,通过授予用户权限来限定每个用户能在mysql上看到哪些数据库、操作哪些数据库,能够看到与操作哪些表。但是对于mysql数据库当中的授权只能将权限限制到表级,无法限制到字段,但是通过视图就可以。比如想要让用户只看到student表中的id与name两个字段,不让他看到学号字段,那么就能创建一个只有id与name两个字段的视图
(2)数据独立
假如基础表的某一字段名称发生变化,例如由’name’变为’stuName’,此时可以针对视图进行更新操作即可,为’stuName’起一个别名’name’,就能屏蔽基表的变化对业务的影响,这样也能保证一些敏感数据的安全性
(3)例题
1.
2.