数据库的基本表是按照数据库设计人员的观点设计的,并不一定符合用户的需求。SQLServer2005可以根据用户需求重新定义表的数据结构,这种数据结构就是视图。在数据库系统中,为了迅速地从庞大的数据库中找到所需要的数据,SQLServer2005提供了类似书的目录作用的索引技术。通过对数据库中表设置索引,可以大大加快数据的检索速度。SQLServer2005还提供了一种称为游标的机制,来处理数据。本章主要介绍SQLServer2005数据库系统视图的创建以及使用,索引类型及创建、使用,游标的创建以及使用。第9章视图、索引和游标9.1视图9.2索引9.3游标第9章视图、索引和游标9.1.1视图概述视图是从一个或多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。视图不是真实存在的基础表而是一张虚表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。1.视图的优点使用视图有很多优点,主要表现在:1)为用户集中数据,简化用户的数据查询和处理。使得分散在多个表中的数据,通过视图定义在一起。2)简化操作,屏蔽了数据库的复杂性。3)重新定制数据,使得数据便于共享。3)合并分割数据,有利于数据输出到应用程序中。4)简化了用户权限的管理,增加了安全性。9.1视图2.视图的使用范围视图通常用来集中、简化和自定义每个用户对数据库的不同认识。通常在以下情况下使用视图:1)着重于特定数据。2)2)简化数据操作。3)自定义数据。4)数据的导入与导出。5)跨服务器组合分区数据库9.1视图9.1.2视图的类型在SQLServer2005中,视图可以分为标准视图、索引视图和分区视图。标准视图组合了一个或多个表中的数据,用户可以使用标准视图对数据库进行查询、修改、删除等基本操作。索引视图是被具体化了的视图,即它已经过计算并存储。可以为视图创建索引,即对视图创建一个惟一的聚集索引。索引视图可以显著提高某些类型查询的性能。索引视图尤其适于聚合许多行的查询。但它们不太适于经常更新的基本数据集。分区视图在一台或多台服务器间水平连接一组成员表中的分区数据。这样,数据看上去如同来自于一个表。联接同一个SQLServer实例中的成员表的视图是一个本地分区视图。9.1视图9.1.3创建视图在创建视图前应考虑如下准则:1)只能在当前数据库中创建视图。2)视图名称必须遵循标识符的规则,且对每个架构都必须惟一。3)用户可以对其他视图创建视图。5)不能将AFTER触发器与视图相关联,只有INSTEADOF触发器可以与之相关联。6)定义视图的查询不能包含COMPUTE子句、COMPUTEBY子句或INTO关键字。7)定义视图的查询不能包含ORDERBY子句,除非在SELECT语句的选择列表中还有一个TOP子句。8)定义视图的查询不能包含指定查询提示的OPTION子句。9)定义视图的查询不能包含TABLESAMPLE子句。9.1视图10)不能为视图定义全文索引定义。11)不能创建临时视图,也不能对临时表创建视图。12)不能删除参与到使用SCHEMABINDING子句创建的视图中的视图、表或函数,除非该视图已被删除或更改而不再具有架构绑定。另外,如果对参与具有架构绑定的视图的表执行ALTERTABLE语句,而这些语句又会影响该视图的定义,则这些语句将会失败。13)下列情况下必须指定视图中每列的名称:①视图中的任何列都是从算术表达式、内置函数或常量派生而来。②视图中有两列或多列原应具有相同名称。③希望为视图中的列指定一个与其源列不同的名称。9.1视图在SQLServer2005中创建标准视图主要有两种方式:一种方式是在SQLServerManagementStudio中使用向导创建视图,另一种方式是通过在查询窗口中执行T-SQL语句创建视图。T-SQL提供了视图创建语句CREATEVIEW。其语法格式如下:CREATEVIEW[schema_name.]view_name[(column[,...n])][WITHview_attribute[,...n]]ASselect_statement[;][WITHCHECKOPTION]9.1视图【例9-1】创建学生_课程_分数视图,包括计算机学院的学生的学号、姓名,和他们选修的课程号、课程名、分数。CREATEVIEW学生_课程_分数ASSELECT学生表.学号,姓名,课程表.课程号,课程名,分数FROM学生表,课程表,成绩表WHERE学生表.学号=成绩表.学号AND课程表.课程号=成绩表.课程号AND院系名称='计算机学院'GO【例9-2】创建进货视图,包括职工的姓名和零件名称。CREATEVIEW进货视图ASSELECT姓名,零件名称FROM工作人员表,库存零件表,出货单表WHERE工作人员表.人员编号=出货单表.人员编号AND库存零件表.零件编号=出货单表.零件编号GO9.1视图9.1.4查询视图视图创建完毕,就可以如同查询基本表一样查询视图了。可以在SQLServerManagementStudio中选中要查询的视图并打开,浏览该视图查询的所有数据。也可以在查询窗口中执行T-SQL语句查询视图。【例9-3】查询学生_课程_分数视图,统计“数据库应用”课程的总分和平均分。SELECT总分=SUM(分数),平均分=AVG(分数)FROM学生_课程_分数WHERE课程名='数据库应用'GO【例9-4】查询姓“张”的职工进货的零件名称。SELECT零件名称FROM进货视图WHERE姓名LIKE'张%'GO9.1视图9.1.5更新视图通过更新视图数据(包括添加、修改和删除)可以修改基本表数据。但并不是所有的视图都可以更新,只有对满足可更新条件的视图才能进行更新。只要满足下列条件,即可通过视图修改基础基表的数据:1)任何修改(包括UPDATE、INSERT和DELETE语句)都只能引用一个基表的列。2)视图中被修改的列必须直接引用表列中的基础数据。不能通过任何其他方式对这些列进行派生,如通过聚合函数、计算(如表达式计算)、集合运算等。3)被修改的列不受GROUPBY、HAVING、DISTINCT或TOP子句的影响。即使是可更新视图,也不能随意更新数据。如果视图所依赖的基本表有多个时,不能向该视图添加数据,因为这将影响多个基本表。修改数据时,若视图依赖于多个基本表,那么一次修改只能修改一个基本表中的数据。删除数据时,若视图依赖于多个基本表,那么不能通过视图删除数据。9.1视图9.1.6修改视图定义修改视图定义,与修改基本表结构不一样。修改基本表结构是指重新定义列名、属性、约束等,而修改视图定义是指修改视图的指定列的列名、别名、表名、是否输出、顺序类型等属性。可以在SQLServerManagementStudio中选中要修改的视图并修改,就能修改视图定义了。也可以在查询窗口中执行T-SQL语句修改视图定义。T-SQL提供了视图创建语句ALTERVIEW。其语法格式如下:ALTERVIEW[schema_name.]view_name[(column[,...n])][WITHview_attribute[,...n]]ASselect_statement[;][WITHCHECKOPTION]9.1视图【例9-6】修改【例9-1】创建的学生_课程_分数视图,包括计算机学院的男生的学号、姓名、性别,和他们选修的课程号、课程名、分数。ALTERVIEW学生_课程_分数ASSELECT学生表.学号,姓名,性别,课程表.课程号,课程名,分数FROM学生表,课程表,成绩表WHERE学生表.学号=成绩表.学号AND课程表.课程号=成绩表.课程号AND院系名称='计算机学院'AND性别='男'GO9.1视图9.1.7删除视图如果不需要视图,则可以将视图删除。可以在SQLServerManagementStudio中选中要删除的视图并删除,就能删除视图。也可以在查询窗口中执行T-SQL语句删除视图。T-SQL提供了视图删除语句DROPVIEW。其语法格式如下:DROPVIEWview_name【例9-7】删除【例9-1】创建的学生_课程_分数视图。DROPVIEW学生_课程_分数GO9.1视图索引包含从表或视图中一个或多个列生成的键,以及映射到指定数据的存储位置的指针。通过创建设计良好的索引以支持查询,可以提高查询性能。对于包含SELECT、UPDATE或DELETE语句的各种查询,索引会很有用。在数据库系统中建立索引主要有以下作用:1)快速存取数据。2)保证数据的一致性。3)实现表与表之间的参照完整性。4)在使用GROUPBY、ORDERBY子句进行查询时,利用索引可以减少排序和分组的时间。9.2索引9.2.1索引的分类如果一个表没有创建索引,则数据行不按任何特定顺序存储,这种结构称为堆集。SQLServer2005支持在表中任何列(包括计算列)上定义索引。索引可以是惟一的,即索引列不会有两行记录相同,这样的索引称为惟一索引。索引也可以是不惟一的。如果索引是根据单列创建的,这样的索引称为单列索引。根据多列组合创建的索引称为复合索引。按索引的组织方式的不同,可以将索引分为聚集索引和非聚集索引。1.聚集索引聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。2.非聚集索引非聚集索引具有独立于数据行的结构。非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。聚集索引和非聚集索引都可以是惟一的。9.2索引9.2.2创建索引创建索引时,首先必须考虑以下设计准则:1.设计索引时应考虑的准则(1)创建索引之前应考虑的准则在创建索引之前应考虑如下准则:1)了解数据库本身的特征。2)了解最常用的查询的特征。3)了解查询中使用的列的特征。4)确定哪些索引选项可在创建或维护索引时提高性能。5)确定索引的最佳存储位置。9.2索引在SQLServer2005中创建索引主要有两种方式:一种方式是在SQLServerManagementStudio中使用向导创建索引,另一种方式是通过在查询窗口中执行T-SQL语句创建索引。T-SQL提供了索引创建语句CREATEINDEX。其语法格式如下:CREATE[UNIQUE][CLUSTERED|NONCLUSTERED]INDEXindex_nameONobject(column[ASC|DESC][,...n])[INCLUDE(column_name[,...n])][WITH(relational_index_option[,...n])][ON{partition_scheme_name(column_name)|filegroup_name|default}]9.2索引9.2.3创建索引视图如果在查询中频繁地引用视图,可通过对视图创建惟一聚集索引来提高性能。【例9-10】根据工作人员表创建的视图,包括人员编号、姓名和职务列。再使用T-SQL语句根据姓名列创建索引视图。创建视图:CREATEVIEW职工视图WITHSCHEMABINDINGASSELECT人员编号,姓名,职务FROMdbo.工作人员表GO创建索引:CREATEUNIQUECLUSTEREDINDEX职工视图索引ON职工视图(人员编号)GO9.2索引9.2.4删除索引如果不需要索引,则可以将索引删除。在SQLServer2005中提供了两种删除方式:一种方式是在SQLServerManagementStudio中删除索引,另一种方式是通过执行T-SQL语句删除索引。T-SQL提供了索引删除语句DROPINDEX。其语法格式如下:DROPINDEXtable_name.index_name【例9-11】删除【例9-8】创建的索引。DROPINDEX教师表.index_教师姓名GO9.2索引在SQLServer2005中,SELECT查询操作会对整个行集起作用。由SELECT语句返回的行集包