第六章 索引和排序.ppt_第1页
第六章 索引和排序.ppt_第2页
第六章 索引和排序.ppt_第3页
第六章 索引和排序.ppt_第4页
第六章 索引和排序.ppt_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章 索引和排序,索引(INDEX)可以对表中的记录进行逻辑排序,排序(SORT)可以对表中的记录进行物理排序。,本章知识点,了解索引 建立索引 打开和关闭索引文件 设置当前索引文件 利用索引快速查询 建立排序,重点: 建立索引 建立排序 难点: 建立索引,索引可以按照一定的规则重新排列表中的记录,并将排序结果形成索引文件。索引文件是一个二维列表,其中仅有二列数据:关键字值和记录的物理位置。关键字值是包含有字段的排序规则表达式,记录的物理位置指向关键字值在表中所在的物理位置。,6.1 了解索引,例如,在表6-1所示的Student表中,若要根据入学成绩(entrancescore)的高低重新

2、排序显示表中的记录,用户可以根据entrancescore字段来建立索引文件。建立好的索引文件如表6-2所示。,表6-1 Student表中的记录,表6-2 根据entrancescore字段建立的索引文件,需要注意的是:索引并未改变表中记录的物理位置。正是基于这样的理由,我们通常将索引称为对表的逻辑排序。但是,当用户将建立好的索引文件打开以后,记录的显示顺序或读取处理记录的顺序将会按照索引文件排列的记录顺序进行。特别是由于索引的作用,大大提高了记录的检索速度。,用户可以为一个表同时建立多个索引文件,每个索引文件表示处理记录的不同顺序。 在 Visual FoxPro中,索引文件可以分为两大类

3、:复合索引文件(.CDX)和单一索引文件(.IDX)。复合索引文件又可以进一步分为结构复合索引文件和非结构复合索引文件。,单一索引文件的内部结构如图6-1所示。单一索引文件的扩展名为.IDX。,图6-1 单一索引文件结构,复合索引文件的内部结构如图6-2所示。从图中可以看到复合索引文件可以由多个关键字值和其对应的多个记录的物理位置构成。每一个关键字值和其对应的记录的物理位置构成了一个索引标识(TagName)。,在复合索引文件中,每一个索引标识等价于一个单一索引文件。换句话说,复合索引文件等价于多个单一索引文件。复合索引文件的扩展名为.CDX。,图6-2 复合索引文件结构,TagName 1,

4、TagName 2,TagName n,复合索引文件又可以进一步细分为结构复合索引文件和非结构复合索引文件。 结构复合索引文件的文件名称与相关的表同名,另外结构复合索引文件将随着相关表的打开而自动打开。 。,非结构复合索引文件的文件名称与相关的表不同名,另外非结构复合索引文件不会随着相关表的打开而自动打开,要由用户自行打开,在Visual FoxPro中,为表建立索引可以采用两种方法来完成: l在表设计器中通过直观的操作来建立索引 l使用INDEX命令来建立索引,6.2 建立索引,INDEX命令用来为当前的表建立一个索引文件。该索引文件可以是单一索引文件,也可以是结构复合索引文件或非结构复合索

5、引文件。,建立单一索引,建立非结构复合索引,建立结构复合索引,设置复合索引排序方式,建立惟一索引和候选索引,设置有条件的索引,使用ADDITIVE参数,使用COMPACT参数,建立组合索引解决排序冲突,要建立单一索引文件,应在INDEX命令中使用 TO IDXFileName参数。 格式: Use 表(加路径) Index on 字段 to 文件名.idx,6.2.1 建立单一索引,【例】 若要为Student表根据entrancescore字段建立单一索引文件(单一索引文件名为Entr.IDX),那么应执行如下命令:,USE d:syStudent INDEX ON entrancescor

6、e TO Entr.IDX 其中,entrancescore为索引关键字表达式,Entr.IDX为单一索引文件名。 利用INDEX命令建立好单一索引文件以后,该单一索引文件自动处于打开状态并作为当前索引生效。,另外,对于单一索引而言,仅能建立升序单一索引文件,无法建立降序单一索引文件。但是我们可以利用INDEX命令的索引关键字表达式来建立一个逻辑上的降序单一索引文件。,【例】 若要为Student表根据entrancescore字段建立逻辑上降序的单一索引文件(单一索引文件名为EntrDec.IDX),那么应执行如下命令: USE Student INDEX ON 1*entrancescor

7、e TO EntrDec.IDX,在建立好EntrDec.IDX单一索引文件以后,可以使用LIST命令显示 Student表中的记录。我们可以看到记录将按照入学成绩由大到小的降序方式显示。,但是这并不意味着可以使用 INDEX命令建立真正意义上的降序单一索引文件,而只是利用索引关键字表达式建立了一个逻辑上降序的单一索引文件。,要建立结构复合索引,应在INDEX命令中使用 TAGTagName参数。 格式: Use 表(加路径) Index on 字段 tag 标识名,6.2.2 建立结构复合索引,【例】 若要为Student表根据name字段建立结构复合索引文件(结构复合索引文件名与表同名,索

8、引标识为Name),那么应执行如下命令: USE Student INDEX ON name TAG Name 其中前一个name是索引关键字表达式,后一个Name是索引标识。,利用 INDEX命令可以建立结构复合索引文件,并在该复合索引文件中创建一个索引标识。我们可以多次利用 INDEX命令为结构复合索引文件创建其他的索引标识。,【例】 若要为Student表根据depid字段建立结构复合索引文件(索引标识为Dep),那么应执行如下命令: USE Student INDEX ON depid TAG Dep 至此,我们二次利用 INDEX命令创建了结构复合索引文件(Student.CDX),

9、并在其中建立了两个索引标识(Name和Dep)。,要建立非结构复合索引,应在 INDEX命令中使用 TAG TagName OF CDXFileName参数。 格式: Use 表(加路径) Index on 字段 tag 标识名 of 文件名.cdx,6.2.3 建立非结构复合索引,【例】 若要为Student表根据entrancescore字段建立非结构复合索引文件(非结构复合索引文件名为Entr.CDX,索引标识为Entrscore),那么应执行如下命令: USE Student INDEX ON entrancescore TAG Entrscore OF Entr.CDX,其中entr

10、ancescore是索引关键字表达式,Entrscore是索引标识,Entr.CDX是非结构复合索引文件名。 由于非结构复合索引与当前表不同名,所以必须使用OFCDXFileName参数指明非结构复合索引文件名。与结构复合索引相同,用户可以多次利用INDEX命令为非结构复合索引文件创建其他的索引标识。,在建立复合索引文件时,可以使用ASCENDINGDESCENDING参数指定某一索引标识是按照升序(ASCENDING)还是降序(DESCENDING)方式进行排序。 但是需要注意,在建立单一索引文件时,不能使用ASCENDINGDESCENDING参数。这是因为单一索引文件只能按照升序方式进行

11、排序。,6.2.4 设置复合索引排序方式,【例】 若要为 Student表根据entrancescore字段建立结构复合索引文件,索引标识为Entr,并且希望按降序方式排序,那么应执行如下命令: USE Student INDEX ON entrancescore TAG Entr DESCENDING,如果在 INDEX命令中使用FORlExpression参数,那么相当于在现有的表上建立有条件筛选索引。也就是说只有符合FORlExpression条件的记录才会出现在索引文件的索引关键字值列表中。,6.2.5 设置有条件的索引,【例】 若要为Student表根据entrancescore字段

12、建立单一索引文件(单一索引文件名为Entr.IDX),并且希望只有满足入学成绩大于400这一条件的记录才会出现在索引文件的索引关键字值列表中,那么应执行如下命令: USE Student INDEX ON entrancescore TO Entr.IDX FOR entrancescore400,这样一来,当使用LIST命令显示记录时,仅仅会显示出入学成绩大于400的记录并且是按照入学成绩的升序方式显示记录。,在实际工作中,如果仅根据某一字段或某一字段表达式建立索引,势必会遇到排序冲突的问题。例如,如果仅根据entrancescore字段建立索引,那么可能会遇到在表中有多条记录的入学成绩相同

13、,那么入学成绩相同的记录如何排序就是我们要解决的排序冲突问题。 为了解决排序冲突,可以利用 INDEX命令的索引关键字表达式。在该表达式中可以根据多个字段的组合来解决排序冲突。,6.2.6 建立组合索引解决排序冲突,【例】 在Student表中,如果希望首先根据birthday字段按照升序的方式进行排序,如果遇到有多条记录的出生日期相同,那么再根据entrancescore字段按照降序的方式进行排序,那么应执行如下命令: USE Student INDEX ON birthday+1/entrancescore To BirthEntr.IDX,6.3 打开和关闭索引文件,打开索引文件,关闭索

14、引文件,命令格式 SET INDEX TOIndexFilelist | ? ORDERnindexNumber|IDXIndexFileName |TAGTagNameOFCDXFileName ASCENDING|DESCENDINGADDITIVE 命令功能 该命令用于打开一个或多个索引文件。,6.3.1 打开索引文件,命令说明 (1)IndexFileList参数用于指定要打开的一个或多个索引文件。要打开的多个索引文件之间要用逗号分隔。在索引文件列表(IndexFileList参数)中可以指定要打开的单一索引文件或非结构复合索引文件。另外,索引文件列表中指定的第一个索引文件自动作为当前

15、索引生效。但需要注意的是,如果在索引文件列表中指定的第一个索引是非结构复合索引,那么若要其作为当前索引生效还需使用 ORDER参数或使用 SET ORDER TO命令。,(2)?参数用于在执行SET INDEX TO命令时弹出“打开”对话框以选择要打开的索引文件。 (3)ORDERnindexNumber参数用于指定在索引文件列表(IndexFileList参数)中的第几个索引文件作为当前索引生效。nindexNumber参数是一个自然数。,【例】 若要利用SET INDEX TO命令打开Entr.IDX、Birth.IDX和Name.CDX索引文件并将其中的第二个单一索引文件作为当前索引生效

16、,那么应执行如下命令: SET INDEX TO Entr.IDX,Birth.IDX,Name.CDX ORDER 2 (4)ORDERIDXIndexFileName 单一索引文件作为当前索引生效。,【例】 以下命令将Birth.IDX单一索引文件作为当前索引生效: SET INDEX TO Entr.IDX,Birth.IDX,Name.CDX ORDER Birth.IDX,(5)ORDERTAGTagNameOFCDXFileName参数用于指定在IndexFileList参数中的哪一个复合索引标识作为当前索引生效。,【例】 以下命令将 Name.CDX非结构复合索引中的Name索引

17、标识作为当前索引生效: SET INDEX TO Entr.IDX,Birth.IDX,Name.CDX ORDER TAG Name OF Name.CDX,(6)ASCENDING|DESCENDING参数用于指定复合索引文件的某一索引标识是按照升序(ASCENDING)还是降序(DESCENDING)方式显示记录。,命令格式 SET INDEX TO 命令功能 该命令用于关闭已打开的索引文件。,6.3.2 关闭索引文件,命令格式 SET ORDER TO nindexNumber|IDXIndexFileName |TAGTagName OFCDXFileName INnWorkArea

18、|cTableAlias ASCENDING|ESCENDING,6.4 设置当前索引文件,命令功能 该命令用于设置当前索引。 命令说明 (1)nindexNumber|IDXIndexFileName|TAGTagName OFCDX FileName参数与SET INDEX TO命令中的相应ORDER参数作用相同,这里不再赘述。,(2)IN nWorkArea|cTableAlias参数用于指定要设置哪一个工作区的表为当前索引。如果要设置当前索引的表不在当前工作区中,那么应在 SET ORDER TO命令中指明该表所在的工作区。nWorkArea参数用于指定工作区号,cTableAlias

19、参数用于指定表的别名。,【例】 假设当前工作区是第一工作区,现在若要将第三工作区已打开的第二个索引文件(该索引文件为单一索引文件)设置为当前索引,那么应执行如下命令: SET ORDER TO 2 IN 3 假设第三工作区打开的表为Student表,该表的别名为Stu,那么 上述命令也可以写为: SET ORDER TO 2 IN Stu,6.5 利用索引快速查询,FIND命令,建立和使用索引的目的有两个:一是可以对表中随机存储的记录根据任务的需要进行逻辑排序,二是可以提高记录的查询检索速度。如何提高记录的查询检索速度对于实际应用来说是非常重要的,是评价应用系统的一个重要指标。Visual F

20、oxPro提供了两条基于索引的快速查询命令,即FIND命令和SEEK命令。,SEEK命令,命令格式 FIND 命令功能 该命令用于在当前索引上快速查找索引关键字值与给定的字符串相匹配的首条记录。如果查找到相匹配的记录,Visual FoxPro将记录指针指向该记录,并且测试函数FOUND( )返回逻辑真值,EOF( )函数返回逻辑假值;否则记录指针将指向记录结束标识,并且测试函数FOUND( )返回逻辑假值,EOF( )函数返回逻辑真值。,6.5.1 FIND命令,命令说明 (1)参数必须是字符型常量或变量。 (2)字符型常量可以省略定界符。若字符型常量包含前置空格,则必须使用定界符。 (3)

21、若参数是字符型变量,那么在该字符型变量前要添加宏替换函数&。,【例】 若要在Student表中利用FIND命令快速查找名叫“高 涵”的学生,那么应执行如下命令: USE Student INDEX ON name TO Name.IDX FIND 高 涵,如果将要查找的学生姓名保存在一个变量中,那么上述命令应改写为: USE Student INDEX ON name TO Name.IDX XM=“高 涵” FIND &XM,Visual FoxPro提供了一个独特的宏替换函数&,该函数用以替换出字符型变量的内容,即&的值是变量中的字符串。上述命令中的“FIND &XM”命令等价于“FIND高 涵”命令。,命令格式 SEEK 命令功能 该命令用于在当前索引上快速查找索引关键字值与给定的表达式相匹配的首条记录。如果查找到相匹配的记录,Visual FoxPro将记录指针指向该记录,并且测试函数FOUND( )返回逻辑真值,EOF( )函数返回逻辑假值;否则记录指针将指向记录结束标识,并且测试函数FOUND( )返回逻辑假值,EOF( )函数返回逻辑真值。,6.5.2 SE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论