第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤...

18
第8章 视图及游标 教学提示:视图是一个虚表,同真实的表一样,视图包含一系列带有名称的列和行数 据。但是,与基表相比,没有适当的限制,视图是不能用于修改操作的。 游标是新选择的表的代表人,通过指明游标来代表所选择出来的数据子集,然后才能对 一行或一部分行进行处理。 教学目标: 本章的主要学习目的是了解视图的基本概念以及 DDL DML 语句在视图 中的使用;掌握游标的定义、建立方法,学会使用游标对数据进行修改。 8.1 视图可以视为另一种形式的表,是从一个或多个表中使用 SELECT 语句导出的虚拟表。 那些用来导出视图的表称为基表。视图也是数据库的对象之一,如图 8.1 所示。 8.1 视图 在前面的章节里,基表都是用来描述 DDL DML 语句的,包含了存储在磁盘上的数 据。与此相反,在默认情况下视图被认为是在物理上不存在的,也就是说,视图的内容没 有被存储在磁盘上。视图通常是利用存储在系统目录中的信息,由一个或多个基表派生出 来的数据库对象,而这些信息是唯一会被物理存储的有关于视图的信息。因此,视图也被 称为虚拟表。 使用视图的原因有以下 3 点。 限制用户只能存取表内特定的列。 不用重新建表即可存取想要的数据。

Upload: others

Post on 24-Feb-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

第 8 章 视图及游标

教学提示:视图是一个虚表,同真实的表一样,视图包含一系列带有名称的列和行数

据。但是,与基表相比,没有适当的限制,视图是不能用于修改操作的。

游标是新选择的表的代表人,通过指明游标来代表所选择出来的数据子集,然后才能对

一行或一部分行进行处理。

教学目标:本章的主要学习目的是了解视图的基本概念以及 DDL和 DML语句在视图

中的使用;掌握游标的定义、建立方法,学会使用游标对数据进行修改。

8.1 视 图 概 述

视图可以视为另一种形式的表,是从一个或多个表中使用 SELECT语句导出的虚拟表。

那些用来导出视图的表称为基表。视图也是数据库的对象之一,如图 8.1所示。

图 8.1 视图

在前面的章节里,基表都是用来描述 DDL和 DML语句的,包含了存储在磁盘上的数

据。与此相反,在默认情况下视图被认为是在物理上不存在的,也就是说,视图的内容没

有被存储在磁盘上。视图通常是利用存储在系统目录中的信息,由一个或多个基表派生出

来的数据库对象,而这些信息是唯一会被物理存储的有关于视图的信息。因此,视图也被

称为虚拟表。

使用视图的原因有以下 3点。

① 限制用户只能存取表内特定的列。

② 不用重新建表即可存取想要的数据。

Page 2: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

SQL Server数据库设计与管理

·198·

·198·

③ 省略复杂的 SELECT 命令和表间的连接产生数据,直接使用视图即可得到相关的

数据。

8.2 创 建 视 图

要使用视图,首先必须创建视图。视图在数据库中是作为一个独立的对象存储的,必

须遵循以下原则。

① 只能在当前数据库中创建视图。但是,如果使用分布式查询定义视图,则新视图所

引用的表和视图可以存在于其他数据库中,甚至其他服务器上。

② 视图名称必须遵循标识符的规则,且对每个用户必须唯一。此外,该名称不得与该

用户拥有的任何表的名称相同。

③ 可以在其他视图和引用视图的过程之上建立视图。

④ 定义视图的查询不可以包含 ORDER BY、COMPUTE 或 COMPUTE BY 子句或

INTO关键字。

⑤ 不能在视图上定义全文索引定义。

⑥ 不能创建临时视图,也不能在临时表上创建视图。

⑦ 不能对视图执行全文查询,但是如果查询所引用的表支持全文索引,就可以在视图

定义中包含全文查询。

8.2.1 使用企业管理器创建视图

在企业管理器中,创建视图的操作步骤如下所述。

① 打开企业管理器,在相应的数据库文件夹下面,右击【视图】文件夹,然后选择【新

建视图】命令,打开【新建视图】对话框,如图 8.2所示。

图 8.2 新建视图菜单

② 在对话框第一栏中,右击鼠标,打开快捷菜单,如图 8.3所示,执行【添加表】命令。

③ 打开【添加表】对话框,在此对话框中,可以选择表、视图或者函数,然后单击【添

加】按钮,就可以将其添加到视图查询中。这里选择 Customers 和 Employees 两个系统实

例表,然后单击【添加】按钮,如图 8.4所示。

Page 3: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

第 8章 视图及游标

·199·

·199·

图 8.3 添加表

图 8.4 选择视图用表

注意:选择表的过程中,可以使用 Shift或 Ctrl键来选择多个表。 ④ 选择表、视图或函数后,单击【关闭】按钮,返回【新建视图】对话框。

⑤ 在第一栏中,可看到添加进来的 Customers和 Employees表;在第二栏中,可看到

在第一栏的复选框中所选择的对应表的列,这也是视图所用的列;在第三栏中,可看到系

统同时生成的 T-SQL语句,如图 8.5所示,当然也可以直接用 T-SQL语句生成视图。

图 8.5 选择视图需要的字段

⑥ 选择结束后,单击工具栏上的【保存】按钮,然后在弹出的对话框中输入视图的名称。

Page 4: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

SQL Server数据库设计与管理

·200·

·200·

8.2.2 使用 Transact -SQL 语句创建视图

可以使用 CREATE VIEW语句来创建视图。这个语句的通用格式为: CREATE VIEW view_name[(column_list)] [WITH {ENCRYPTION|SCHEMABINDING}]

AS select

[WITH CHECK OPTION]

注意:CREATE VIEW语句在批处理中必须是唯一的语句。 各参数的含义如下所述。

① view_name:所定义的视图的名称。Select 则定义了从一个或多个表中检索出行和

列的 SELECT语句。

② column_list:当前表中列的名称。如果忽略这一选项,将自动使用当前基表中的列

名称。

③ WITH ENCRYPTION:用以加密系统表 syscomments中的 SELECT语句。这个选

项可以用来加强 SQL Server系统的安全性能。

④ SCHEMABINDING子句将视图与下属表的大纲相互绑定。

注意:在视图中的 SELECT语句不能包含 ORDER BY、INTO或 COMPUTE子句。另外在

查询中不能引用临时表。

下面举例说明,利用第 3章创建的表建立视图。

【例 8.1】 使用企业管理器创建视图。

① 在企业管理器中将“工作关系表”添加到视图窗口中。

② 选择视图需要的列以及条件。

③ 单击工具栏中的 按钮生成视图,如图 8.6所示。

④ 单击工具栏中的 按钮将视图进行保存,视图名称为 v_Clerk。

图 8.6 使用企业管理器生成实例 v_Clerk

【例 8.2】 使用查询分析器创建视图 v_Clerk。

① 在查询分析器的代码栏内输入创建视图的 T-SQL语句: CREATE VIEW v_Clerk

Page 5: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

第 8章 视图及游标

·201·

·201·

AS SELECT 职员编号,项目编号,加入时间 FROM 工作关系表

WHERE工种='会计' ② 单击工具栏中的 按钮,执行 T-SQL语句,如图 8.7所示。

图 8.7 使用查询分析器生成实例 v_Clerk

注意:一般执行 Transact -SQL语句都是在查询分析器中输入代码并执行。 视图的使用方式与数据库中的任何基表一样,可以将从视图中进行的选择看做语句被

转换为对当前基表所做的等价操作。因此,下面的查询: SELECT 职员编号 FROM v_Clerk WHERE 项目编号= 'p002'

被转化成使用基表“工作关系表”的等价 SELECT语句为:

SELECT 职员编号 FROM 工作关系表 WHERE工种='会计' AND 项目编号= 'p002'

【例 8.3】 利用WITH CHECK OPTION限制插入语句。

CREATE VIEW v_2004

AS SELECT 职员编号,项目编号,加入时间 FROM 工作关系表

WHERE 加入时间 BETWEEN '2004.1.1' AND '2004.12.31'

WITH CHECK OPTION 本例创建条件约束,使得在插入记录时所有“加入时间”不在条件范围内的记录无法

插入,例如, INSERT INTO v_Clerk VALUES('e003','p002','2005.1.21')

视图中可以使用的列最多可达 1024 列。另外,在创建视图时,视图的名称存储在

sysobjects表中,有关视图中所定义的列的信息添加到 syscolumns表中,而有关视图相关性

的信息添加到 sysdepends表中。CREATE VIEW语句的文本添加到 syscomments表中。

8.3 视图的使用

可以通过视图查询所需要的数据,也可以通过视图修改基表中的数据。

8.3.1 使用视图进行数据查询

如同例 8.2,获取在 2004.1.23 加入项目的会计信息,可以直接从视图中获取,这样比

从基表中获取数据要简单,使用如下的 T-SQL语句来实现: SELECT 职员编号,项目编号 FROM v_Clerk

Where 加入时间='2004.1.23'

执行结果如图 8.8所示。

Page 6: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

SQL Server数据库设计与管理

·202·

·202·

图 8.8 通过视图查询数据

同样,可以使用企业管理器来实现,步骤如下所述。

① 打开企业管理器,展开相应的数据库文件夹。

② 选择视图对象,找到要查询的视图,选择【返回所有行】命令,如图 8.9所示。

图 8.9 通过企业管理器查询视图

8.3.2 对视图进行数据修改

修改视图的数据,其实就是对基表进行修改,真正插入数据的地方是基表,而不是视

图,同样使用 INSERT、UPDATE、DELETE 语句来完成。但是在对视图进行修改的时候

也要注意一些事项,如下所述。

① 通常有可能插入并不满足视图查询的 WHERE 子句条件中的一行。选项 WITH

CHECK OPTION就是用来限制只插入满足查询条件的行。

② 不能在一个语句中对多个基表使用数据修改语句。

③ 如果要删除数据,则在视图定义的 FROM子句中只能列出一个表。

【例 8.4】 在 test数据库中创建一个部门所在地在山东的视图,并利用此视图向基表中插

入记录。

使用如下 T-SQL语句在查询分析器中实现: USE test

GO

CREATE VIEW V_department

AS

SELECT 部门编号, 部门名称 FROM 部门信息表 WHERE 部门所在地='山东'

/*通过视图 V_department插入一条记录*/

Page 7: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

第 8章 视图及游标

·203·

·203·

INSERT INTO V_department VALUES('d003','爱立信',NULL)

/*查看插入的记录*/

SELECT * FROM department

注意:在向视图插入数据的时候,视图中有几列则在插入的 VALUES后面跟几列。 如果视图包含下列几种特征,则对从属表中的信息更新将不能实现。

① 视图定义中的 FROM子句包含两个或更多的表,并且列是来自多个表的列。

② 视图的列是从一个聚集函数中派生出来的。

③ 视图中的 SELECT语句包含 GROUP BY子句或者 DINSTINCT选项。

④ 视图的列是从一个常量或表达示中派生出来的。

8.4 修 改 视 图

在基表发生变化后,最好对依附于它的视图进行修改。修改的方法有两种,可以删除

原有的视图,然后重新创建一个;也可以在原有的情况下更改视图。

8.4.1 修改视图

1. 使用企业管理器

使用企业管理器修改视图的操作步骤如下所述。

① 打开企业管理器,展开相应数据库文件夹。

② 在右边的视图信息窗体内,右击要修改的视图,然后选择【设计视图】命令,如

图 8.10所示。打开的对话框可用来修改视图的定义。

图 8.10 使用企业管理器修改视图

③ 如果要向视图中再添加表,则可以在窗格中右击鼠标,然后选择【添加表】命令。

同样,如果要删除表,则选择【删除】命令。

④ 可以通过双击视图名称,查看视图创建属性,如图 8.11所示。

Page 8: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

SQL Server数据库设计与管理

·204·

·204·

图 8.11 查看属性—v_Clerk

⑤ 如果要修改其他属性,则在中间的网格窗格的某一列上,右击鼠标,然后选择【属

性】命令,弹出【属性】对话框。可根据需要选中相关项,对视图进行属性设置,如图 8.12

所示。

图 8.12 更改列的属性

2. 使用 ALTER VIEW语句

使用 ALTER VIEW语句的语法格式为: ALTER VIEW [<database_name>][<owner>.]view_name[(column[,…n])]

[WITH<view_attribute>[,…n]]

AS

Select_statement

[WITH CHECK OPTION]

<view_attribute>

{ENCRYPTION|SCHEMABINDING|VIEW_METADATA}

Page 9: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

第 8章 视图及游标

·205·

·205·

注意:语句中的参数与 CREATE VIEW语句中的参数相同。

【例 8.5】 修改例 8.4创建的视图,部门所在地全部定为“上海”。

在查询分析器中输入的相关 T-SQL语句为: ALTER VIEW V_department

AS

SELECT 部门编号, 部门名称 FROM 部门信息表 WHERE 部门所在地='上海'

8.4.2 视图重命名

在为视图重命名时,首先必须拥有重命名本视图的权限,其次要命名的视图必须在当

前数据库中存在。

① 可以在企业管理器中,像修改资源管理器中的文件夹名一样,只要在要重命名的视

图上,右击鼠标,选择【重命名】命令即可,如图 8.13所示。

图 8.13 使用企业管理器重命名

② 可以使用 T-SQL语句来重命名视图,语法格式为: sp_rename ‘视图当前名称’,‘视图的新名称’‘要重命名的数据类型’

8.4.3 删除视图

在不需要该视图的时候或想清除视图定义及与之相关联的权限时,可以删除该视图。

视图的删除不会影响所依附的基表的数据,定义在系统表 sysobjects、syscolumns、

syscomments、sysdepends和 sysprotects中的视图信息也会被删除。

1. 使用企业管理器

删除视图的操作和删除表的操作类似,操作步骤如下所述。

① 打开企业管理器,展开相应的数据库文件夹,单击【视图】文件夹。

② 在右边的视图信息窗体中,右击视图,然后选择【删除】命令,点击【除去对象】

对话框,如图 8.14所示。

Page 10: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

SQL Server数据库设计与管理

·206·

·206·

图 8.14 删除视图对话框

③ 单击【全部除去】按钮即可删除视图。

2. 使用 T-SQL

DROP VIEW语句可从当前数据库中删除一个或多个视图,语法格式为: DROP VIEW ‘视图名称’

8.5 游 标

游标(Cursor)类似一个指针,指向数据子集,服务器提供命令让用户对该数据子集进行

处理。游标可以方便对关系数据库中产生的整个行集操作。

8.5.1 游标的概念

游标必须通过声明后才能使用,游标主要由以下几部分组成。

① 游标的名称。

② 数据来源(表和列)。

③ 选取条件。

④ 游标属性。

游标具有以下特点。

① 游标的数据来源于数据库表,当游标的基表内容变动时游标的内容也会跟着变动。

但如果指定属性为 INSENSITIVE选项,将无法更新游标的基表。

② 游标可以从结果集的当前位置检索一行或多行,可以对结果集中当前位置的行进行

数据修改。

③ 游标提供脚本、存储过程和触发器中使用的访问结果集中的数据 T-SQL语句。

8.5.2 游标的使用

游标的使用不同于其他对象的建立,其过程如图 8.15所示。

Page 11: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

第 8章 视图及游标

·207·

·207·

使用 DECLARE CURSOR 声明

使用 OPEN 打开游标

使用 FETCH INTO 提取数

使用 CLOSE 关闭游标

使用 DEALLOCATE 释放游标

图 8.15 游标的使用过程

1.游标的声明

其语法格式为: DECLARE 游标名称 [INSENSITIVE] [SCROLL] CURSOR

FOR SELECT

[FOR {READ ONLY|UPDATE [OF 列清单]}] 各参数说明如下所述。

① INSENSITIVE:设置此属性,游标对此数据进行提取操作时返回的数据不反映对基

表的操作,该游标不允许修改。

② SCROLL:常用在数据的浏览上,对所有的提取项都可以使用,如 FIRST、LAST、

PRIOR 等。

③ READ ONLY:设置该游标只能读,不能修改。因此在 UPDATE或 DELETE语句

的WHERE CURRENT OF子句中不能引用游标。

④ UPDATE:设置游标内可以更新的列。

2.打开游标

其语法格式为: OPEN {{GLOBAL}游标名称}|游标变量}

如果 GLOBAL选项被指定,则该游标适用于所有的存储过程、触发器,此类型的游标

只有在用户结束时才会被解除。

3.从打开的游标中提取行

其语法格式为: FETCH [[ NEXT | PRIOR | FIRST | LAST | ABSOLUTE | RELATIVE

{ 数值 | 数值变量}]FROM] 游标名称

[ INTO 变量 1[,…n]]

Page 12: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

SQL Server数据库设计与管理

·208·

·208·

各参数说明如下所述。

① NEXT:如果 FETCH NEXT 是对游标的第一次提取操作,则读取结果集中的第一

行,否则读取当前所在数据行的下一行。当游标已经指向数据集的最后一行时,再执行

FETCH NEXT命令,则@FETCH_STATUS函数值会变为-1。

② PRIOR:读取当前所在数据行的前一行。如果游标当前位置指向第一行数据,执行

此命令,则@FETCH_STATUS函数值会变为-1。

③ FIRST:读取游标的第一行数据。

④ LAST:读取游标的最后一行数据。

⑤ ABSOLUTE{ n |@nvar}:读取游标的第 n行数据。如果 n或@nvar为正数,返回从

游标头开始的第 n 行并将返回的行变成新的当前行;如果为负数,则返回游标尾之前的 n

行并将返回的行变成新的当前行;如果为 0,则没有变化。n 整型常量,@nvar为 smallint、

tinyint或 int。

⑥ RELATIVE{n| @nvar}:如果 n或@nvar为正数,则读取游标当前所在行的后 n行

数据;如果为负数则读取游标当前行往前第 n行数据;如果为 0,无变化。n必须为整型常

量且@nvar必须为 smallint、tinyint或 int。

4.关闭游标

其语法格式为: CLOSE {{[GLOBAL]游标名称}|游标变量}

5.释放游标

其语法格式为: DEALLOCATE{{[GLOBAL]游标名称}|游标变量}

@@FETCH_STATUS函数用来提示 FETCH语句的状态,其取值及含义见表 8-1。

表 8-1 @@FETCH_STATUS 函数的取值及其含义

取值 含义

0

-1

-2

FETCH读取成功

FETCH读取失败或超出读取范围

读取行不存在

8.5.3 游标示例

【例 8.6】 声明游标,利用游标对“职员信息表”进行检索。 DECLARE employee_cursor CURSOR FOR SELECT * FROM 职员信息表 /*声明游标*/ OPEN employee_cursor /*打开游标*/ FETCH NEXT FROM employee_cursor /*提取第一行数据*/ FETCH LAST FROM employee_cursor /*提取最后一行数据*/ FETCH FIRST FROM employee_cursor

/*提取第一行数据*/

Page 13: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

第 8章 视图及游标

·209·

·209·

FETCH ABSOLUTE 3 FROM employee_cursor

/*提取第三行数据*/

FETCH RELATIVE 5 FROM employee_cursor

/*提取当前行开始的后 5行数据*/

【例 8.7】 使用游标打印“部门信息表”表格。 USE test

GO

PRINT’ **********部门信息表*********’

PRINT’ ’

PRINT’————————————————————————’

PRINT’|部门编号| 部门名称 |部门所在地|’

/*打印表标题*/

DECLARE @deptno char(15),@deptname char(25),@location char(30)

/*声明变量*/ DECLARE department_cursor CURSOR FOR SELECT 部门编号,部门名称,部门所在地 FROM 部门信息表 /*声明游标*/ OPEN department_cursor /*打开游标*/ FETCH NEXT FROM department_cursor INTO @deptno,@deptname,@location /*提取第一行数据并赋给变量*/ WHILE @@FETCH_STATUS=0 BEGIN PRINT’|’+@deptno+’|’+@deptname+’|’+@location+’|’ PRINT’——————————————————————’ /*打印数据*/ FETCH NEXT FROM department_cursor INTO @deptno,@deptname,@location END /*提取下一行数据*/ CLOSE department_cursor DEALLOCATE department_cursor /*关闭和释放游标*/

【例 8.8】 利用游标修改项目信息表中预定资金数额。 DECLARE budget_cursor CURSOR

FOR SELECT * FROM 项目信息表

FOR UPDATE OF 预定资金

/*声明游标*/

OPEN budget_cursor

FETCH NEXT FROM budget_cursor

UPDATE 项目信息表

SET 预定资金=预定资金*1.05 WHERE CURRENT OF budget_cursor

/*修改游标指向的行数据*/

CLOSE budget_cursor

DEALLOCATE budget_cursor

/*关闭和释放游标*/ 在某些状况下,可以在游标说明上附加 FOR UPDATE语句,这样可以在 UPDATE或

DELETE命令中以WHERE CURRENT OF关键字直接修改或删除目前游标所指向的数据,

而不必给出条件。

Page 14: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

SQL Server数据库设计与管理

·210·

·210·

8.6 上 机 指 导

使用企业管理器或查询分析器创建视图,可以基于一个表创建视图,创建带 WITH

CHECK OPTION参数的视图,修改视图,删除视图,利用视图修改表内容。

利用游标检索数据、修改游标所指向的数据集。

目的是熟练掌握基于表创建视图,掌握基于视图创建视图,掌握视图中参数的应用,

学会使用游标对数据进行修改、删除。

① 利用 T-SQL语句创建基于一个表的视图,如图 8.16所示。

该示例中创建了一个具有最简单的 SELECT 语句的视图 v_stu18。视图的内容包括 18

岁以上学生的信息,这样可以方便查询。

② 基于两个表创建视图,如图 8.17所示。

图 8.16 基于一个表创建视图 图 8.17 基于两个表创建视图

该示例在表 student_info和表 class_info上创建了视图 v_stu_class,通过对两个表的关

联可以方便查询学生所在的班级情况,如图 8.18所示。

③ 基于一个视图创建视图,如图 8.19所示。

图 8.18 查询 v_stu_class信息 图 8.19 基于一个视图创建另一个视图

该示例在已创建视图 v_stu_class 的基础上创建了一个名为 v_stu_class1 的视图,视图

信息包括所有 02 班的学生信息,对新建视图进行查询,结果如图 8.20所示。

Page 15: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

第 8章 视图及游标

·211·

·211·

④ 创建一个名为 v_teacher30的视图,新视图的内容只包括年龄在 30 岁以上的教师信

息,并使用WITH CHECK OPTION 设置权限,如图 8.21所示。

图 8.20 查询 v_stu_class1视图信息 图 8.21 创建一个带有限制修改权限的视图

在对该视图进行插入、修改和删除操作时,都要依照建立视图的条件来进行操作,如

对视图 v_teacher30 插入一条记录“‘0006’,‘王淳’,‘男’,29,‘机械制造’”,

则会出现如图 8.22的错误提示,原因就是所插入的记录条件与创建视图的条件不相符。

图 8.22 对 v_teacher30进行插入操作

⑤ 修改视图 v_stu18中的信息,当视图被更改后,从属的基表信息也会被修改,如图 8.23

所示。

图 8.23 对视图 v_stu18进行修改

查看从属表 student_info的信息是否被修改,如图 8.24所示。

该示例将原来姓名为“王敬”的学生姓名更改为“王晶”,实际上真正更改的是从属

表中的信息。

Page 16: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

SQL Server数据库设计与管理

·212·

·212·

图 8.24 基表结果

⑥ 利用游标创建学生信息报表,报表内容包括姓名、年龄和班级名称。 USE student

GO

PRINT'**********学生信息表*********'

PRINT' '

PRINT'—————————————————'

PRINT'|姓名 |年龄| 班级名称 |'

DECLARE @stuname char(10),@stuold char(5),@classname char(10)

DECLARE student_cursor CURSOR

FOR SELECT 姓名,年龄,班级名称 FROM student_info,class_info

WHERE student_info.班级编号=class_info.班级编号

OPEN student_cursor

FETCH NEXT FROM student_cursor INTO @stuname,@stuold,@classname

WHILE @@FETCH_STATUS=0

BEGIN

PRINT'|'+@stuname+'|'+@stuold+'|'+@classname+'|'

PRINT'———————————————'

FETCH NEXT FROM student_cursor INTO @stuname,@stuold,@classname

END 运行结果如图 8.25所示。

图 8.25 生成学生信息报表

Page 17: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

第 8章 视图及游标

·213·

·213·

⑦ 利用游标修改 teacher_info 年龄,删除游标所在行。 DECLARE teacher_cursor CURSOR

FOR SELECT * FROM teacher_info

FOR UPDATE OF 年龄

OPEN teacher_cursor

FETCH NEXT FROM teacher_cursor

UPDATE teacher_info

SET 年龄=年龄+1 WHERE CURRENT OF teacher_cursor

GO

DELETE FROM teacher_info WHERE CURRENT OF teacher_cursor

Close teacher_cursor

Deallocate teacher_cursor

习 题

1. 填空题

(1) 创建一个视图最基本的命令是________。

(2) 修改一个视图的命令是_________。

(3) 更改视图中的数据,实际更改的是______的数据。

(4) 声明游标和声明变量都使用________命令。

2. 选择题

(1) 删除视图的命令是( )。

A. DELETE B. TRUNCATE VIEW

C. DROP VIEW D. DELETE VIEW (2) 下列哪个命令是用来修改视图内容的( )。

A. UPDATE B. ALTER

C. ALTER VIEW D. INDEXED VIEW (3) 视图中的数据存储在( )。

A. 视图本身 B. 基表中

C. 系统表中 D. 临时表中

(4) WITH CHECK OPTION 属性是对视图有如下哪一项用途( )。

A. 进行检查约束 B. 进行删除监测

C. 进行更新监测 D. 进行插入监测

(5) 如果存在某视图的表被删除,则此视图( )。

A. 仍然存在 B. 也被删除

C. 另存到临时表中 D. 存储到其他表中

3. 判断题

(1) 视图只能通过基表创建。 ( )

(2) 在视图上建立簇索引时,视图可以包含 text、ntext和 image列。 ( )

Page 18: 第 8 章 视图及游标 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch08.pdf⑤ 在第一栏中,可看到添加进来的Customers 和Employees 表;在第二栏中,可看到

SQL Server数据库设计与管理

·214·

·214·

(3) UPDATE是用来修改视图的。 ( )

(4) 游标使用完毕只要关闭就可以,无需释放。 ( )

4. 简答题

(1) 什么是视图?

(2) 简述WITH CHECK OPTION的含义。

(3) 比较游标属性中 ABSOLUTE和 RELATIVE。

5. 操作题

(1) 使用游标创建项目信息表报表。

(2) 利用上题视图,显示出所有姓陈的职员详细信息。

(3) 更改上题的条件。更改后的视图要包括如下内容:所有给“联想”部门或“同创”

部门工作的职员信息。