(2.5.1)--2.4视图数据管理.pdf
视 图视图定义视图定义 格式CREATE VIEW(列名,)AS WITH CHECK OPTION;在定义视图时要么指定全部视图列,要么全部省略不写;如果省略了视图的属性列名,则视图的列名与子查询列名相同。子查询中通常不包含ORDER BY和DISTINCT子句。虚拟列:经过各种计算派生出的数据所设置的派生属性列。以下情况需指定列名:某个目标列是集函数或表达式多表连接时,目标列中出现同名列不用原基本表的列名作为视图名视图的分类 行列子集视图 从单个基本表导出,保留基本表的码,但去掉其它的某些列和部分行的视图。表达式视图带虚拟列的视图。分组视图子查询目标表带有组函数或子查询带有GROUP BY子句的视图。行列子集视图的定义例:建立计算机系学生视图CREATE VIEW CS_SAS(SELECT Sno,Sname,Sgend,SageFROM SWHERE Sdept=CS)WITH CHECK OPTION;附加了WITH CHECK OPTION 子句后,对该视图进行插入、修改和删除操作时,DBMS会自动加上Sdept=CS的条件。行列子集视图的定义例:建立计算机系选修计算机体系结构课程的学生视图CREATE VIEW CS_SCA(Sno,NAME,GR)AS SELECT S.Sno,Sname,GradeFROM S,SC,CWHERE S.Sno=SC.SnoAND C.Cno=SC.CnoAND S.Sdept=CSAND Cname=计算机体系结构;表达式视图的定义例:建立学生出生年份的视图CREATE VIEW BT_S(SNO,NAME,BIRTH)AS SELECT Sno,Sname,2022-SageFROM S;虚拟列视图的优点简化用户的操作同一数据多种用法提供数据的逻辑独立性提供数据的安全保护功能适当利用视图可以清晰地表达查询视图查询视图查询例:求计算机系年龄小于20的学生。SELECT Sno,SnameFROM CS_SWHERE Sage20;视图消解:SELECT Sno,SnameFROM SWHERE Sdept=CS AND Sage=90;CREATE VIEW S_AVG_G(SNO,AVG_G)AS SELECT Sno,AVG(ALL Grade)FROM SCGROUP BY Sno;视图消解:SELECT Sno,AVG(ALL Grade)FROM SCWHERE AVG(ALL Grade)=90 GROUP BY Sno;视图查询例:在学生平均成绩视图S_AVG_G中查询平均成绩在90分以上的学生号及成绩SELECT*FROM S_AVG_GWHERE AVG_G=90;正确的转换结果:SELECT Sno,AVG(ALL GR)FROM SCGROUP BY SnoHAVING AVG(ALL GR)=90;CREATE VIEW S_AVG_G(SNO,AVG_G)AS SELECT Sno,AVG(ALL Grade)FROM SCGROUP BY Sno;视图更新视图更新例:将SC_S视图的刘晨的年龄改为20UPDATE CS_SSET Sage=20WHERE Sname=刘晨;转换后:UPDATE S SET Sage=20WHERE Sname=刘晨AND Sdept=CS;CREATE VIEW CS_SAS (SELECT Sno,Sname,Sgend,Sage,SdeptFROM SWHERE Sdept=CS)WITH CHECK OPTION;视图更新例:在CS_S中插入S075,吴迪,女,19的学生记录INSERT INTO CS_SVALUES(S075,吴迪,女,19);CREATE VIEW CS_SAS (SELECT Sno,Sname,Sgend,Sage,SdeptFROM SWHERE Sdept=CS)WITH CHECK OPTION;转换后:INSERT INTO S(Sno,Sname,Sgend,Sage,Sdept)VALUSE(S075,吴迪,女,19,CS);视图更新例:删除CS_S中年龄大于23的学生DELETE FROM CS_SWHERE Sage23;转换后:DELETE FROM SWHERE Sage23 AND Sdept=CS;CREATE VIEW CS_SAS (SELECT Sno,Sname,Sgend,Sage,SdeptFROM SWHERE Sdept=CS)WITH CHECK OPTION;视图更新例:修改S075学生平均成绩为90UPDATE S_AVG_GSET AVG_G=90WHERE SNO=S075;CREATE VIEW S_AVG_G(SNO,AVG_G)AS SELECT Sno,AVG(ALL Grade)FROM SCGROUP BY Sno;视图更新 可更新的视图 一般情况下,行列子集视图是可更新的,所以各RDBMS只允许对行列子集视图进行更新。不可更新的视图(各系统不太一致)由多个表导出的视图,不可更新 视图的列来自表达式或常数,不可插、改、可删 视图列是来自集函数,不可更新 视图定义中含有GROUP BY子句,不可更新 视图定义中内层嵌套的表与查询目标是同一个表,不可更新 在不允许更新的视图上定义的视图,不可更新