(四)、视图 (View)
1.视图
(1).视图介绍
视图是一种虚拟存在的表。视图中的数据并不是在数据库中实际存在,行和列数据来自定义视图的查询中心使用的表,并且是在使用视图时动态生成的。
通俗的讲: 视图只保存了查询的SQL逻辑,不保存查询结果
。所以我们在创建视图的时候,主要的工作就落在了创建这条SQL查询语句上。
(2).视图的创建
create [or replace] view 视图名称[(列名列表)] as select 语句 [with [cascade | local] check option]
-- 1.创建视图 create or replace view stu_v_1 as select id,name from student where id<=10;
(3).视图的查询
1. 查看创建视图的语句
show create view 视图名称;
2.查看视图数据
select *from 视图名称...;
-- 2.查询视图的结构 show create view stu_v_1; -- 3.查看视图的数据 select *from stu_v_1;
(4).视图的修改
1.第一种方式: 重载的方式
create [or replace] view 视图名称[(列名列表)] as select语句 [with [cascaded | local] check option]
2.第二种方式:非重载的方式
alter view 视图名称[(列名列表)] as select 语句 [with [cascaded | local] check option]
-- 4.重写修改视图 create or replace view stu_v_1 as select id,name,no from student where id<=10; -- 5.非重写修改视图 alter view stu_v_1 as select id,name,no from student where id<=10;
(5).视图的删除
drop view [if exists] 视图名称 ....
-- 6.删除视图 drop view if EXISTS stu_v_1;
2.视图_检查选项
(1).视图的检查选项
当使用 with check option
子句创建视图时,MySQL会通过视图检查正在更改的每个行,列如 插入,更新,删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项: cascased 和 local
, 默认是cascaded
。
(2).多视图级联 (cascaded)
cascaded: 当视图中有一个视图进行了cascaded,那么基于这个casaded的表或者被这个cascaded表基于的表都要去进行关联。。
-- 1.没有添加检查选项的语句 create view v1 as select id,name from student where id<=20; -- 2.添加了检查选项的语句 - 会进行约束检查(默认cascaded) create view v2 as select id,name from where id<=20 with cascaded check option;
三张视图的级联关系...
-- cascaded 级联 -- 1.未创建级联的操作 create or replace view stu_v_1 as select id,name from student where id<=20; -- 1.1 以下都能够插入成功!!! insert into stu_v_1 values(5,'tom'); insert into stu_v_1 values(25,'tom'); -- 1.2基于视图stu_v_1 创建另一个视图 stu_v_2 create or replace view stu_v_2 as select id,name from stu_v_1 where id>=10 with cascaded check option; insert into stu_v_2 values(7,'tom'); # 这里会报错,因为id要大于7 insert into stu_v_2 values(26,'tom'); # 这里会报错,因为视图stu_v_1与stu_v_2级联了,所以视图stu_v_2要同时满足这两个条件 insert into stu_v_2 values(15,'tom15'); #插入成功 -- 1.3基于视图 stu_v_2视图进行创建 create or replace view stu_v_3 as select id,name from stu_v_2 where id<=15; insert into stu_v_3 values(11,'tom11'); #能够插入成功 insert into stu_v_3 values(17,'tom17'); # 能够插入因为视图三没有检查约束 insert into stu_v_3 values(28,'tom28'); # 不能够被插入因为不满足视图一的要求
注意: 我们建立视图与视图之间进行级联的时候,级联(stu_v_2)满足被级联(stu_v_1)的视图的检查选项的时候,stu_v_2才会显示对应的视图,如果都不满足的话会先显示null。
结论: stu_v_2添加数据的时候既要满足stu_v_1也要满足stu_v_2。stu_v_3添加数据的时候既要满足stu_v_1和stu_v_2和stu_v_3。
(3).多级视图_(local)
local: 当基于的基表没有添加检索条件的时候,就不去关联;如果基于的基表添加了检索条件但自己没添加检索条件也不去关联;当自己添加了检索条件且基于的基表添加了条件的时候才会去关联。。
-- clocal 级联 -- 1.未创建级联的操作 create or replace view stu_v_4 as select id,name from student where id<=20; -- 1.1 以下都能够插入成功!!! insert into stu_v_4 values(5,'tom'); insert into stu_v_4 values(25,'tom'); -- 1.2基于视图stu_v_4 创建另一个视图 stu_v_5 create or replace view stu_v_5 as select id,name from stu_v_4 where id>=10 with local check option; insert into stu_v_5 values(7,'tom'); # 这里会报错,因为id要大于10 insert into stu_v_5 values(26,'tom'); # 这里会成功,因为基表stu_v_4没有设置级联关系 insert into stu_v_5 values(15,'tom15'); #这里成功 -- 1.3基于视图 stu_v_5视图进行创建 (未创建级联) create or replace view stu_v_6 as select id,name from stu_v_5 where id<=15; insert into stu_v_6 values(9,'tom11'); #这里会成功 ⭐ insert into stu_v_6 values(17,'tom17'); # 能够插入因为视图三没有检查约束 insert into stu_v_6 values(28,'tom28'); # 能够被插入因为不满足视图一的要求 ⭐⭐
结论: 视图stu_v_5使用local不会kaolvstu_v_4。 stu_v_6不会有stu_v_5的约束。
(4).非检查选项_视图
我们可以创建出超过20的索引,并不会报。
-- 1根据基表student创建视图 create or replace view stu_v_1 as select id,name from student where id<=20; -- 2.查看基表的视图 select *from stu_v_1; -- 3.我们向这个视图插入一个数据,数据实际上是插入基表中而不是视图,视图不存放数据。 insert into stu_v_1 values(6,'tom'); insert into stu_v_1 values(30,'tom');
(5).检查选项_视图 (cascaded 级联)
添加检查索引之后,我们不能添加id超过20的索引了。
-- 1. 以重写的方式修改我们的视图 -> 加上视图检查选项 check ⭐ create or replace view stu_v_1 as select id,name from student where id<=20 with cascaded check option ; -- 2.查看基表的视图 select *from stu_v_1; -- 3.我们向这个视图插入一个数据,数据实际上是插入基表中而不是视图,视图不存放数据。 insert into stu_v_1 values(6,'tom'); insert into stu_v_1 values(30,'tom'); # ⭐⭐这里会报错,不让插入
(6).检查选项_视图(local)
-- 1. 以重写的方式修改我们的视图 -> 加上视图检查选项 local ⭐ create or replace view stu_v_1 as select id,name from student where id<=20 with local check option ; -- 2.查看基表的视图 select *from stu_v_1; -- 3.我们向这个视图插入一个数据,数据实际上是插入基表中而不是视图,视图不存放数据。 insert into stu_v_1 values(6,'tom'); insert into stu_v_1 values(30,'tom'); # ⭐⭐这里会报错,不让插入
3.视图_更新及作用
(1).视图的更新和插入
要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系
。如果视图包含以下任何一项,则该视图不可更新:
- 聚合函数或窗口函数(sum()、min()、max()、count())等。
- distinct
- group by
- having
- union 或者 union all
-- 创建视图,使用聚合函数 create view stu_v_count as select count(*) from student; -- 1.插入失败,因为我们的视图用聚合函数创建了 insert into stu_v_count values(10);
(2).视图的作用
- 简单: 视图不仅可以简化用户对数据的理解,也可以简化它们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定的全部条件。比如(一个复杂的查询语句封装到一个视图上)
- 安全: 数据库可以授权,但不能授权到数据库特定和特定的列上。通过视图用户只能查询和修改它们所见到的数据。(Student表,我只给你展示id和name两个字段)
- 数据独立:视图可以帮助用户频闭真实表结构变化带来的影响。比如(在真实的数据库中student表的字段是name我们可以使用studentName替换)
create view stu_v_2 as select id, name as studentName from student; • 1
4.视图_案列
-- 1.为了保证数据库的安全性,开发人员在操作tb_user表时,只能看到用户的基本字段,频闭手机号和邮箱。 create view student_1 as select id,`name`,age from tb_user; select *from student_1; -- 2. 查询每个学生所选修的课程(三集联表),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。 create view student_course_1 as select s.`name` as StudentName,c.`name` as courseName from student s,course c,student_course sc where s.id=sc.studentid and c.id=sc.courseid; select *from student_course_1;