由于视图中的数据不会实际存储,所以定义视图时可根据应用的需要,设置一些派生属性列或虚拟列,以便于查询和统计。
以 SELECT * 方式创建的视图可扩充性差,应尽可能避免 。
缺点:修改基表Student的结构后,Student表与F_Student视图的映象关系被破坏,导致该视图不能正确工作。
删除视图DROP VIEW <视图名>;
该语句从数据字典中删除指定的视图定义。如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除 。删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除。
例:删除视图BT_S:
DROP VIEW BT_S; 删除视图IS_S1:拒绝执行
级联删除:DROP VIEW IS_S1 CASCADE;
(2) 查询视图:查询视图与查询基本表相同,视图定义后,就可以像对待基本表一样对视图进行查询(SELECT)操作。
视图消解法(View Resolution)进行有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义 ;转换成等价的对基本表的查询,把视图定义中的子查询与用户的查询结合起来;执行修正后的查询。
例:在信息系学生的视图中找出年龄小于20岁的学生 SELECT Sno,Sage FROM IS_Student WHERE Sage<20; 视图消解转换后的查询语句为: SELECT Sno,Sage FROM Student
WHERE Sdept= 'IS' AND Sage<20;
例:在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; (3) 更新视图
DBMS实现视图更新的方法:转换为对基本表的更新。视图消解法(View Resolution)。 只有对成为“可更新”视图才能进行更新操作。 SQL2对“可更新”视图给出正式定义:从关系R选出某些属性(用select 而不是 select distinct)定义的视图,R本身可以是可更新的视图;Where中不能嵌套涉及R的子查询;Select必须包括足够多的属性,所有not null的属性必须包括。
对于视图元组的更新操作(INSERT、DELETE、UPDATA),有以下三条规则:
如果一个视图是从多个基本表使用联接操作导出的,那么不允许对这个视图执行更新操作。
17
如果在导出视图的过程中,使用了分组和聚集函数操作,也不允许对这个视图执行更新操作。 行列子集视图可以执行更新操作。
在SQL2中,允许更新的视图在定义时,必须加上“WITH CHECK OPTION”短语。DBMS在更新视图时会进行检查,防止用户通过视图对不属于视图范围内的基本表数据进行更新。
例:将信息系学生视图IS_Student中学号200215122的学生姓名改为“刘辰”。 UPDATE IS_Student SET Sname= '刘辰'
WHERE Sno= ' 200215122 '; 转换后的语句: UPDATE Student SET Sname= '刘辰'
WHERE Sno= ' 200215122 ' AND Sdept= 'IS';
例:向