关系数据库标准语言续
第1页,共40页,编辑于2022年,星期五
*
视图:从一个或几个基本表(或视图)导出的表。
一、建立视图的优点
1、简化用户的操作
2、灵活
3、提供一定程度的逻辑独立性
Student(stdnum,name,sex,age,dept) AS
SELECT * FROM S WHERE sex=‘女’;
这里视图F_Student是由子查询“SELECT *"建立的。由于该视图一旦建立后,S表就构成了视图定义的一部分,如果以后修改了基本表S的结构,则S表与F_Student视图的映像关系受到破坏,因而该视图就不能正确工作了。为避免出现这类问题,可以采用下列两种方法:
第12页,共40页,编辑于2022年,星期五
*
建立视图时明确指明属性列名,而不是简单地用SELECT *。即:CREATE VIEW F_Student(stdnum,name,sex,age,dept) AS
SELECT Sno, Sname, sex, age, dept FROM S WHERE Ssex=‘女’;
在修改基本表之后删除原来的视图,然后重建视图。这是最保险的方法。
第13页,共40页,编辑于2022年,星期五
*
2、删除视图
语句的格式为:DROP VIEW <视图名>;一个视图被删除后,由此视图导出的其他视图也将失效,用户应该使用DROP VIEW语句将他们一一删除。
第14页,共40页,编辑于2022年,星期五
*
例8删除视图IS_S1
DROP VIEW IS_S1;
执行此语句后,IS_S1视图的定义将从数据字典中删除。由IS_S1视图导出的IS_S2视图的定义虽仍在数据字典中,但该视图已无法使用了,因此应该同时删除。
第15页,共40页,编辑于2022年,星期五
*
三、查询视图
DBMS执行对视图的查询时,首先进行有效性检查,检查查询涉及的表、视图等是否在数据库中存在,如果存在,则从数据字典中取出查询涉及的视图的定义,把定义中的子查询和用户对视图的查询结合起来,转换成对基本表的查询,然后再执行这个经过修正的查询。
将对视图的查询转换为对基本表的查询的过程称为视图的消解(View Resolution)。
第16页,共40页,编辑于2022年,星期五
*
例1在信息系学生的视图中找出年龄小于20岁的学生
SELECT Sno, age FROM IS_Student WHERE age<20;
DBMS执行此查询时,将其与IS_Student视图定义中的子查询 SELECT Sno, Sname, age FROM S WHERE dept="IS" ; 结合起来,转换成对基本表S的查询,修正后的查询语句为
第17页,共40页,编辑于2022年,星期五
*
SELECT Sno, Sage FROM Student WHERE Sdept="IS" AND Sage<20;
第18页,共40页,编辑于2022年,星期五
*
视图是定义在基本上的虚表,它可以和其他基本表一起使用,实现连接查询或嵌套查询。这也就是说,在关系数据库的三级模式结构中,外模式不仅包括视图,而且还可以包括一些基本表。
第19页,共40页,编辑于2022年,星期五
*
例2查询信息系选修了1号课程的学生
SELECT Sno, Sname FROM IS_Student, SC WHERE = AND =‘1’; 本查询涉及虚表IS_Student和基本表SC,通过这两个表的连接来完成用户请求。
第20页,共40页,编辑于2022年,星期五
*
在一般情况下,视图查询的转换是直截了当的。但有些情况下,这种转换不能直接进行,查询时就会出问题
在S_G视图中查询平均成绩在90分以上的学生学号和平均成绩
Select * from S_G where gavg>=90
S_G的定义为
Select sno,avg(grade) from s_c group by sno
该转换后得到:
第21页,共40页,编辑于2022年,星期五
*
该查询转换后得到
SELECT SNO,AVG(GRADE)
FROM S_C
WHERE AVG(GRADE)>=90
这是错误的!!!
正确的查询应该是
SELECT SNO,AVG(GRADE)
FROM S_C
GROUP BY SNO
HAVING
关系数据库标准语言续 来自淘豆网m.daumloan.com转载请标明出处.