【三十五、MySql】进阶篇--视图

视图

1,介绍:
视图view是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图中动态生成的。
通俗的讲,视图只保存了查询SQL的逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL的查询语句上。

2,语法:
1)创建视图的语法
创建视图的时候or replace可以不加

create [or replace] view 视图名称[(列名列表)] as select语句 [with [cascaded | local ] check option];

2)查询
①查看创建视图的语句:show create view 视图名称;
②查看视图数据:select * from 视图名称……;

3)修改
①方式一:create [or replace] view 视图名称[(列名列表)] as select语句 [with [cascaded | local ] check option]; 修改视图的时候主要在or replace
②方式二:alter view 视图名称[(列名列表)] as select语句 [with [cascaded | local ] check option];

3)删除

drop view [if exits] 视图名称[,视图名称]……

3,视图的检查选项 check option:
当使用with check option子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入、更新、删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项:cascaded 和 local,默认为cascaded

如图所示,视图约束了id<=30,同时插入id为9000的数据,执行成功,但实际并未保存在表中
在这里插入图片描述
为了避免这一种情况,得通过添加检查选项with check option,当再插入id为9000的数据时违背了视图创建时的条件,报错检查选项失败,阻止该条数据插入
在这里插入图片描述
1)cascaded 级联操作 :会去检查当前视图的条件,以及当前视图所依赖的视图的条件
①创建视图t_v_1不加with cascaded check option检查选项,创建视图t_v_2添加with cascaded check option检查选项
t_v_2基于t_v_1创建,执行以下sql:(看下图)
在这里插入图片描述
②上述视图和条件不变,添加视图t_v_3,t_v_3基于t_v_2创建,再执行以下3个sql:
insert into t_v_3 values (13,'aaaaa','122');
–插入成功,同时满足t_v_3、t_v_2、t_v_1的条件
insert into t_v_3 values (17,'bbbbb','122');
–插入成功,在t_v_3没有添加检查选项,所以没有与t_v_3做判断是否违背t_v_3的条件,同时向上到t_v_2,但t_v_2有添加检查选项,所以做了检查,但满足t_v_2的条件,再向t_v_1做判断,也满足t_v_1的条件,故该数据插入成功
insert into t_v_3 values (31,'ccccc','122');
–插入失败,在t_v_3没有添加检查选项,所以没有与t_v_3做判断是否违背t_v_3的条件,同时向上到t_v_2,但t_v_2有添加检查选项,所以做了检查,但满足t_v_2的条件,再向t_v_1做判断,但不满足t_v_1的条件,故该数据插入失败
在这里插入图片描述

2)local:基于MySQL8.0,会去检查当前视图的条件,以及当前视图所依赖的视图的条件,如果被依赖的视图没有定义检查选项,则不会去判断是否满足被依赖视图的条件;如果被依赖的视图定义了检查选项,则会去判断是否满足被依赖视图的条件;
①情况一:被依赖的t_v_4没有检查选项
在这里插入图片描述
②情况二:被依赖的t_v_4有检查选项
在这里插入图片描述

视图的更新:
作用:
疑问,如果某字段是not null呢:如果基础表中某字段是not null,在视图中没有的话,无法直接在视图中插入数据。(已经过测试)

案例1:为了保证数据库表的安全性,开发人员在操作t_input表的时候,只能看到基本字段,如姓名、生日和手机号

create or replace view t_user_1 as select name,birthday,phone from t_input where id <= 100 with cascaded check option ;

select * from t_user_1 where name is not null;

案例2:查询每个套餐所包含的菜品

create or replace view t_user_2 as  select a.name as 套餐名称,c.name as 菜品名称2 from setmeal a
left join setmeal_dish b on a.id = b.setmeal_id
left join dish c on b.dish_id = c.id;

select * from t_user_2;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值