首页 > 代码库 > 140912●索引、视图、游标
140912●索引、视图、游标
索引
一个表的存储是由两部分组成的,一部分用来存放表的数据页面,另一部分存放索引,页面索引就存放在索引页面上。通常索引页面相对于数据页面来说小得多,当进行数据检索时,系统先搜索索引页面,从中找到所需数据的指针再直接通过指针从数据页面中读取数据。
从某种程度上,可以把数据库看作一本书,把索引看作书的目录。
在SQL Server 的数据库中按存储结构的不同将索引分为两类
簇索引 ClusteredIndex
非簇索引 Nonclustered Index
簇索引对表的物理数据页中的数据按列进行排序,然后再重新存储到磁盘上,即簇索引与数据是混为一体的,因此用簇索引查找数据很快。但由于簇索引将表的所有数据完全重新排列了,它所需要的空间也就特别大。表的数据行只能以一种排序方式存储在磁盘上,所以一个表只能有一个簇索引。
非簇索引具有与表的数据完全分离的结构。非簇索引将行定位器按关键字的值用一定的方式排序,这个顺序与表的行在数据页中的排序是不匹配的。
簇索引可以看做字典的拼音查询,非簇索引可以看做字典的部首查询。
用语句创建索引:
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]
INDEX index_name ON {table | view } (column [ ASC | DESC ] [,...n])
为表products 创建一个簇索引
create unique clustered index pk_p_id
on products(p_id)
为表products 创建一个复合索引
create index pk_p_main
on products(p_id, p_name, sumvalue)
--其中sumvalue 是一个计算列表达式为price*quantity
用界面创建索引,方法跟建唯一键相似,打开表设计,然后按下图操作
删除索引,用drop
视图
视图是从一个或多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。
视图不是真实存在的基础表,而是一张虚表视图,所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。通过视图看到的数据只是存放在基本表中的数据。
视图的优点
视点集中
视图集中即是使用户只关心它感兴趣的某些特定数据和他们所负责的特定任务。
简化操作
若视图本身就是一个复杂查询的结果集,这样在每一次执行相同的查询时,不必重新写这些复杂的查询语句,只要一条简单的查询视图语句即可。
合并分割数据
表的设计时常将表进行水平分割或垂直分割,但表的结构的变化却对应用程序产生不良的影响。
安全性
通过视图用户只能查看和修改他们所能看到的数据,其它数据库或表既不可见也不可以访问。
创建视图
CREATE [ < owner > ] VIEW view_name [ ( column [ ,...n ] ) ] [with encryption] --下划线部分表示加密,一般用不到
AS
select_statement
例:
create view Student_Info(sno,sname,birthday,class)
as
select sno,sname,sbirthday,class from student
select * from Student_Info --查看视图
用界面创建视图:
删除视图
drop view 视图名称
通过视图管理数据
视图与表具有相似的结构,当向视图中插入或更新数据时,实际上对视图所引用的表执行数据的插入和更新。但是通过视图插入更新数据和表相比有一些限制。
通过视图对数据进行更新与删除时,需要注意到两个问题:
执行UPDATE DELETE 时,所删除与更新的数据必须包含在视图结果集中。
如果视图引用多个表时,无法用DELETE 命令删除数据,若使用UPDATE 则应与INSERT 操作一样被更新的列必须属于同一个表。
游标
关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式。
如果要从某一结果集中逐一地读取一条记录,那么如何解决这种问题呢?游标为我们提供了一种极为优秀的解决方案。
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制
每一个游标必须有四个组成部分,这四个关键部分必须符合下面的顺序:
1.DECLARE 游标
2.OPEN 游标
3.从一个游标中FETCH 信息
4.CLOSE 或DEALLOCATE 游标
语法格式如下
DECLARE cursor_name [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]
SCROLL
表明所有的提取操作,如FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE都可用,如果不使用该保留字那么只能进行NEXT 提取操作
标准游标
declare cur_authors cursor
for
select au_id, au_lname, au_fname, phone, address, city, state, contract
from authors
读取游标中数据,语法格式:
FETCH
[ [ NEXT | PRIOR | FIRST | LAST| ABSOLUTE {n | @nvar}| RELATIVE {n | @nvar} ]
FROM ]
{cursor_name}
[INTO @variable_name[,...n] ]
140912●索引、视图、游标