SQL 视图
视图是一个虚表,在数据库中只存放视图的定义,而不存放视图中对应的数据。
一、建立视图
1.一般格式
1 |
|
2.列名
列名只能全部省略或全部指定,如果子查询中出现了同名列或未命名的列,则必须全部指定。
3.with check option
表示在对视图进行 update、insert 和 delect 操作时,会自动检查是否符合视图定义的条件。
4.几点说明
- create view 后,只是把视图的定义存入数据字典
- 每次查询视图时,按视图定义将数据查出
- 视图不仅可以建立在基本表上,同样可以建立在视图上
- 由于视图中的数据并不实际存储,因此可以定义一些派生属性列,而不用担心数据冗余的问题
二、删除视图
1.一般格式
1 |
|
注意:
仅是删除了视图的定义,并没有删除数据
2.cascade
增加了此关键字后,如果该视图上还导出了其它视图,则会一并删除。
三、查询视图
视图定义后,用户就可以像对基本表一样对视图进行查询。
首先进行有效性检查,检查查询中涉及的表、视图是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换为等价的对基本表的查询,然后执行。这一转换过程称为视图消解。
但定义视图并查询和基于派生表的查询是有区别的。视图一旦定义,将保存在数据字典中,之后的查询都直接引用该视图。而派生表只是在语句执行时临时定义,执行后该定义即被删除。
四、更新视图
1.视图更新的实质
更新视图是指通过视图来进行插入、删除、修改等操作,由于视图并不实际存储数据,因此视图的更新需要转化为对基本表的更新。
2.可更新的视图
- 子查询中, from 后面的数据库只有一个。即,视图仅从一个数据库中取得。
- 子查询中,select 后面只包含属性名,不包含表达式、聚集函数、distinct(去除重复)、group by、having。
- 任何没有出现在 select 中的属性值都可以取空值
3.对于视图之外的更新
若定义视图时没有加上 with check option ,则进行更新时不会检查是否符合视图定义的条件。因此,有可能进行符合基本表要求但不符合视图要求的更新。即更新在基本表处是奏效的,但在视图上是不可见的。
例如:
基本表对 salary 没有要求,视图筛选出基本表中 salary > 5000 的元组。
若没有加上 with check option ,此时插入一条 salary 为 3000 的元组。它满足基本表的要求,因此显然可以插入;但它不满足视图的要求,因此插入后是不可见的。
五、视图的作用
简化用户操作
使不同的用户能看见同一张表的不同信息,方便权限管理
对重构数据库提供了一定程度的逻辑独立性
如果对于某个表进行重构,只需要重新建立一个视图即可。
此时虽然数据库的逻辑结构发生改变,但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。
视图能够对机密数据提供安全保护啊
适当使用视图能够更清晰地表达查询
参考
- 数据库系统概论