视图的特点
虚表,是从一个或几个基本表(或视图)导出的表
只存放视图的定义,不会出现数据冗余
基表中的数据发生变化,从视图中查询出的数据也随之改变
建立视图
语句格式
CREATE VIEW
<视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
[例1] 建立信息系学生的视图。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS';
删除视图
DROP VIEW <视图名>
该语句从数据字典中删除指定的视图定义
由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删除
删除基表时,由该基表导出的所有视图定义都必须显式删除
[例9] 删除视图IS_S1
DROP VIEW IS_S1;
查询视图
从用户角度:查询视图与查询基本表相同
[例1] 在信息系学生的视图中找出年龄小于20岁的学生。
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
IS_Student视图的定义 (视图定义例1):
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS‘;
更新视图
用户角度:更新视图与更新基本表相同
[例1] 将信息系学生视图IS_Student中学号95002
的学生姓名改为“刘辰”。
UPDATE IS_Student
SET Sname= '刘辰'
WHERE Sno= '95002';
转换后的语句:
UPDATE Student
SET Sname= '刘辰'
WHERE Sno= '95002' AND Sdept= 'IS';
实际系统对视图更新的限制
允许对行列子集视图进行更新
对其他类型视图的更新不同系统有不同限制
DB2对视图更新的限制:
(1) 若视图是由两个以上基本表导出的,则此视图不允许更新。
(2) 若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作。
(3) 若视图的字段来自集函数,则此视图不允许更新。
(4) 若视图定义中含有GROUP BY子句,则此视图不允许更新。
(5) 若视图定义中含有DISTINCT短语,则此视图不允许更新。
(6) 若视图定义中有嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。
(7) 一个不允许更新的视图上定义的视图也不允许更新