十三、视图
13.1 介绍
/*
视图(view)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图是动态生成的。
通俗地讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们再创建视图的时候,主要的工作就落在创建这条SQL查询语句上
*/
-- 创建视图
#create [or replace] view 视图名称[(列名列表)] as select语句 [with[cascaded|local] check option]
create or replace view stu_v_1 as select id,name from student where id<=10;
-- 查询视图
#查看创建视图的语句:show create view 视图名称
show create view stu_v_1;
#查看视图数据:select * from 视图名称 [条件]
select * from stu_v_1;
-- 修改
#方式一:create [or replace] view 视图名称[(列名列表)] as select语句 [with[cascaded|local] check option]
create or replace view stu_v_1 as select id,name,no from student where id<=10;
#方式二:alter view 视图名称[(列名列表)] as select语句 [with[cascaded|local] check option]
alter view stu_v_1 as select id,name from student;
-- 方式一其实就是创建新的视图来替换掉原来的视图
-- 删除
#drop view [if exists] 视图名称[(列名列表)]
drop view if exists stu_v_1;
13.2 检查选项
/*
当使用with check option子句创建视图时,MySQL会检查正在更改的每一行,以使其符合视图的规定。
另外,MySQL允许基于一个视图创建新的视图,如果新创建的视图带了检查选项的话,就会保证对视图进行增加操作时,添加进来的数据是符合它所基于的视图的要求的。
MySQL还提供了两个选项:cascaded和local,默认为cascaded
*/
-- 创建视图,并带上检查选项
create or replace view stu_v_1 as select id,name from student where id<=10 with cascaded check option ;
select * from stu_v_1;
-- 可以添加成功
insert into stu_v_1 values (5,'胡桃');
-- 该句执行失败,因为20>10,不满足视图要求
insert into stu_v_1 values (20,'钟离');
-- 基于stu_v_1创建的新视图,并且带有检查选项
create or replace view stu_v_2 as select id,name from stu_v_1 where id>7 with cascaded check option;
-- 执行成功,因为id=8既满足id>7,也满足id<=10
insert into stu_v_2 values(8,'hutao');
-- 报错,因为id=5不满足id>7
insert into stu_v_2 values(5,'hutao');
-- 也报错
insert into stu_v_2 values(11,'hutao');
-- 对于local,它会递归地检查SQL语句中包含的检查选项,如果修改的数据不满足选项的条件,则无法执行修改语句。所谓递归就是表的套娃,基于视图又创建视图。
13.3 视图更新
/*
要使视图可以更新,必须使视图中的行与基础表中的行之间
存在一对一的关系。
如果视图包含以下任何一项,则视图不可更新:
1.聚合函数或者窗口函数
2.distinct
3.group by
4.having
5.union或者union all
*/
13.4 视图的作用
简单:
视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件
安全:
数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据。
数据独立:
视图可帮助用户屏蔽真实表结构变化带来的影响