第四节 视 图 (1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)
基于多个基表的视图
[例4] 建立信息系选修了1号课程的学生视图。
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';
基于视图的视图
[例5] 建立信息系选修了1号课程且成绩在90分以上的学生的视图。
CREATE VIEW IS_S2
AS SELECT Sno,Sname,Grade FROM IS_S1
WHERE Grade>=90;
带表达式的视图
[例6] 定义一个反映学生出生年份的视图。
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS SELECT Sno,Sname,2000-Sage
FROM Student
设置一些派生属性列, 也称为虚拟列--Sbirth,带表达式的视图必须明确定义组成视图的各个属性列名,
建立分组视图。
[例7] 将学生的学号及他的平均成绩定义为一个视图。
假设SC表中“成绩”列Grade为数字型
CREAT VIEW S_G(Sno,Gavg)
AS SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
一类不易扩充的视图,以 SELECT * 方式创建的视图可扩充性差,应尽可能避免。
[例8] 将Student表中所有女生记录定义为一个视图。
CREATE VIEW F_Student1(stdnum, name, sex, age, dept)
AS SELECT * FROM Student WHERE Ssex = '女';
缺点:修改基表Student的结构后,Student表与F_Student1视图的映象关系被破坏,导致该视图不能正
确工作。
CREATE VIEW F_Student2 (stdnum, name, sex, age, dept)
AS SELECT Sno, Sname, Ssex, Sage, Sdept
FROM Student WHERE Ssex='女';
为基表Student增加属性列不会破坏Student表与F_Student2视图的映象关系。
2. 删除视图
DROP VIEW <视图名>;
该语句从数据字典中删除指定的视图定义。由该视图导出的其他视图定义仍在数据字典中,但已不能使
用,必须显式删除。删除基表时,由该基表导出的所有视图定义都必须显式删除。
[例9] 删除视图IS_S1
DROP VIEW IS_S1;
3.5.2 查询视图
从用户角度:查询视图与查询基本表相同,DBMS实现视图查询的方法。
实体化视图(View Materialization)有效性检查:检查所查询的视图是否存在,执行视图定义,将视图临
时实体化,生成临时表。查询视图转换为查询临时表。查询完毕删除被实体化的视图(临时表)。视图消解法
(View Resolution),进行有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出
视图的定义。把视图定义中的子查询与用户的查询结合起来,转换成等价的对基本表的查询,执行修正后的
查询。
|