MYSQL九、MYSQL的视图的认识

视图

  1. 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在。行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。
    • 视图只保存了查询的SQL逻辑,不保存查询结果。
    • 在创建视图的时候,主要研究创建视图的这条SQL查询语句。

1、视图的语法

  • 创建视图
    • 语法:
# 创建语法
CREATE   [OR REPLACE]   VIEW  视图名称[(列名列表)]   AS   SELECT语句   [ WITH [ CASCADED  |  LOCAL ]  CHECK  OPTION ]

# or replace表示如果存在该名字的视图就替换到原来的视图

  • 创建视图例子:
-- 创建视图
create or replace view stu_view as select id,name from student where id <= 10;

-- 如果视图中存在stu_view视图,则直接替换,没有则创建新的视图
create or replace view stu_view as select id,name,no from student where id <= 20;
  • 修改视图
    • 语法:
# 方式一:
CREATE   [OR REPLACE]   VIEW  视图名称[(列名列表)]   AS   SELECT语句   [ WITH [ CASCADED  |  LOCAL ]  CHECK  OPTION ]
# 方式二:
ALTER   VIEW  视图名称[(列名列表)]   AS   SELECT语句   [ WITH [ CASCADED  |  LOCAL ]  CHECK  OPTION ]

  • 修改视图例子:
-- 修改stu_view视图
create or replace view stu_view as select id,name,no from student where id <= 20;

-- 直接修改视图stu_view
alter view stu_view as select id,name from student where id <= 10;
  • 查看视图
    • 语法:
# 查看创建视图语句:
SHOW  CREATE  VIEW  视图名称;

# 查看视图数据:
SELECT  *  FROM   视图名称 ...... ;
  • 查看视图例子:
# 查看视图stu_view的创建视图语句
show create view stu_view;

# 查看视图数据:
select * from stu_view;
  • 删除视图
    • 语法
DROP  VIEW  [IF EXISTS]   视图名称   [,视图名称]  ... 
  • 删除视图例子:
# 如果视图stu_view存在则删除视图
drop view if exists stu_view;

# 删除视图,如果不存在则报错
drop view stu_view;

2、通过视图进行插入数据

  • 向视图插入数据的操作,实际上会操作到定义视图的查询中使用的表
# 第一步首先创建一个视图
 create or replace view stu_v_1 as select id,name from student where id <= 10 ;

# 第二步:查看视图的数据
 select * from stu_v_1;

# 第三步:向视图插入数据(符合where条件的数据)
 insert into stu_v_1 values(6,'Tom');
 
# 第三步:向视图插入数据(不符合where条件的数据)
 insert into stu_v_1 values(17,'Tom22');
  • 执行上述的SQL,我们会发现,id为6和17的数据都是可以成功插入到student表上的。

    • 但是我们执行查询视图的时候,查询出来的数据,却没有id为17的记录。
      • 原因:在创建视图的时候,指定的条件为 id<=10, id为17的数据,是不符合条件的,所以没有查询出来,但是这条数据确实是已经成功的插入到了基表(student表)中。
  • 如果在定义视图时指定了条件,然后我们在插入、修改、删除数据时,应该做到必须满足条件才能操作,否则不能够操作。

    • 这需要借助于视图的检查选项

3、视图的检查选项

  1. 当使用with check option子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定义。
  2. MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。(即检查规则会递归上去,比如v3是依赖v2视图创建的,v2是依赖v1视图创建的,v1是基于某个表查询的视图,当我们向v3视图插入数据时,检查会从v3递归到v1的,但是需不需要满足条件才能进行操作需要看with check option的选项是cascaded还是local)
    • 为了确定检查的范围,mysql提供了两个选项:
      • CASCADED ( 默认值)
        • 即with check option 等于 with cascaded check option
      • LOCAL

cascaded(级联)

  1. 比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 cascaded,但是v1视图创建时未指定检查选项。 则在执行检查时,不仅会检查v2,还会级联检查v2的关联视图v1
    在这里插入图片描述
  • 当我们向v2视图插入数据时,不仅要检查v2的where条件,还要检查v1的where条件
    • 比如:当向v2视图插入一条数据时,先和v2视图的where条件进行比对:
      • 不符合v2视图的where条件则直接插入失败
      • 符合v2视图的where条件则再与v1视图的where条件进行比对,如果也符合则插入成功,如果不符合则也插入失败。

在这里插入图片描述

  • 当我们向v3视图插入数据时,因为v3没有定义检查选项,所以不会去检查v3的where条件,然后先去检查v2的where条件,再去检查v1的where条件
    • 比如:当向v3视图插入一条数据时,先和v2视图的where条件进行比对:
      • 不符合v2视图的where条件则直接插入失败
      • 符合v2视图的where条件则再与v1视图的where条件进行比对,如果也符合则插入成功,如果不符合则也插入失败。

LOCAL(本地)

  1. 比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 local ,但是v1视图创建时未指定检查选项。 则在执行检查时,只会检查v2,不会检查v2的关联视图v1
    在这里插入图片描述
  • 当我们向v3视图插入数据时,因为v3没有使用检查选项,所以不会去检查v3的where条件,然后先去检查v2的where条件,因为v2使用的检查选项是local,而且v1没有定义检查选项,所以不回去检查v1的where条件
    • 比如:当向v3视图插入一条数据时,先和v2视图的where条件进行比对:
      • 不符合v2视图的where条件则直接插入失败。
      • 符合v2视图的where条件则插入成功。

4、视图的更新

  1. 要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系
  2. 如果视图包含以下任何一项,则该视图不可更新
    • 聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)
    • DISTINCT
    • GROUP BY
    • HAVING
    • UNION 或者 UNION ALL

5、视图的作用

  • 1). 简单:视图不仅可以简化用户对数据的理解,也可以简化它们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
  • 2). 安全:对于数据库的操作,可以对用户进行授权,通过数据库的授权来决定每一个登录的用户能够操作哪些数据库,能够看到哪些数据库,能够看到哪些表,能够操作哪些表,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据。
  • 3). 数据独立:视图可帮助用户屏蔽真实表结构变化带来的影响。(假如基表的某个字段发生了变化,那么我们可以针对视图进行一个更新操作,给修改的字段添加一个别名(和原来的一样),这样就屏蔽了基表的变化对业务的影响)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值