第三章 关系数据库标准语言SQL

第一节 第二节 第三节 第四节

第四节 视 图    (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),进行有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出
视图的定义。把视图定义中的子查询与用户的查询结合起来,转换成等价的对基本表的查询,执行修正后的
查询。

吉林大学网络教育学院 版权所有