《用实例学习SQL》第七篇:视图的建立和使用

相关表:表
(一)、视图的定义:
视图是从一个或者几个基本表中导出来的一个虚表,和基本表不同在于,视图定义的表并不实际存在。

CREATE VIEW view_name [(field1, field2,...)]
AS <子查询>
[WITH CHECK OPTION]

以上是定义视图的语句,其中子查询可以是任意的子查询用于在基本表中提取数据组成视图表。
从定义我们可以看出,视图表并不存在。在SQL中,数据库存储的是视图定义的语句,也就是说,每次使用视图,都是一次视图语句的执行结果。等会详细讲。

现在我们来说一下定义语句:
①是否一定要给出视图的所有field,不一定。
但是要求,要么给出子查询中所有的结果field,要么一个field都不给出,直接使用子查询中的field。但是,如果子查询的结果中有表达式代表的field时,这时在定义视图时就一定要给出所有的field;
实例如下:

create view view_table(Sno, Birthday)
as
select Sno, 2018-Sage
from Student
# 我们看到子查询中有一个field是表达式“2018-Sage”,这时就要给出视图表的field的名称。
create view view_table
as 
select Sno, Sage
from Student
# 这次子查询的结果中没有表达式,只有基本表中的列属性,这时我们可以不给出field

我建议建立视图时都给出field,你负责取名字就好了,又不用管field的类型(按顺序自动对号入座),可以说很简单。

②对于子查询是否有限制,大体上来说没有限制,你可以使用任何符合语法规则的select语句建立视图表
③with check option语句:是限制语句。
视图表虽然是一个虚表,但也是一个表,也可以进行更新操作,如update,insert,delete等,如果添件了with check option语句时,这些更新操作要符合子查询的条件(子查询中的where子句的条件)。
如:

create view IS_Student
as
select Sno, Sname, Sage
from Student
where Sdept = 'IS'
with check option

如果我们想对IS_Student进行更新操作,RDMS会自动加上Sdept = ‘IS’条件。

(二)视图的一些说明:
①当用create view语句创建视图时,系统在执行这个语句时,只是将视图的定义存放在数据库中,其中的子查询并不会真正进行,只有当使用这个视图的时候才会真正执行所有的视图语句
②由于视图实际上是一些语句,所以当形成视图的基本表变化时,视图也是变化的(所以当基本表变化时,最好删除该视图(drop view view_name [cascade]),从新定义)
③视图不仅可以建立在一个或多个基本表中,还可以建立在一个或者多个已经定义好的多个视图上。

(三)、视图消解:
所谓的视图消解,是指在含有视图的查询和更新中,RMDS首先会将视图转化成相等的对基本表的查询,然后再去执行后面的查询。当然这是一个内部的过程。

(四)、视图与临时表:
基于视图和基于临时表的查询是有区别的,视图一旦定义就永久存储在数据库中(除非你显示的用drop语句删除),需要就去用即可;而临时表只是在该语句执行过程中存在,一旦语句执行完毕,临时表即消除。

(五)、视图的作用:
①视图能够简化用户的操作
②视图使用户能从多个角度看待同一个数据
③视图对重构数据库提供了一定程度的逻辑独立性
④视图能够对机密数据提供安全保护
⑤适当利用视图能完成比较复杂的查询,用清晰的方式。

你可能感兴趣的:(《用实例学习SQL》系列)