目录
一、视图介绍
二、视图基本语法
三、检查选项
1. cascaded
2. local
四、视图更新
五、案例练习
视图(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 视图名称; |
查看视图数据 | SELECT * FROM 视图名称 .....; |
-- 查询视图
-- 查询视图表
show create view stu_v_1;
-- 查询视图数据
select * from stu_v_1;
select * from stu_v_1 where id = 3;
方法一 | CREATE [ OR REPLACE ] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] |
方法二 | ALTER 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 stu_v_1 as select id,name from student where id <= 10;
-- 删除视图
drop view if exists stu_v_1;
例如上述我们在创建视图时:
create or replace view stu_v_1 as select id,name from student where id <= 20;
当我们进行以下插入数据时会发现,均执行成功:
insert into stu_v_1 values(6,'Tom');
insert into stu_v_1 values(30,'Jack');
但是这与我们初始创建视图时所添加的条件 ( where id <= 20) 相矛盾,因此加入了检查选项:
create or replace view stu_v_1 as select id,name
from student where id <= 20
with cascaded check option;
视图的检查选项:
当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项:CASCADED 和LOCAL,默认值为CASCADED。
cascaded检查选项是,如果当前视图有检查选项,则插入数据要满足包括当前视图条件以及满足当前视图所依赖的视图的条件。如果当前视图没有检查选项,则插入数据要满足当时视图所依赖视图有检查选项及其依赖的视图的条件。
create or replace view stu_v_1 as select id,name from student where id <= 20 ;
-- 没有加入检查选项 两条插入语句均执行
insert into stu_v_1 values (1,'Tom');
insert into stu_v_1 values (25,'Tom');
create or replace view stu_v_2 as select id,name
from stu_v_1 where id >= 10
with cascaded check option ;
-- 加入检查选项 且基于stu_v_1
insert into stu_v_2 values (7,'Tom'); -- 插入失败
-- 同样插入失败 再检查完stu_v_2条件后
-- 会继续检查基于的stu_v_1条件 二者同时满足才能插入成功
insert into stu_v_2 values (26,'Tom'); -- 插入失败
insert into stu_v_2 values (15,'Tom'); -- 插入成功
create or replace view stu_v_3 as select id,name from stu_v_2 where id <= 15;
-- 没有加入检查选项 且基于stu_v_2
insert into stu_v_3 values (11,'Tom'); -- 插入成功
-- stu_v_3没有检查选项 不满足<=15 但是满足stu_v_2选项条件
insert into stu_v_3 values (17,'Tom'); -- 插入成功
-- stu_v_3没有检查选项 不满足<=15 但是也满足stu_v_2选项条件
insert into stu_v_3 values (28,'Tom'); -- 插入失败
local检查选项是递归的查找当前视图所依赖的视图是否有检查选项,如果有,则检查;如果没有,就不做检查。
create or replace view stu_v_2 as select id,name
from stu_v_1 where id >= 10
with local check option ;
-- 加入检查选项 且基于stu_v_1
-- 检查完stu_v_2条件后 会继续检查基于的stu_v_1条件 二者均满足所以插入成功
insert into stu_v_2 values (13,'Tom'); -- 插入成功
-- 检查完stu_v_2条件后 虽然不满足stu_v_1条件但是其没有检查选项 所以同样插入成功
insert into stu_v_2 values (17,'Tom'); -- 插入成功
create or replace view stu_v_3 as select id,name from stu_v_2 where id < 20;
-- 没有加入检查选项 且基于stu_v_2
insert into stu_v_3 values (14,'Tom'); -- 插入成功
要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。
如果视图包含以下任何一项,则该视图不可更新:
-- 创建视图,使用了聚合函数
create view stu_v_count as select count(*) from student;
-- 此时更新视图报错
insert into stu_v_count values (10);
-- 1.为了保证数据库表的安全性,开发人员在操作tb_user表时,
-- 只能看到的用户的基本字段,屏蔽手机号和邮箱两个字段。
create view tb_user_view as
select id,name,profession,age,gender,status,createtime
from tb_user;
select * from tb_user_view;
-- 2. 查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,
-- 为了简化操作,定义一个视图。
-- a.首先写出三表联查的sql语句
select s.name,s.no,c.name from student s,student_course sc,course c
where s.id = sc.studentid and sc.courseid = c.id;
-- b.分装到视图中
create view tb_user_course_view as
select s.name student_name,s.no student_no,c.name course_name
from student s,student_course sc,course c
where s.id = sc.studentid and sc.courseid = c.id;