0


【Mysql-13】视图——语法盘点&特性介绍(7k字详解&经典代码样例演示)

前言

大家好吖,欢迎来到 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.视图的【创建&查询&修改&删除】总览

总览:
在这里插入图片描述

细节:

  1. 创建
  • 橙色部分可选项见传送门:的撒旦在这里插入图片描述
  1. 查询在这里插入图片描述
  2. 修改
  • 我们注意到【方式一】修改视图和创建视图语法相同
  • 关键点在于:修改视图要加上 or replace;创建视图可加可不加;、在这里插入图片描述
  1. 删除
  • 加上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:

  1. 创建一个视图v1,无检查选项 ,r如果对其进行增删改操作,他不会检查是否满足条件在这里插入图片描述
  2. 定义一个新视图v2基于v1,有检查选项 ,with cascaded check option在这里插入图片描述
  3. 由于有 cascaded 级联 ,操作v2视图时,他会检查基表v2 在这里插入图片描述
  4. 此时我们再 定义一个新视图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:

  1. 创建一个视图v1,无检查选项
  • r如果对其进行增删改操作,他不会检查是否满足条件在这里插入图片描述
  1. 定义一个新视图v2基于v1,有检查选项 ,with local check option在这里插入图片描述
  2. 定义一个新视图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.本质是进行封装

在这里插入图片描述

七.视图的案例需求练习

需求:

  1. 为了保证数据库表的安全性,开发人员在操作tb user表时,只能看到的用户的基本字段,屏蔽手机号和邮箱两个字段。
  2. 查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。
  • 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;
标签: mysql android 数据库

本文转载自: https://blog.csdn.net/YYDsis/article/details/138541627
版权归原作者 YY的秘密代码小屋 所有, 如有侵权,请联系我们删除。

“【Mysql-13】视图——语法盘点&特性介绍(7k字详解&经典代码样例演示)”的评论:

还没有评论