前言
大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C++ Linux的老铁
主要内容含:
欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!
- YY的《C++》专栏
- YY的《C++11》专栏
- YY的《Linux》专栏
- YY的《数据结构》专栏
- YY的《C语言基础》专栏
- YY的《初学者易错点》专栏
- YY的《小小知识点》专栏
- YY的《单片机期末速过》专栏
- YY的《C++期末速过》专栏
- YY的《单片机》专栏
- YY的《STM32》专栏
- YY的《数据库》专栏
- YY的《数据库原理》专栏
目录
一.视图的基本介绍:
- 视图(View)是一种虚拟存在的表,意味着我们可以像操作表一样来操作视图。
- 视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表(基表),并且是在使用视图时动态生成的。
- 通俗的讲,视图只保存了查询的SQL透辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
二.视图的基本语法:
1.视图的【创建&查询&修改&删除】总览
总览:
细节:
- 创建
- 橙色部分可选项见传送门:的撒旦
- 查询
- 修改
- 我们注意到【方式一】修改视图和创建视图语法相同
- 关键点在于:修改视图要加上
or replace
;创建视图可加可不加;、
- 删除
- 加上if exists:如果视图存在,执行删除操作
2.代码&样例演示
- 学生数据表略
-- 创建视图
create or replace view stu_v_1 as select id,name from student where id <=10;-- 查询视图
show create view stu_v_1;
select * from stu_v_1;
select *from stu_v_1 where id <3;-- 修改视图
create or replace view stu_v_l 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;
三.视图的插入操作:
1.基本插入操作演示
- 学生表略
- 我们知道视图不存储数据,数据都是在基表中,即数据存储在样例中的学生表中
- 我们插入的数据是插入到基表中
create or replace view stu_v_1 as select id,name from student where id <=20;
select * from stu_v_1;
insert into stu_v_1 values(6,"Tom');
- 插入后
2."检查选项"在插入操作时时的场景——[with local/cascaded check option]
- 我们同时插入6号Tom和30号Tom
create or replace view stu_v_1 as select id,name from student where id <=20;
select * from stu_v_1;
insert into stu_v_1 values(6,"Tom');
insert into stu_v_1 values(30,"Tom');
- 插入完成
- 由于条件限制:我们所要插入的数据和视图创建时的条件违背
where id <= 20
- 我们
select * from stu_v_1;
,查看不到修改后的视图
- 因此我们加上
with cascaded check option
或者with local check option
- 当插入数据的条件不匹配时候,阻止插入(报错)
四.视图的检查选项
- 当使用
WITH CHECK OPTION
子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定义。- 具体操作演示看上面博客内容【三.2内容】
- MySQL 允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。
- 为了确定检查的范围,mysql 提供了两个选项: CASCADED 和LOCAL , 默认值为 CASCADED。
CASCADED 和LOCAL的区别:
1.演示cascaded【递归检查,检查选项方向继承】
演示cascaded:
- 创建一个视图v1,无检查选项 ,r如果对其进行增删改操作,他不会检查是否满足条件
- 定义一个新视图v2基于v1,有检查选项 ,
with cascaded check option
- 由于有 cascaded 级联 ,操作v2视图时,他会检查基表v2
- 此时我们再 定义一个新视图v3基于v2,无检查选项
- 重要结论: 他仍然会递归判断底层条件,检查选项方向继承 (具体机理可见下方代码区域注释)
-- cascaded
create or replace view stu_v_1 as select id,name from student where id <=20;
insert into stu_v_1 values(5,"Tom');//无检查,插入成功
insert into stu_v_1 values(25,"Tom');//无检查,插入成功
create or replace view stu_v_2 as select id,name from sty_v_1 where id >=10 with cascaded check option ;
insert into stu_v_2 values(7,"Tom');//有检查,插入失败
insert into stu_v_2 values(26,"Tom');//有检查,级联v1检查,插入失败
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;
insert into stu_v_3 values(11,"Tom');//无检查,v2有检查,级联v1有检查,插入成功
insert into stu_v_3 values(17,"Tom');//无检查,v2有检查,级联v1有检查,插入成功
insert into stu_v_3 values(28,"Tom');//无检查,v2有检查,级联v1有检查,插入失败
2.演示LOCAL【递归检查,检查选项不继承】
演示local:
- 创建一个视图v1,无检查选项
- r如果对其进行增删改操作,他不会检查是否满足条件
- 定义一个新视图v2基于v1,有检查选项 ,
with local check option
- 定义一个新视图v3基于v2,无检查选项
- 重要结论: 他仍然会递归判断底层条件,检查选项不继承 (具体机理可见下方代码区域注释)
--local
create or replace view stu_v_1 as select id,name from student where id <=15;
insert into stu_v_4 values(5,"Tom');//无检查,插入成功
insert into stu_v_4 values(16,"Tom');//无检查,插入成功
create or replace view stu_v_2 as select id,name from stu_v_1 where id >=10 with local check option ;
insert into stu_v_5 values(2,"Tom');//有检查,插入失败
insert into stu_v_5 values(13,"Tom');//有检查,递归到v1,无检查,插入成功
insert into stu_v_5 values(17,"Tom');//有检查,递归到v1,无检查,插入成功
create or replace view stu_v_3 as select id,name from stu_v_2 where id <20;
insert into stu_v_6 values(14,"Tom");//无检查,递归到v2,有检查,低轨道v1,无检查,插入成功
五.视图更新的条件
- 视图更新,必须满足一对一关系
- 举例:使用聚合函数
六.视图的作用
1.本质是进行封装
七.视图的案例需求练习
需求:
- 为了保证数据库表的安全性,开发人员在操作tb user表时,只能看到的用户的基本字段,屏蔽手机号和邮箱两个字段。
- 查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。
- tb_user表如下所示:
-- 案例: 本质都是封装
--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.查询每个学生所选修的课程(三张表联査),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。
-- 未封装前
select s.name,s.no .
from student s, student _course sc , course c
where s.id = sc.studentid and sc.courseid = c.id
create view tb stu 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;
select * from tb_stu_course_view;
本文转载自: https://blog.csdn.net/YYDsis/article/details/138541627
版权归原作者 YY的秘密代码小屋 所有, 如有侵权,请联系我们删除。
版权归原作者 YY的秘密代码小屋 所有, 如有侵权,请联系我们删除。