SQL 视图

视图是一个虚表,在数据库中只存放视图的定义,而不存放视图中对应的数据。

一、建立视图

1.一般格式

1
2
3
create view 视图名 [列名]
as 子查询
[with check option];

2.列名

列名只能全部省略或全部指定,如果子查询中出现了同名列或未命名的列,则必须全部指定。

3.with check option

表示在对视图进行 update、insert 和 delect 操作时,会自动检查是否符合视图定义的条件。

4.几点说明

  • create view 后,只是把视图的定义存入数据字典
  • 每次查询视图时,按视图定义将数据查出
  • 视图不仅可以建立在基本表上,同样可以建立在视图上
  • 由于视图中的数据并不实际存储,因此可以定义一些派生属性列,而不用担心数据冗余的问题

二、删除视图

1.一般格式

1
drop view 视图名 [cascade];

注意:

仅是删除了视图的定义,并没有删除数据

2.cascade

增加了此关键字后,如果该视图上还导出了其它视图,则会一并删除。

三、查询视图

视图定义后,用户就可以像对基本表一样对视图进行查询。

首先进行有效性检查,检查查询中涉及的表、视图是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换为等价的对基本表的查询,然后执行。这一转换过程称为视图消解

但定义视图并查询和基于派生表的查询是有区别的。视图一旦定义,将保存在数据字典中,之后的查询都直接引用该视图。而派生表只是在语句执行时临时定义,执行后该定义即被删除。

四、更新视图

1.视图更新的实质

更新视图是指通过视图来进行插入、删除、修改等操作,由于视图并不实际存储数据,因此视图的更新需要转化为对基本表的更新。

2.可更新的视图

  • 子查询中, from 后面的数据库只有一个。即,视图仅从一个数据库中取得。
  • 子查询中,select 后面只包含属性名,不包含表达式、聚集函数、distinct(去除重复)、group by、having。
  • 任何没有出现在 select 中的属性值都可以取空值

3.对于视图之外的更新

若定义视图时没有加上 with check option ,则进行更新时不会检查是否符合视图定义的条件。因此,有可能进行符合基本表要求不符合视图要求的更新。即更新在基本表处是奏效的,但在视图上是不可见的。

例如:

基本表对 salary 没有要求,视图筛选出基本表中 salary > 5000 的元组。

若没有加上 with check option ,此时插入一条 salary 为 3000 的元组。它满足基本表的要求,因此显然可以插入;但它不满足视图的要求,因此插入后是不可见的。

五、视图的作用

  • 简化用户操作

  • 使不同的用户能看见同一张表的不同信息,方便权限管理

  • 对重构数据库提供了一定程度的逻辑独立性

    如果对于某个表进行重构,只需要重新建立一个视图即可。

    此时虽然数据库的逻辑结构发生改变,但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。

  • 视图能够对机密数据提供安全保护啊

  • 适当使用视图能够更清晰地表达查询

参考

  • 数据库系统概论