视图是一种虚拟临时表,并不真正存储数据,它的作用就是方便用户查看实际表的内容或者部分内容
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(联合查询)