3.6 视 图
视频二维码(扫码观看)
视图的特点
◆虚表,是从一个或几个基本表(或视图)导出的表。
◆只存放视图的定义,不存放视图对应的数据。
◆基表中的数据发生变化,从视图中查询出的数据也随之改变。
基于视图的操作
◆查询
◆删除
◆受限更新
◆定义基于该视图的新视图
3.6.1 定义视图
一、建立视图
◆语句格式
CREATE VIEW<视图名> [(<列名> [,<列名>]…)] AS <子查询> [WITH CHECK OPTION];
◆组成视图的属性列名:全部省略或全部指定
◆子查询不允许含有ORDER BY子句和DISTINCT短语
◆RDBMS执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。
◆在对视图查询时,按视图的定义从基本表中将数据查出。
【例1】建立信息系学生的视图。
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept=‘IS’;
【例2】建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生。
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept=‘IS’ WITH CHECK OPTION;
对IS_Student视图的更新操作:
◆修改操作:自动加上Sdept=‘IS’的条件
◆删除操作:自动加上Sdept=‘IS’的条件
◆插入操作:自动检查Sdept属性值是否为‘IS’,如果不是,则拒绝该插入操作,如果没有提供Sdept属性值,则自动定义Sdept为‘IS’。
◆基于多个基表的视图
【例3】建立信息系选修了1号课程的学生视图。
◆基于视图的视图
【例4】建立信息系选修了1号课程且成绩在90分以上的学生的视图。
CREATE VIEW IS_S2 AS SELECT Sno,Sname,Grade FROM IS_S1 WHERE Grade>=90;
◆带表达式的视图
【例5】定义一个反映学生出生年份的视图。
CREATE VIEW BT_S(Sno,Sname,Sbirth) AS SELECT Sno,Sname,2000-Sage FROM Student;
◆分组视图
【例6】将学生的学号及他的平均成绩定义为一个视图。
假设SC表中“成绩”列Grade为数字型
CREAT VIEW S_G(Sno,Gavg) AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;
◆不指定属性列
【例7】将Student表中所有女生记录定义为一个视图。
CREATE VIEW F_Student(F_Sno,name,sex,age,dept) AS SELECT * FROM Student WHERE Ssex=‘女’;
◆缺点:
修改基表Student的结构后,Student表与F_Student视图的映象关系被破坏,导致该视图不能正确工作。
二、删除视图
◆语句的格式:
DROP VIEW <视图名>;
·该语句从数据字典中删除指定的视图定义
·如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
·删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除
【例8】
删除视图BT_S:DROP VIEW BT_S;
删除视图IS_S1:DROP VIEW IS_S1;
·拒绝执行
·级联删除:DROP VIEW IS_S1 CASCADE;
3.6.2 查询视图
◆用户角度:查询视图与查询基本表相同
◆RDBMS实现视图查询的方法
·视图消解法(View Resolution)
(1)进行有效性检查
(2)转换成等价的对基本表的查询
(3)执行修正后的查询
【例9】在信息系学生的视图中找出年龄小于20岁的学生。
SELECT Sno,Sage FROM IS_Student WHERE Sage<20;
IS_Student视图的定义(参见视图定义【例5】)
视图消解转换后的查询语句为:
SELECT Sno,Sage FROM Student WHERE Sdept=‘IS’AND Sage<20;
【例10】查询选修了1号课程的信息系学生。
SELECT IS_Student.Sno,Sname FROM IS_Student,SC WHERE IS_Student.Sno=SC.Sno AND SC.Cno=‘1’;
◆视图消解法的局限
有些情况下,视图消解法不能生成正确查询。
【例11】在S_G视图中查询平均成绩在90分以上的学生学号和平均成绩。
SELECT * FROM S_G WHERE Gavg>=90;
◆S_G视图的子查询定义
CREATE VIEW S_G(Sno,Gavg) AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;
查询转换
◆错误:
SELECT Sno,AVG(Grade) FROM SC WHERE AVG(Grade)>=90 GROUP BY Sno;
◆正确:
SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade)>=90;
3.6.3 更新视图
【例12】将信息系学生视图IS_Student中学号200215122的学生姓名改为“刘辰”。
UPDATE IS_Student SET Sname=‘刘辰’ WHERE Sno=‘200215122’;
◆转换后的语句:
UPDATE Student SET Sname=‘刘辰’ WHERE Sno=‘200215122’ AND Sdept=‘IS’;
【例13】向信息系学生视图IS_S中插入一个新的学生记录:200215129,赵新,20岁。
INSERT INTO IS_Student VALUES(‘95029’,‘赵新’,20);
◆转换为对基本表的更新:
INSERT INTO Student(Sno,Sname,Sage,Sdept) VALUES(‘200215129’,‘赵新’,20,‘IS’);
【例14】删除信息系学生视图IS_Student中学号为200215129的记录
DELETE FROM IS_Student WHERE Sno=‘200215129’;
◆转换为对基本表的更新:
DELETE FROM Student WHERE Sno=‘200215129’ AND Sdept=‘IS’;
◆更新视图的限制:一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新。
【例15】视图S_G为不可更新视图。
UPDATE S_G SET Gavg=90 WHERE Sno=‘200215121’;
这个对视图的更新无法转换成对基本表SC的更新
◆允许对行列子集视图进行更新
◆对其他类型视图的更新不同系统有不同限制
3.6.4 视图的作用
1视图能够简化用户的操作
2视图使用户能以多种角度看待同一数据
3视图对重构数据库提供了一定程度的逻辑独立性
4视图能够对机密数据提供安全保护
5适当的利用视图可以更清晰的表达查询