《数据库系统概论》 -- 3.2. 视图

概念

         视图是从一个或几个基本表(或视图)导出的表

         视图是一个虚表

         数据库只存放视图的定义,不存放视图对应的数据

         视图一经定义,就可以被查询,删除,但是更新操作有一定限制

定义视图

         格式         CREATE VIEW <视图名> [(<列名>[,<列名>...])]

                            AS <子查询>

                            [WITH CHECK OPTION];

         说明         子查询可以是任意的SELECT语句,是否可以包含ORDER BY子句和DISTINCT短语,取决于具体系统;

                            视图的定义可以基于另一个视图

                            后加WITH CHECK OPTION短语约束视图进行更新、插入、删除数据时,仍应该要满足子查询中的条件

         注意         列名要么全部指定,要么全不指定,不指定时,使用子查询中列名

                            出现下面情况,必须指定:

                                     某个目标列为聚集函数或列表达式

                                     多表连接时,有同名列

                                     需要为某个列命名

         分类         行列子集视图:一个视图是从某单个基本表导出的,只是去掉了某些行,则该视图称为行列子集视图

                            带表达式的视图:一个视图中的某属性是基本表的某属性经过算术/逻辑/比较运算得到的,则该视图称为带表达式的视图

                            分组视图:带有聚集函数和GROUP BY子句的查询来定义视图

         举例         建立信息系学生的视图

                                     CREATE VIEW IS_Student

                                     AS

                                     SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS';

                            建立信息系学生的视图,并约束在进行修改和插入操作时,该视图只有信息系学生(行列子集视图

                                     CREATE VIEW IS_Student_View

                                     AS

                                     SELECT Sno,Sname,Sage FROM Student Where Sdept='IS'

                                     WITH CHECK OPTION;

                            建立信息系选修了1好课程的学生的视图(包括学号,姓名,成绩)

                                     CRETAE VIEW IS_S1 (Sno,Sname,Grade)

                                     AS

                                     SELECT SC.Sno,Sname,Grade

                                     FROM Student,SC

                                     WHERE Student.Sno=SC.Sno AND Sdept='IS' 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,2017-Sage

                                     FROM Student;

                            将学生的学号和平均成绩定义为一个视图(分组视图

                                     CREATE VIEW S_G(Sno,Gavg)

                                     AS

                                     SELECT Sno,AVG(Grade)

                                     FROM SC

                                     GROUP BY Sno;

                            将Student表中的所有女生定义为一个视图

                                     CREATE VIEW G_Student

                                     AS

                                     SELECT *

                                     FROM Student

                                     WHERE Ssex='女';

删除视图

         格式         DROP VIEW <视图名> [CASCADE];

         说明         视图删除后,视图定义将会从数据字典中删除

                            如果在该视图的基础上还导出了其他视图,则使用CASCADE级联删除即可,否则拒绝执行

         举例         DROP VIEW BT_S;  /*成功执行*/

                            DROP VIEW IS_S1;  /*拒绝执行*/

                            DROP VIEW IS_SI CASCADE;  /*成功执行,同时删除IS_S2*/

查询视图

         概念         视图消解:在执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图是否存在,如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换为对基本表的查询,在后在执行修正后的查询

         注意         WHERE子句中聚集函数是不能做条件表达式的,但是大多数RDBS对查询都有优化,都可以进行正确转换

更新视图

         概念         更新视图,是指通过视图来插入、删除、修改

         注意         视图是不存储实际数据的虚表,所以对视图的更新会经过视图消解最终转换为对基本表的更新

                            并不是所有视图都可以更新,比如平均成绩视图

                            各个RDBMS的视图更新操作需参考各RDBMS的具体实现

         举例         将信息系学生试图IS_Student中学号为201215122的学生姓名改为刘辰--视图之UPDATE

                                     UPDATE IS_Student

                                     SET Sname='刘辰'

                                     WHERE Sno='201215122';

                            向信息系学生视图IS_Student中插入一个新的学生记录('201215129','赵新',20)--视图之INSERT

                                     INSERT INTO IS_Student

                                     VALUES ('201215129','赵新',20);

                            删除信息系学生视图IS_Student中的学号为201215129的学生记录--视图之DELETE

                                     DELETE FROM IS_Student

                                     WHERE Sno='201215129';

视图的作用

         简化用户操作

         以多种角度看待同一数据

         对重构数据库(对数据库进行新增基本表,或修改基本表)提供了一定的逻辑独立性(不影响用户的应用程序)

         对机密数据提供安全保护(如全校所有学生的信息都在一个表里,但是给每个学院创建各自的视图,则每个学员只能看到自己学院的数据)

         适当利用视图,查询语句更清晰

posted @ 2017-09-04 07:16  yc紫日  阅读(946)  评论(0编辑  收藏  举报