视图的特点
1. 虚表,是从一个或几个基本表(或视图)导出的表
2. 只存放视图的定义,不会出现数据冗余
3. 基表中的数据发生变化,从视图中查询出的数据也随之改变
基于视图的操作
1. 查询
2. 删除
3. 受限更新
定义基于该视图的新视图
l 建立视图
CREATE VIEW <视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[ WITH CHECK OPTION ];
但是对于以下3种情况,必须明确指定视图的属性列名字:
1)某个目标列是集函数或列表达式
2)多表连接时选出了几个同名属性列作为视图的属性字段
3)需要在视图中为某个列启用新的更合适的名字
<子查询>:可以是任意的Select语句,但是不能含有Order By字句和Distinct短语。
l WITH CHECK OPTION:表示对视图进行修改、插入和删除操作时,必须保证所要修改、插入和删除的行满足子查询中的“条件表达式”。
u [例] 建立信息系学生的视CREATE VIEW IS_Student
AS 图。
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS';
u [例] 建立信息系学生的视图,并要求透过该视图进行的更新操作只涉及信息系学生。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS'
WITH CHECK OPTION;
基于多个基表的视图
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'
基于视图的视图[例] 建立信息系选修了1号课程且成绩在90分以上的学生的视图
CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade>=90
带表达式的视图
[例] 定义一个反映学生出生年份的视图。
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2004-Sage
FROM Student
注意:带表达式的视图必须明确定义组成视图的各个属性列名
建立分组视图
CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
注意:假设SC表中“成绩”列Grade为数字型
删除视图
DROP VIEW <视图名>;
查询视图DBMS实现视图查询的方法:视图消解法
l [例] 在信息系学生的视图(IS_Student)中找出年龄小于20岁的学生学号和年龄。
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
IS_Student 视图的定义 :
CREATE VIEW IS_Student
AS SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS';
转换后的查询语句为:
SELECT Sno,Sage
FROM Student
WHERE Sdept= 'IS' AND Sage<20
视图消解法的局限
1、有些情况下,视图消解法不能生成正确查询。采用视图消解法的DBMS会限制这类查询。
[例]在S_G视图中查询平均成绩在90分以上 的学生学号和平均成绩。
l S_G视图定义:
CREATE VIEW S_G (Sno,Gavg)
AS SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
l 查询语句如下:
SELECT *
FROM S_G
WHERE Gavg>=90
l 把该查询语句和视图定义中的子查询结合起来,形成最终的查询语句如下:
错误: 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;
更新视图
1. 就是通过视图来插入(Insert)、删除(Delete)和修改(Update) 基本表中的数据,对视图的更新,最终要转换为对基本表的更新
2. 为了防止更新不属于该视图范围的数据,可以在定义视图时加上 With Check Option子句
l 修改视图语句格式:
Update < 视图名>
Set < 要更新的列名=更新后的值 >
Where < 条件表达式>
l 插入视图语句格式:
Insert
Into < 视图名> (属性名1, 属性名2, …)
Values (属性1值, 属性2值, …)
l 删除视图语句格式:
Delete
From < 视图名>
Where < 条件表达式>
u 修改实例
[例] 将信息系学生视图IS_Student中学号95002 的学生姓名改为“刘辰”。
UPDATE IS_Student
SET Sname= '刘辰'
WHERE Sno= '95002';
转换后的语句:
UPDATE Student
SET Sname= '刘辰'
WHERE Sno= '95002' AND Sdept= 'IS';
u 插入实例
[例] 向信息系学生视图IS_Student中插入一个新的学生记录:95029,赵新,20岁。
INSERT
INTO IS_Student
VALUES (‘95029’,‘赵新’,20);
转换为对基本表的更新:
INSERT
INTO Student(Sno,Sname,Sage,Sdept)
VALUES(‘95029’,‘赵新’,20,‘IS’ );
u 删除实例
[例] 删除信息系学生视图 IS_Student中学号为95029的记录。
DELETE
FROM IS_Student
WHERE Sno= '95029';
转换为对基本表的删除:
DELETE
FROM Student
WHERE Sno= '95029' AND Sdept= 'IS';
实际系统对视图更新的限制
2. 允许对行列子集视图进行更新
3. 对其他类型视图的更新不同系统有不同限制
DB2 对视图更新的限制:
(1) 若视图是由两个以上基本表导出的,则此视图不允许更新。
(2) 若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作。
(3) 若视图的字段来自集函数,则此视图不允许更新
(4) 若视图定义中含有GROUPBY子句,则此视图不允许更新。
(5) 若视图定义中含有DISTINCT短语,则此视图不允许更新。
(6) 若视图定义中有嵌套查询,且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。
(7) 一个不允许更新的视图上定义的视图也不允许更新
视图的作用
1. 视图能够简化 用户的操作
2. 视图使用户能以多种角度看待同一数据
3. 视图对重构数据库 提供了一定程度的逻辑独立性
4. 视图能够对机密数据提供安全保护