视图
一.视图的特点
(1)是虚表,是从一个或几个基本表(或视图)导出的表;
(2)只存放视图的定义,不存放视图对应的数据;
(3)基表中的数据发生变化,从视图中查询出的数据也随之改变。
二.定义视图
1.建立视图
CREATE VIEW <视图名> [(<列名> [,<列名>]…)] AS <子查询> [WITH CHECK OPTION];
(1)WITH CHECK OPTION
对视图进行UPDATE、INSERT、DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式);
(2)子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则决定具体系统的实现。
(3)组成视图的属性列名:全部省略或全部指定。
①全部省略:
由子查询中SELECT目标列中的诸字段组成。
②明确指定视图的所有列名:
a.某个目标列是聚集函数或列表达式;
b.多表连接时选出了几个同名列作为视图的字段;
c.需要在视图中为某个列启用新的更合适的名字。
(4)关系数据库管理系统执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。
(5)在对视图查询时,按视图的定义从基本表中将数据查出。
(6)例子
①建立信息系学生的视图:
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';
②建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生:
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS'
WITH CHECK OPTION;
定义IS_Student视图时加上了WITH CHECK OPTION子句,对该视图进行插入、修改和删除操作时,RDBMS会自动加上Sdept=‘IS’的条件。
(7)若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,我们称这类视图为行列子集视图。
IS_Student视图就是一个行列子集视图。
(8)基于多个基表的视图
例子:建立信息系选修了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';
(9)基于视图的视图
例子:建立信息系选修1号课程且成绩在90分以上的学生的视图:
CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade>=90;
(10)带表达式的视图
例子:定义一个反映学生出生年份的视图:
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2022-Sage
FROM Student;
(11)分组视图
例子:将学生的学号及平均成绩定义为一个视图:
CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno; //这行代码,求得是每个Sno的平均值;没有则是Sno是第一个同学的序号,Gavg是所有同学成绩的平均值
2.删除视图
DROP VIEW <视图名> [CASCADE];
(1)该语句从数据字典中删除指定的视图定义;
(2)如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除;
(3)删除基表时,由该基表导出的所有视图定义都必须显示地使用DROP VIEW语句删除。
(4)例子:删除视图BT_S和IS_S1:
DROP VIEW BT_S; //成功执行
DROP VIEW IS_S1; //拒绝执行
要删除IS_S1,需要使用级联删除:
DROP VIEW IS_S1 CASCADE;
三.查询视图
(1)用户角度:查询视图与查询基本表相同;
(2)关系数据库管理系统视图查询的方法;
视图消解法(View Resolution)
a.进行有效性检查;
b.转换成等价的对基本表的查询;
c.执行修正后的查询。
(3)例子:
①在信息系学生的视图中找出年龄小于20岁的学生:
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
视图消解转换后的查询语句为:
SELECT Sno,Sage
FROM Student
WHERE Sdept='IS' AND Sage<20;
(4)视图消解法的局限
有些情况下,视图消解法不能生成正确的查询。
四.更新视图
由于视图是虚表,不存储数据,所以对视图的更新,最终都要转换为对基本表的更新,即本质上基本表更新变动了。
1.插入
例子:向信息系学生视图IS_S中插入一个新的学生记录,其中学号为“201215129”,姓名为“赵信”,年龄为20岁:
INSERT INTO IS_Student
VALUES('201215129','赵信',20);
转换后语句:
INSERT INTO Student(Sno,Sname,Sage,Sdept)
VALUES('201215129','赵信',20,'IS');
2.删除
例子:删除信息系学生视图IS_Student中学号为‘201215129’的记录:
DELETE FROM IS_Student
WHERE Sno='201215129';
转换后语句:
DELETE FROM Student
WHERE Sno='201215129' AND Sdept='IS';
3.修改
例子:将信息系学生视图IS_Student中学号“201215122”的学生姓名改为“刘晨”:
UPDATE IS_Student
SET Sname='刘晨'
WHERE Sno='201215122';
转换后语句:
UPDATE Student
SET Sname='刘晨'
WHERE Sno='201215122' AND Sdept='IS';
(1) 更新视图的限制:
一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新。
(2)目前,各个关系数据库管理系统一般允许对行列子集视图进行更新;对其他类型视图的更新不同系统有不同限制。
(3)DB2对视图更新的限制:
a.若视图是由两个以上基本表导出的,则此视图不允许更新;
b.若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作;
c.若视图的字段来自聚集函数,则此视图不允许更新;
d.若视图定义中含有GROUP BY子句,则此视图不允许更新;
e.若视图定义中含有DISTINCT短语,则此视图不允许更新;
f.一个不允许更新的视图上定义的视图也不允许更新。
g.若视图定义中有嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。
例子:将SC中成绩在平均成绩之上的元组定义成一个视图:
CREATE VIEW GOOD_SC
AS
SELECT Sno,Cno,Grade
FROM SC
WHERE Grade>(SELECT AVG(Grade) FROM SC);
/*
导出的视图GOOD_SC的基本表是SC,内层查询涉及的表也是SC,内层查询涉及的表也是SC,所以视图GOOD_SC是不允许更新。
*/
五.视图的作用
1.视图能简化用户的操作
当视图中数据不是直接来自基本表时,定义视图能简化用户的操作。
a.基于多张表连接形成的视图;
b.基于复杂嵌套查询的视图;
c.含导出属性的视图。
2.视图使用户能以多种角度看待同一数据
视图机制能使不同用户以不同方式看待同一数据,适应数据库共享的需要。
3.视图对重构数据库提供了一定程度的逻辑独立性
视图只能在一定程度上提供数据的逻辑独立性
由于对视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因基本表结构的改变而改变。
4.视图能够对机密数据提供安全保护
对不同用户定义不同视图,使每个用户只能看到他有权看到的数据。
5.适当的利用视图可以更清晰的表达查询
经常需要执行这样的查询“对每个同学找出他获得最高成绩的课程号”。可先定义一个视图,求出每个同学获得的最高成绩,然后再进行查询。