八,视图

150 阅读3分钟

一,视图介绍

定义:视图是一个虚拟表,由一个或多个真实表(基表)的查询结果动态生成。视图本身不存储数据,数据来自基表。

特点

  • 动态性:视图的数据随基表数据变化自动更新。
  • 逻辑抽象:隐藏底层表结构和复杂性,用户只需操作视图。
  • 权限隔离:可限制用户通过视图访问特定字段或行。
  • 简化操作:封装复杂查询,提高代码复用性。

二,语法

2.1 创建视图

create view 视图名 [(视图的列名列表)] as select语句;
  • select 语句查询到的那个表就是基表
  • 视图的列名列表意思是,我们可以将基表的列名自定义,注意一一对应即可

2.2 查询视图

查询创建视图的SQL语句

show create view;

查询视图的数据

select 字段列表 from 视图名;

查询视图的时候,将视图当作一张表,查询即可。

2.3 修改视图

  • 方式1

    create or replace view 视图名[(视图的列名列表)] as select语句;
    
  • 方式2

    Alter view 视图名 as select语句;
    

2.4 删除视图

Drop view [if exists] 视图名;

2.5 检测选项

  • 因为视图是一张虚拟表,视图可以和表进行完全一样的操作,但是对视图进行增删改的操作,它实际上是对基表的增删改

  • 当我们 select查询语句的时候存在限定,如 id < 10 ,这个时候我们再对视图插入数据且id>10,这时我们的视图就查询不到该数据,故为了避免这个情况我们在创建视图的时候增加了查询检测的选项。

2.5.1 语法

create view 视图名 as select语句 with [cascaded |  local ] check option;

增加了查询检测选项之后,我们再对视图进行插入操作时就会进行检测,如果插入的数据超过了查询语句的范围,就会报错,如果不加 cascadedlocal那么就默认cascaded

2.5.2 视图嵌套

视图是一张虚拟表,且视图具备表的大部分操作,故,视图也可以成为另外一个视图的基表!

假设有三个视图A,B,C。其中A是B的基表,B是C的基表,A->B->C

  1. 使用with cascaded检测选项

    假定我们在创建视图B的时候使用了with cascaded检测选项,这个时候视图插入数据的限定条件为A,B,C三个视图的条件的并集。

  2. 使用with local检测选项

    假定在创建视图B中使用的是with local检测选项,且在A,C中并没有使用检测选项,那么数据限定条件就是B的条件,若A中加了with local检测选项,就是A,B的条件的交集。以此类推。

三,视图的更新及作用

3.1 视图的更新

视图更新必须满足

  1. 视图的行和基表的行必须一一对应
  2. 视图不能包含,聚合函数,distince,group by,having,union或union all

这是因为使用了这些函数或者分组查询出来的是一张类似临时表的存在,无法作为基表进行操作。

3.2 视图的作用

  1. 简单
    • 视图可以简单化用户对数据的理解,也可以简化操作。
    • 经常使用的查询语句可以定义成视图从而简化操作。
  2. 安全
    • 我们可以授权让用户看到指定的数据库,但是无法授权让用户看到指定的行和列。
    • 可以通过视图让用户只能查询,修改特定的行和列。
  3. 数据独立:视图可以帮助用户屏蔽真实表带来的变化。