MySQL学习(16):视图

视图是一种虚拟临时表,并不真正存储数据,它的作用就是方便用户查看实际表的内容或者部分内容

1.视图的使用语法

(1)创建

create view 视图名称 as select语句;
#视图形成的虚拟表就来自于select语句所查询的实际表,这个实际表称为视图的基表

(2)查询

#查询视图创建语句:
show create view 视图名称;

#查看视图数据:
select * from 视图名;
#由于视图的数据就来自实际表,所以可以直接把视图当做普通表来查询

(3)修改

方式一:
replace view 视图名 as select语句;

方式二:
alter view 视图名 as select语句;

(4)删除

drop view 视图名;

2.视图的检查选项

视图虽然是虚拟表,不存储数据,但依然可以对它进行增删改,只是增删改的对象是视图的基表。

要了解视图的检查选项的作用,可以先观察下面的实例:

这条语句创建的视图是,基表加上where条件创建的,那么当对这个视图进行增删改,但却违反where条件时,增删改会执行成功吗?

用上图中的2条语句插入数据(第二条违反了where条件),结果全部都执行成功了。

会出现这种情况,就是因为创建视图的语句中缺少了检查选项

视图的检查选项有2种:cascaded、loacl

2.1 cascaded(默认)

在创建视图的语句后添加with check option(也就是检查选项)后,

create view 视图名称 as select语句 with check option;

视图的增删改就会检查创建时所设置的条件,如果违反条件,则增删改就会执行失败。

with check option是with cascaded check option的简写,如果写成with loacl check option则代表loacl检查

cascaded检查个特别的注意事项:

由于视图可以根据其他视图创建,所以就存在是否继承其他视图的约束条件的问题

(1)视图2(有检查选项)←视图1(无检查选项)←基表

像上图这样,stu_v_2视图根据stu_v_1创建,同时又在stu_v_2创建语句后加了cascaded检查选项,那么stu_v_2的增删改就会同时判断stu_v_2、stu_v_1两个视图的约束条件。也就是说,上图只有15,Tom添加成功了,其他2条都失败了

(2)试图3(无检查选项)←视图2(有检查选项)←视图1(无检查选项)←基表

继续前面的案例。若如上图这样创建stu_v_3,那么stu_v_3的增删改会看stu_v_2及stu_v_1的约束条件,而不看stu_v_3自身的约束条件(因为stu_v_3创建语句本身没加检查选项),也就是上图中的前2条语句添加数据成功,第3条语句添加数据失败。

2.2 local

(1)视图2(有检查选项)←视图1(无检查选项)←基表

对于上图的v2视图,在进行增删改时只看自己的约束条件,而不看v1的约束条件。

如果v1的创建语句后也有with loacl check option,那么就会同时看v2、v1的约束条件了。这也是两种检查选项的主要区别

(2)试图3(无检查选项)←视图2(有检查选项)←视图1(无检查选项)←基表

对于上图的v3视图,在进行增删改时只看v2的约束条件,而不看v3、v1的约束条件

3.视图增删改的条件

对视图进行增删改的前提,是视图中的行要与基表中的行一对一。

若视图包含以下任何一项,就违反了这一前提:

(1)聚合函数或窗口函数,如sum、min、max、count等

(2)distinct(去重)

(3)group by(分组)

(4)having

(5)union或union all(联合查询)

  • 22
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值