视图

虚拟视图:由其它关系上的查询所定义的一种关系。
不存储在数据库中,但可对其进行查询。视图可以被物化,即它们从数据库中定期地进行构造并存储
物化视图可以加速查询的执行。
索引:一种非常重要的物化视图类型,被存储在数据库中的数据结构,可以加速对存储的关系中特定元组的访问


视图的定义
create view paramountMovies AS
                select title,year
                from movies
                where studioName='paramount'

视图查询

把视图当初一个真正被存储的表一样查询
查询时可同时使用视图与基本表


属性重命名
create view movieProd(movieTitle,prodName) AS
            select title,name
            from movies,movieExec
            where producerC#=cert#

视图更新

多数视图不能更新,因为它并不实际存在
对于一些充分简单的视图,称为可更新视图,可以把对视图的更新转变成一个等价的对基本表的更新,更新结果最终作用在基本表上
另外也可以用替换触发器将视图上的更新转变为基本表上的更新,以此来强制更新任何视图


视图删除

drop view paramountMovies
删视图不会影响基本表
删基本表视图也会不可用


可更新视图

视图是由单个关系R(R本身也可以是一个可更新视图)选取出(select而非select distinct )的一些属性组成
select要满足以下要求
1.where中的子查询不能使用R
2.from中只能包含R
3.select语句中的属性列表必须包括足够多的属性,以保证对该视图进行元组插入时,能用null或默认值来填充其它不属于该视图的属性

插入
create view paramountMovies AS
                select title,year
                from movies
                where studioName='paramount'

考虑这个视图
insert into paramountMovies values('star trek',1979)
这个插入相当于
insert into movies(title,year) values('star trek',1979)
新插入的元组studioName为null,不满足视图的筛选条件,所以这条元组并不会插入到视图里,这样不合常理
改进是向定义视图的select语句中加入studioName属性

create view paramountMovies AS
                select studioName,title,year
                from movies
                where studioName='paramount'

insert into paramountMovies values('paramount','star trek',1979)

删除与修改

写等价语句时为保证删除(修改)的只是在视图中能看到的元组,要把视图定义时的where条件添加到删除(修改)时的条件中
其实是修改基本关系中的相应元组引起对视图的修改
delete from paramountMovies where title like '%trek%'
等价于
delete from movies where title like '%trek%' and studioName='paramount'

update paramountMovies set year=1979 where title='star trek'
等价于
update movies set year=1979 where title='star trek' and studioName='paramount'


替换触发器
create trigger paramountInsert
instead of insert on paramountMovies
referencing new row as newRow
for each row
insert into movies(title,year,studioName)
values(newRow.title,newRow.year,'paramount')

向视图中的插入操作将被替换为向基本表中的插入

你可能感兴趣的:(视图)