1、第4章 视图管理,SQL Server 2000应用,主要内容:,理解视图的概念 了解视图与查询的区别 掌握视图的创建方法 掌握视图的修改、重命名和删除 重点和难点: 视图的创建与管理,4.1 设计数据库视图,视图实际上是保存在数据库中的 SELECT 查询,它是从一个或多个基本表中导出的逻辑虚表,它没有自已独立的数据实体。因此,可对查询执行的大多数操作也可在视图上执行。视图与查询的主要区别 视图可以更新表的内容并把更新结果送回到源表中,而查询不行。 视图是数据库设计的一部分,但查询不是。,4.1.1 创建视图,一、使用视图设计器创建视图 1. 启动视图设计器的方法 展开指定“数据库”的视图节
2、点。 单击右键,在快捷菜单中选择“新建视图”。 2. 视图设计器的组成关系图窗格、网格窗格、SQL 窗格、结果窗格,二、使用SQL命令创建视图,语法格式:CREATE VIEW . ( 属性列名 ,.n ) WITH ENCRYPTION | SCHEMABINDING | VIEW_METADATA ,.n AS WITH CHECK OPTION ,说明:,当视图中的列是从算术表达式、函数或常量派生的,需定义属性列的列名;缺省属性列名时,将获得与SELECT语句中的列相同的名称。 WITH ENCRYPTION:定义加密视图。 WITH CHECK OPTION:强制修改视图上的所有数据时
3、,数据都必须符合定义视图时所使用的各种条件。 对视图定义中的SELECT语句除非同时包含TOP子句,否则不能包含ORDER BY子句。 定义视图后,视图的名称存储在sysobjects表中,视图定义的列信息添加到syscolumns表中。,三、示例,设学生选课库中有三个数据表: S (sno,sname,sex,birthday,sdepartment,tel) C (cno,cname,teacher,pcno) SC (sno,cno,grade) 以下各例均建立在“学生选课”数据库中。 例4.1 将学生选课数据库中”计算机系”的sno,sname, cname,grade数据,建立视图s
4、tudent_view。 方法1:使用视图设计器创建视图 方法2:使用SQL命令方式创建视图,USE 学生选课IF EXISTS (SELECT * FROM sysobjects WHERE name = student_view)DROP VIEW student_viewGO CREATE VIEW student_view (sno,sname,cname, grade) - 属性列可省略AS SELECT s.sno,sname, cname, gradeFROM s,sc,cWHERE s.sno=sc.sno AND o=oand sdepartment=计算机系GO,例4.2
5、在学生选课数据库中,建立 age_view 加密 视图,显示学生姓名和年龄,年龄要求大于20岁。CREATE VIEW age_view(sname, age)WITH ENCRYPTIONAS SELECT sname,year(getdate()-year(birthday) FROM sWHERE year(getdate()-year(birthday)20,例4.5 在学生选课数据库中,建立计算机系学生的 视图cs_view。CREATE VIEW cs_viewAS SELECT * FROM sWHERE sdepartment=计算机系 WITH CHECK OPTION 注意
6、: 执行UPDATE cs_view SET sdepartment=会计修改命令错误。,4.1.2 撤消视图,方法1:使用SQL命令 格式:DROP VIEW 方法2:使用企业管理器 功能:删除指定的一个或多个视图。 例4.4 删除学生选课数据库中的student_view视图。DROP VIEW student_view,4.1.3 重命名视图,方法1:使用企业管理器 操作步骤: 展开需修改视图所属的“数据库”节点中的“视图”节点。 右击指定的视图,在快捷菜单中选择“重命名”命令。 输入视图的新名称。 确认新名称。 方法2: 使用SQL命令 格式:SP_RENAME ,,4.2 数据库视图
7、管理,4.2.1 视图查询 视图定义后,就可以像查询基本表那样对视图进行查询。 例4.5 在视图age_view中找出年龄小于29的学生信息。SELECT * FROM age_viewWHERE age 20 and year(getdate()-year(birthday)29,4.2.2 视图更新,一、视图更新规则 1. 如果视图是从多个基本表使用连接操作导出的,则不允许更新。 2. 如果导出的视图使用了分组和聚合操作,包含TOP和DISTINCT子句,也不允许更新。 3. 如果视图的属性来自表达式或常数,则不允许执行INSERT或UPDATE操作,但可执行DELETE操作。 4. 如果
8、视图定义中有嵌套查询,并且嵌套查询的FROM子句涉及导出该视图的基本表,则不允许对视图更新。,二、修改数据 例4.6 在视图cs_view上,将学生陈小红的电话改 为“12-3456”,出生日期改为“1980-4-12”。UPDATE cs_viewSET tel=12-3456 ,birthday=1980-4-12 WHERE sname=陈小红 等价于:UPDATE SSET tel=12-3456 ,birthday=1980-4-12WHERE sname=陈小红,三、插入数据,例4.7 向视图cs_view插入一条记录,内容如下: (J0406,王乔石,男,1997-07-07,计
9、算机系,23-4567)脚本:INSERT INTO cs_viewVALUES(J0406,王乔石,男,1997-07-07,计算机系, 23-4567)GOSELECT * FROM S,四、删除数据,可以通过视图删除基本表的数据。但必须注意, 对于依赖于多个基本表的视图,不能使用通过视图 删除数据。 例4.15 通过视图cs_view,删除学号J0406的学生记录。DELETE FROM cs_view WHERE sno=J0406GOSELECT * FROM S,4.2.3 更改视图定义,一、通过SQL命令ALTER VIEW更改视图ALTER VIEW . ( 属性列名 ,.n ) WITH ENCRYPTION | SCHEMABINDING | VIEW_METADATA AS WITH CHECK OPTION 二、在企业管理器中更改视图,例4.9 修改cs_view视图,使它包含全部计算机系 的学生姓名和学号。 脚本: ALTER VIEW cs_viewAS SELECT sname,sno FROM sWHERE sdepartment=计算机系 WITH CHECK OPTION,