前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Mysql-13】视图——语法盘点&特性介绍(7k字详解&经典代码样例演示)

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

作者头像
YY的秘密代码小屋
发布2024-05-14 08:23:37
6800
发布2024-05-14 08:23:37
举报
文章被收录于专栏:C++系列
在这里插入图片描述
在这里插入图片描述
  • 一.视图的基本介绍:
  • 二.视图的基本语法:
    • 1.视图的【创建&查询&修改&删除】总览
    • 2.代码&样例演示
  • 三.视图的插入操作:
    • 1.基本插入操作演示
    • 2."检查选项"在插入操作时时的场景——[with local/cascaded check option]
  • 四.视图的检查选项
    • 1.演示cascaded【递归检查,检查选项方向继承】
    • 2.演示LOCAL【递归检查,检查选项不继承】
  • 五.视图更新的条件
  • 六.视图的作用
    • 1.本质是进行封装
  • 七.视图的案例需求练习

一.视图的基本介绍:

  • 视图(View)是一种虚拟存在的表,意味着我们可以像操作表一样来操作视图。
  • 视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表(基表),并且是在使用视图时动态生成的。
  • 通俗的讲,视图只保存了查询的SQL透辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

二.视图的基本语法:

1.视图的【创建&查询&修改&删除】总览

总览:

在这里插入图片描述
在这里插入图片描述

细节:

  1. 创建
  • 橙色部分可选项见传送门:的撒旦
在这里插入图片描述
在这里插入图片描述
  1. 查询
在这里插入图片描述
在这里插入图片描述
  1. 修改
  • 我们注意到【方式一】修改视图和创建视图语法相同
  • 关键点在于:修改视图要加上 or replace;创建视图可加可不加;、
在这里插入图片描述
在这里插入图片描述
  1. 删除
  • 加上if exists:如果视图存在,执行删除操作
在这里插入图片描述
在这里插入图片描述

2.代码&样例演示

  • 学生数据表略
代码语言:javascript
复制
-- 创建视图
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.基本插入操作演示

  • 学生表略

  • 我们知道视图不存储数据,数据都是在基表中,即数据存储在样例中的学生表中
  • 我们插入的数据是插入到基表中
代码语言:javascript
复制
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
代码语言:javascript
复制
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如果对其进行增删改操作,他不会检查是否满足条件
在这里插入图片描述
在这里插入图片描述
  1. 定义一个新视图v2基于v1,有检查选项 with cascaded check option
在这里插入图片描述
在这里插入图片描述
  1. 由于有 cascaded 级联 操作v2视图时,他会检查基表v2
在这里插入图片描述
在这里插入图片描述
  1. 此时我们再 定义一个新视图v3基于v2,无检查选项
在这里插入图片描述
在这里插入图片描述
  • 重要结论: 他仍然会递归判断底层条件,检查选项方向继承 (具体机理可见下方代码区域注释)
代码语言:javascript
复制
-- 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
在这里插入图片描述
在这里插入图片描述
  1. 定义一个新视图v3基于v2,无检查选项
在这里插入图片描述
在这里插入图片描述
  • 重要结论: 他仍然会递归判断底层条件,检查选项不继承 (具体机理可见下方代码区域注释)
代码语言:javascript
复制
--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表如下所示:
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
-- 案例:  本质都是封装


-- 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;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.视图的基本介绍:
  • 二.视图的基本语法:
    • 1.视图的【创建&查询&修改&删除】总览
      • 2.代码&样例演示
      • 三.视图的插入操作:
        • 1.基本插入操作演示
          • 2."检查选项"在插入操作时时的场景——[with local/cascaded check option]
          • 四.视图的检查选项
            • 1.演示cascaded【递归检查,检查选项方向继承】
              • 2.演示LOCAL【递归检查,检查选项不继承】
              • 五.视图更新的条件
              • 六.视图的作用
                • 1.本质是进行封装
                • 七.视图的案例需求练习
                相关产品与服务
                云数据库 MySQL
                腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档