资源描述:
《数据库原理与应用教程 教学课件 第5章 视图.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、数据库原理与应用教程(第4版)国家“十一五”规划教材第5章视图5.1视图概念5.2定义视图5.3通过视图查询数据5.4修改和删除视图5.5视图的作用5.1视图概念视图:由基本表构成的虚表(满足用户需求的表结构)5.2定义视图CREATEVIEW<视图名>[(视图列名表)]AS查询语句说明:查询中通常不含ORDERBY和DISTINCT语句。缺省时视图列名与查询列名相同。查询的源表可以是已定义的视图。说明下列三种情况下不能省略视图列名:某个目标列是聚集函数或表达式列;多表连接查询时,在查询列表中有同名列;希望用新的更合适的列名。视图的列名序列或者全部省略,或者全部指定。定义单源表视图视
2、图取自一个基本表的部分行、列,视图行列与基本表行列对应,一般可看可改。示例例1.建立信息系学生的视图。CREATEVIEWIS_StudentASSELECTSno,Sname,SageFROMStudentWHERESdept=’信息’定义多源表视图子查询源表多于一个,一般可看不可改。示例例2.建立查询信息系选了C01课程的学生的视图,列出学号,姓名和年龄。CREATEVIEWV_IS_S1(Sno,Sname,Grade)ASSELECTStudent.Sno,Sname,SageFROMStudent,SCWHERESdept=‘信息系’ANDStudent.Sno=SC.Sn
3、oANDSC.Cno=‘C01’在已有视图上定义新视图视图的数据源可以来自其它的视图。示例例3.利用例2建立的视图,建立信息系选了C01课程且成绩在90分以上的学生的视图。CREATEVIEWV_IS_S2(Sno,Sname,Grade)ASSELECTStudent.Sno,Sname,SageFROMV_IS_S1WHEREGrade>=90示例例4.利用例1所建的视图,建立查询信息系VB考试成绩大于等于80分的学生的姓名和成绩的视图。CREATEVIEWV_IS_VBASSELECTSname,GradeFROMIS_StudentVJOINSCONV.Sno=SC.SnoJ
4、OINCourseCONC.Cno=SC.CnoWHERECname='VB'ANDGrade>=80定义带表达式的视图定义基本表时,为减少数据冗余,表中只存放基本数据。由基本数据经过各种计算派生出的数据一般不存储。由于视图中的数据并不实际存储,因此,可以在在视图中设置一些附加列来保存这些派生的数据。由于这些附加列在基本表中并不实际存在,因此称这些列为虚拟列。称包含虚拟列的视图为带表达式的视图。示例例5.定义一个查询学生学号、姓名和出生年份的视图。CREATEVIEWV_BirthYear(Sno,Sname,BirthYear)ASSELECTSno,Sname,2010-Sage
5、FROMStudent含分组统计信息的视图子查询中含GROUPBY子句,视图行列由基本表行列得到,数据只看不可改。示例例6.定义一个查询每个学生的学号及考试平均成绩的视图。CREATEVIEWS_G(Sno,AvgGrade)ASSELECTSno,AVG(Grade)FROMSCGROUPBYSno5.3通过视图查询数据视图定义好后,可以对其进行查询,通过视图查询数据同基本表一样。示例例7.利用5.2节例1建立的视图,查询信息系年龄小于等于20岁的学生。SELECTSno,Sname,SageFROMIS_StudentWHERESage<=20转换成相关基本表的等价查询SELEC
6、TSno,Sname,SageFROMStudentWHERESdept='信息系'ANDSage<=20示例例8.查询信息系选修了“C01”的学生学号、姓名和年龄。SELECTSno,Sname,SageFROMIS_StudentJOINSCONIS.Student.Sno=SC.SnoWHERECno='C01'示例例9.查询信息系学生的学号、姓名、所选课程的课程名。SELECTv.Sno,Sname,CnameFROMIS_StudentvJOINSCONv.Sno=SC.SnoJOINCourseCONC.Cno=SC.Cno转换成相关基本表的等价查询SELECTS.Sno
7、,Sname,CnameFROMStudentSJOINSCONS.Sno=SC.SnoJOINCourseCONC.Cno=SC.CnoWHERESdept='信息系'示例例10.利用5.2节例6建立的视图,查询考试平均成绩80分以上的学生的学号和平均成绩。SELECT*FROMS_GWHEREAvgGrade>80不能直接转换为:SELECTSno,AVG(Grade)FROMSCWHEREAVG(Grade)>80GROUPBYSno而应该转换为:S