3.5 视图
? ?视图的特点 ??????虚表,是从一个或几个基本表(或视图)导出的表 ??????只存放视图的定义,不存放视图对应的数据 ??????基本表的数据发生变化,从视图中查询出的数据也随之改变
3.5.1 定义视图 3.5.2 查询视图 3.5.3 更新视图 3.5.4 视图的作用
1. 建立视图
? ?语句格式
create view
<视图名> [(列名 [,<列名> ] ...)]
as <子查询>
[with check option]
? ?with check option ??????对视图进行update,insert和delete操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式) ? ?子查询可以是任意的select语句,是否可以含有order by子句和distinct短语,则决定具体系统的实现 ? ?组成视图的属性列名:全部省略或全部指定 ??????全部省略: ????????●?由子查询中select目标列中的诸字段组成 ??????明确指定视图的所有列名: ????????●?某个目标列是聚集函数或表达式 ????????●?多表达式连接时选出了几个同名列作为视图的字段 ????????●?需要在视图中为某个列启用新的更合适的名字 ? ?关系数据库管理系统执行create view语句时只是把视图定义存入数据字典,并不执行其中的select语句 ? ?在对视图查询时,按视图的定义从基本表中将数据查出 [例 3.1] 建立信息系学生的视图
create voew IS_Student
as
select Sno,Sname.Sage
from Student
where Sdept = 'IS';
[例 3.2] 建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生
create voew IS_Student
as
select Sno,Sname.Sage
from Student
where Sdept = 'IS';
with check option
? ?定义IS_Student视图是加上with check option子句对该视图进行插入、修改和删除操作时,RDBMS会自动加上Sdept='IS’的条件 ? ?若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和列,单保留了主码,我们成这类视图为行列子集视图 ??????IS_Student视图就是一个行列子集视图 ? ?基于多个表的视图 [例 3.3] 建立信息系选修了1号课程的学生的视图(包括学号、姓名、成绩)
create view IS_S1(Sno, Sname, Grade)
as
select Student.Sno, Sname, SC.Grade
from Student, SC
where Sdept='IS' and
Student.Sno = SC.Sno and
SC.Cno='1';
? ?基于视图的视图 [例 3.4] 建立信息系选修了1号课程切成绩在90分以上的学生的视图
create view IS_S2
as
select Sno, Sname, Grade
from IS_S1
where Grade >= 90
? ?代表达式的视图 [例 3.5] 定义一个反应学生出生年份的视图
create view BT_S(Sno, Sname, Sbirth)
as
select Sno, Sname, 2021-Sage
from Student
? ?分组视图 [例 3.6] 将学生的学号及平均成绩定义为一个视图
create view S_G(Sno, Gavg)
as
select Sno, AVG(Grade)
from SC
group by Sno;
[例 3.7] 将Student表中所有女生记录定义为一个视图
create view F_Student(F_Sno, name, sex, age, dept)
as
select *
from Student
where Ssex='女';
缺点:修改基本表Student的结构后,Student表与F_Student视图的映像关系被破坏,导致该视图不能正确工作。
2. 删除视图
? ?语句格式 drop view <视图名> [CASCADE] ??????该语句从数据字典中删除指定的视图定义 ??????如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该图和由它导出的所有视图一起删除 ??????删除基表时,由该基表导出的所有视图定义都必须显式地使用drop view语句删除 [例 3.8] 删除视图BT_S和IS_S1
drop view BT_S;
drop view IS_S1;
要删除IS_S1,需要使用级联删除drop view IS_S1 CASCADE
3.5.1 定义视图 3.5.2 查询视图 3.5.3 更新视图 3.5.4 视图的作用
? ?用户角度:查询视图与查询基本表相同 ? ?关系数据库管理系统实现视图查询的方法 ??????视图消解法(View Resolution) ????????●?进行有效性检查 ????????●?转换成等价的对基本表的查询 ????????●?执行修正后的查询 [例 3.9] 在信息系学生的视图中找出年龄小于20岁的学生。
select Sno, Sage
from IS_Student
where Sage < 20;
视图消解转换后的查询语句为:
select Sno, Sage
from Student
where Sdept = 'IS' and Sage < 20;
[例 3.10] 查询选修了1号课程的信息系学生
select IS_Student.Sno, Sname
from IS_Student,SC
where IS_Student.Sno=SC.Sno and SC.Cno='1';
? ?视图消解法的局限 ??????有些情况下,视图消解法不能生成正确的查询 [例 3.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
where AVG(Grade) >= 90;
[例 3.12] 也可以用如下的SQL语句完成
select *
from (select Sno, AVG(Grade) from SC group by Sno)
as S_G(Sno, Gavg)
where Gavg >= 90;
3.5.1 定义视图 3.5.2 查询视图 3.5.3 更新视图 3.5.4 视图的作用
[例 3.13] 将信息系学生视图IS_Student中学号为“201815122”的学生姓名改为“刘辰”
update IS_Student
set Sname = '刘辰'
where Sno = '201815122';
转换后的语句为:
update Student
set Sname = '刘辰'
where Sno = '201815122' and Sdept = 'IS';
[例 3.14] 向信息系学生视图IS_Student中插入一个新的学生记录,其学号为“201815129”,姓名为“赵新”,年龄为20岁
insert into IS_Student
values('201815129', '赵新', 20);
转换为对基本表的更新:
insert into Student(Sno, Sname, Sage, Sdept)
values('201815129', '赵新', 20, 'IS');
[例 3.15] 删除信息系学生视图IS_Student中学号为“201815129”的记录
delete from IS_Student
where Sno = '201815129'
转换为对基本表的更新:
insert into Student
where Sno = '201815129' and Sdept='IS';
? ?更新视图的限制:一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新 [例] [例 3.11]中定义的视图S_G为不可更新视图
update S_G
set Gavg = 90
where Sno = '201815121'
这个对视图的更新无法抓换成对基本表SC的更新 ? ?允许对行列子集视图进行更新 ? ?对其他类型视图的更新不同系统有不同限制 ? ?DB2对视图更新的限制: ??????若视图是由两个以上的基本表导出的,则此视图不允许更新 ??????若视图的字段来自字段表达式(或常数),则不允许对此视图执行insert和update操作,但是允许执行delete操作 ??????若视图的字段来自集函数,则此视图不允许更新 ??????若视图中含有group by子句,则视图不允许更新 ??????若视图定义中含有distinct短语,则此视图不允许更新 ??????若视图定义中有嵌套查询,并且内层查询的from子句涉及的表也是导出该视图的基本表,则此视图不允许更新 注:一个不允许更新的视图上定义的视图也不允许更新 例:将SC中成绩在平均成绩纸上的元组定义成一个视图
create view GOOD_SC
as select Sno, Cno, Grade
from SC
where Grade > (select AVG(Grade) from SC);
3.5.1 定义视图 3.5.2 查询视图 3.5.3 更新视图 3.5.4 视图的作用
? ?视图能够简化用户的操作 当时图中数据不是直接来自基本表时,定义视图能够简化用户的操作 ??????基于多张表连接形成的视图 ??????基于复杂的嵌套查询的视图 ??????含有导出属性的视图 ? ?视图使用户能以多种角度看待同一数据 ??????视图机制能够使不同用户以不同方式看待同一数据,适应数据库共享的需要 ? ?视图对重构数据库提供了一定程度的逻辑独立性 ??????数据库重构 例:学会关系 Student(Sno, Sname, Ssex, Sage, Sdept) “处置”地分成两个基本表: SX(Sno, Sname, Sage) SY(Sno, Ssex, Sdept) ??????视图只能在一定程度上提供数据的逻辑独立性 ????????●?由于对视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因基本表结构的改变而改变 ? ?视图能够对机密数据提供安全保护 ??????对于不同用户定义不同视图,使每个用户只能看到他有权看到的数据 ? ?适当的利用视图可以更清晰的表达查询 ??????经常需要一致性这样的查询“对每个同学找出他获得最高成绩的课程号”。可以先定义一个视图,求出每个同学获得的最高成绩
create view VMGRADE
as
select Sno, MAX(Grade) Mgrade
from SC
group by Sno;
上一篇:3.4 数据更新 目????录:《数据库系统概论》 下一篇:
|