视图
什么是视图呢?
首先,视图是一个虚表,所谓虚表,是从一个或几个基本表(或者视图)导出的表,它只存放视图的定义,而不存放视图对应的数据。当基表中的数据发生变化,从视图中查出的数据也随之改变。
也就是说,视图本质上是一个查询语句。数据库保存的不是查询的结果,而是查询本省。
基于视图的操作有四种:查询、删除、受限更新、定义基于视图的新视图。
视图的作用
- 视图能简化用户的操作;
- 视图使用户能以多种角度看待同一数据;
- 视图对重构数据库提供了一种程度的逻辑独立性
- 视图能够对机密数据提供安全保护;
- 适当的利用视图可以更清晰的表达查询。
定义视图
语法格式为:
create view 视图名(列名,……)
as 子查询
with check option;
列名可以省略,表示全部选择。但是,有三种情况不能省略:
- 子查询的某个目标列不是单纯的属性名,是集函数或表达式。
- 多表连接是选出了几个同名列作为视图的字段
- 需要在视图中为某个列启用新的更合适的名字。
with check option表示对视图进行update、insert、delete时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)
注意:
- 子查询不允许含有order by 子句和distinct短语。
- RDBMS执行 create view语句时只是把视图定义存入数据字典,并不执行其中的select语句。
- 在对视图查询时,按视图的定义从基本表中将数据查出。
/* 信息系学生视图 */
create view IS_Student1 as
select Sno,Sname,Sage,Sdept from Student where Sdept = 'IS'
with check option;
/* 基于多个表的视图 */
create view IS_S1(Sno,Sname,Grade) as
select Student.Sno,Sname,Grade from Student,SC where
Sdept = 'IS' and Student.Sno = SC.Sno and SC.Cno = '1';
/* 基于视图的视图 */
create view IS_S2 as
select Sno,Sname,Grade from IS_S1 where Grade >= 90;
删除视图
语法格式:
drop view 视图名;
drop view 视图名 cascade;/* 如果该视图导出了其他视图,会一并删除 */
查询视图
查询视图和查询基本表的操作相同
但是DBMS执行的过程不同(视图消解),DBMS会首先进行有效性检查,检查查询的表、视图等是否存在,然后转换成等价的对基本表的查询,最后执行修正后的查询。
视图更新
视图更新操作包括插入(insert)、修改(update)和删除(delete)数据。语法格式和基本表的更新操作一样。
由于视图是一张虚表,所以对视图的更新,最终实际上是转换成基本表的更新,所以并不是所有的视图都是可以更新的。以下视图不能进行更新:
- 从多个基本表通过连接操作导出的视图,不允许更新;
- 对使用了分组、集函数操作的视图,不允许 进行更新操作;