当前位置首页 > 建筑/施工 > 施工组织
搜柄,搜必应! 快速导航 | 使用教程  [会员中心]

第六章索引和排序

文档格式:PPT| 66 页|大小 381.50KB|积分 10|2022-09-30 发布|文档ID:157804588
第1页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 66
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 第六章 索引和排序 索引(INDEX)可以对表中的记录进行逻辑排序,排序(SORT)可以对表中的记录进行物理排序本章知识点v重点:v难点:索引可以按照一定的规则重新排列表中的记录,并将排序结果形成索引文件索引文件是一个二维列表,其中仅有二列数据:关键字值和记录的物理位置关键字值是包含有字段的排序规则表达式,记录的物理位置指向关键字值在表中所在的物理位置6.1 了解索引v例如,在表6-1所示的Student表中,若要根据入学成绩(entrancescore)的高低重新排序显示表中的记录,用户可以根据entrancescore字段来建立索引文件建立好的索引文件如表6-2所示RecNo studid name sex birthday entrancescore 1981101 赵文化 男 2-28-80 500 2981102 徐逸华 男 6-7-81 460 3981103 郭茜茜 女 11-17-82 580 4981201 钱 途 男 5-1-80 3805981202 高 涵 男 11-06-80 6806981203 李晓鸣 女 11-17-82 400表6-1 Student表中的记录 关键字(entrancescore)值 记录的物理位置 68055803 5001 460240063804表6-2 根据entrancescore字段建立的索引文件需要注意的是:索引并未改变表中记录的物理位置。

    正是基于这样的理由,我们通常将索引称为对表的逻辑排序但是,当用户将建立好的索引文件打开以后,记录的显示顺序或读取处理记录的顺序将会按照索引文件排列的记录顺序进行特别是由于索引的作用,大大提高了记录的检索速度用户可以为一个表同时建立多个索引文件,每个索引文件表示处理记录的不同顺序在 Visual FoxPro中,索引文件可以分为两大类:复合索引文件(.CDX)和单一索引文件(.IDX)复合索引文件又可以进一步分为结构复合索引文件和非结构复合索引文件单一索引文件的内部结构如图6-1所示单一索引文件的扩展名为.IDX关键字值 记录的物理位置 38044006 58036805图6-1 单一索引文件结构 v 复合索引文件的内部结构如图6-2所示从图中可以看到复合索引文件可以由多个关键字值和其对应的多个记录的物理位置构成每一个关键字值和其对应的记录的物理位置构成了一个索引标识(TagName)v 在复合索引文件中,每一个索引标识等价于一个单一索引文件换句话说,复合索引文件等价于多个单一索引文件复合索引文件的扩展名为.CDX关键字值1物理位置1关键字值2物理位置2 关键字值 n物理位置n 680511-17-8239811011580311-17-8269811022 40062-28-809812036图6-2 复合索引文件结构 TagName 1 TagName 2 TagName n v复合索引文件又可以进一步细分为结构复合索引文件和非结构复合索引文件。

    v结构复合索引文件的文件名称与相关的表同名,另外结构复合索引文件将随着相关表的打开而自动打开v 非结构复合索引文件的文件名称与相关的表不同名,另外非结构复合索引文件不会随着相关表的打开而自动打开,要由用户自行打开在Visual FoxPro中,为表建立索引可以采用两种方法来完成:l 在表设计器中通过直观的操作来建立索引l 使用INDEX命令来建立索引6.2 建立索引 INDEX命令用来为当前的表建立一个索引文件该索引文件可以是单一索引文件,也可以是结构复合索引文件或非结构复合索引文件要建立单一索引文件,应在INDEX命令中使用 TO IDXFileName参数格式:Use 表(加路径)Index on 字段 to 文件名.idx6.2.1 建立单一索引v【例】若要为Student表根据entrancescore字段建立单一索引文件(单一索引文件名为Entr.IDX),那么应执行如下命令:USE d:syStudent INDEX ON entrancescore TO Entr.IDX 其中,entrancescore为索引关键字表达式,Entr.IDX为单一索引文件名利用INDEX命令建立好单一索引文件以后,该单一索引文件自动处于打开状态并作为当前索引生效。

    v另外,对于单一索引而言,仅能建立升序单一索引文件,无法建立降序单一索引文件但是我们可以利用INDEX命令的索引关键字表达式来建立一个逻辑上的降序单一索引文件例】若要为Student表根据entrancescore字段建立逻辑上降序的单一索引文件(单一索引文件名为EntrDec.IDX),那么应执行如下命令:USE StudentINDEX ON 1*entrancescore TO EntrDec.IDX v在建立好EntrDec.IDX单一索引文件以后,可以使用LIST命令显示 Student表中的记录我们可以看到记录将按照入学成绩由大到小的降序方式显示v但是这并不意味着可以使用 INDEX命令建立真正意义上的降序单一索引文件,而只是利用索引关键字表达式建立了一个逻辑上降序的单一索引文件要建立结构复合索引,应在INDEX命令中使用 TAGTagName参数格式:Use 表(加路径)Index on 字段 tag 标识名6.2.2 建立结构复合索引【例】若要为Student表根据name字段建立结构复合索引文件(结构复合索引文件名与表同名,索引标识为Name),那么应执行如下命令:USE StudentINDEX ON name TAG Name其中前一个name是索引关键字表达式,后一个Name是索引标识。

    v利用 INDEX命令可以建立结构复合索引文件,并在该复合索引文件中创建一个索引标识我们可以多次利用 INDEX命令为结构复合索引文件创建其他的索引标识例】若要为Student表根据depid字段建立结构复合索引文件(索引标识为Dep),那么应执行如下命令:USE StudentINDEX ON depid TAG Dep至此,我们二次利用 INDEX命令创建了结构复合索引文件(Student.CDX),并在其中建立了两个索引标识(Name和Dep)要建立非结构复合索引,应在 INDEX命令中使用 TAG TagName OF CDXFileName参数格式:Use 表(加路径)Index on 字段 tag 标识名 of 文件名.cdx6.2.3 建立非结构复合索引【例】若要为Student表根据entrancescore字段建立非结构复合索引文件(非结构复合索引文件名为Entr.CDX,索引标识为Entrscore),那么应执行如下命令:USE StudentINDEX ON entrancescore TAG Entrscore OF Entr.CDX 其中entrancescore是索引关键字表达式,Entrscore是索引标识,Entr.CDX是非结构复合索引文件名。

    由于非结构复合索引与当前表不同名,所以必须使用OFCDXFileName参数指明非结构复合索引文件名与结构复合索引相同,用户可以多次利用INDEX命令为非结构复合索引文件创建其他的索引标识在建立复合索引文件时,可以使用ASCENDINGDESCENDING参数指定某一索引标识是按照升序(ASCENDING)还是降序(DESCENDING)方式进行排序但是需要注意,在建立单一索引文件时,不能使用ASCENDINGDESCENDING参数这是因为单一索引文件只能按照升序方式进行排序6.2.4 设置复合索引排序方式【例】若要为 Student表根据entrancescore字段建立结构复合索引文件,索引标识为Entr,并且希望按降序方式排序,那么应执行如下命令:USE StudentINDEX ON entrancescore TAG Entr DESCENDING如果在 INDEX命令中使用FORlExpression参数,那么相当于在现有的表上建立有条件筛选索引也就是说只有符合FORlExpression条件的记录才会出现在索引文件的索引关键字值列表中6.2.5 设置有条件的索引【例】若要为Student表根据entrancescore字段建立单一索引文件(单一索引文件名为Entr.IDX),并且希望只有满足入学成绩大于400这一条件的记录才会出现在索引文件的索引关键字值列表中,那么应执行如下命令:USE StudentINDEX ON entrancescore TO Entr.IDX FOR entrancescore400 这样一来,当使用LIST命令显示记录时,仅仅会显示出入学成绩大于400的记录并且是按照入学成绩的升序方式显示记录。

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

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

    例】以下命令将Birth.IDX单一索引文件作为当前索引生效:SET INDEX TO Entr.IDX,Birth.IDX,Name.CDXORDER Birth.IDXv(5)ORDERTAGTagNameOFCDXFileName参数用于指定在IndexFileList参数中的哪一个复合索引标识作为当前索引生效例】以下命令将 Name.CDX非结构复合索引中的Name索引标识作为当前索引生效:SET INDEX TO Entr.IDX,Birth.IDX,Name.CDXORDER TAG Name OF Name.CDX(6)ASCENDING|DESCENDING参数用于指定复合索 引 文 件 的 某 一 索 引 标 识 是 按 照 升 序(ASCENDING)还是降序(DESCENDING)方式显示记录命令格式SET INDEX TO命令功能该命令用于关闭已打开的索引文件6.3.2 关闭索引文件命令格式SET ORDER TOnindexNumber|IDXIndexFileName|TAGTagNameOFCDXFileNameINnWorkArea|cTableAliasASCENDING|ESCENDING6.4 设置当前索引文件命令功能该命令用于设置当前索引。

    命令说明(1)nindexNumber|IDXIndexFileName|TAGTagName OFCDX FileName参数与SET INDEX TO命令中的相应ORDER参数作用相同,这里不再赘述2)IN nWorkArea|cTableAlias参数用于指定要设置哪一个工作区的表为当前索引如果要设置当前索引的表不在当前工作区中,那么应在 SET ORDER TO命令中指明该表所在的工作区nWorkArea参数用于指定工作区号,cTableAlias参数用于指定表的别名例】假设当前工作区是第一工作区,现在若要将第三工作区已打开的第二个索引文件(该索引文件为单一索引文件)设置为当前索引,那么应执行如下命令:SET ORDER TO 2 IN 3假设第三工作区打开的表为Student表,该表的别名为Stu,那么上述命令也可以写为:SET ORDER TO 2 IN Stu6.5 利用索引快速查询建立和使用索引的目的有两个:一是可以对表中随机存储的记录根据任务的需要进行逻辑排序,二是可以提高记录的查询检索速度如何提高记录的查询检索速度对于实际应用来说是非常重要的,是评价应用系统的一个重要指标。

    Visual FoxPro提供了两条基于索引的快速查询命令,即FIND命令和SEEK命令命令格式FIND 命令功能该命令用于在当前索引上快速查找索引关键字值与给定的字符串相匹配的首条记录如果查找到相匹配的记录,Visual FoxPro将记录指针指向该记录,并且测试函数FOUND()返回逻辑真值,EOF()函数返回逻辑假值;否则记录指针将指向记录结束标识,并且测试函数FOUND()返回逻辑假值,EOF()函数返回逻辑真值6.5.1 FIND命令命令说明(1)参数必须是字符型常量或变量2)字符型常量可以省略定界符若字符型常量包含前置空格,则必须使用定界符3)若参数是字符型变量,那么在该字符型变量前要添加宏替换函数&例】若要在Student表中利用FIND命令快速查找名叫“高 涵”的学生,那么应执行如下命令:USE StudentINDEX ON name TO Name.IDXFIND 高 涵如果将要查找的学生姓名保存在一个变量中,那么上述命令应改写为:USE StudentINDEX ON name TO Name.IDXXM=“高 涵”FIND&XMVisual FoxPro提供了一个独特的宏替换函数&,该函数用以替换出字符型变量的内容,即&的值是变量中的字符串。

    上述命令中的“FIND&XM”命令等价于“FIND高 涵”命令命令格式SEEK 命令功能该命令用于在当前索引上快速查找索引关键字值与给定的表达式相匹配的首条记录如果查找到相匹配的记录,Visual FoxPro将记录指针指向该记录,并且测试函数FOUND()返回逻辑真值,EOF()函数返回逻辑假值;否则记录指针将指向记录结束标识,并且测试函数FOUND()返回逻辑假值,EOF()函数返回逻辑真值6.5.2 SEEK命令命令说明(1)参数是一个表达式,该表达式可以是字符型表达式,也可以是数值型或日期型表达式2)若参数是一个字符型常量,那么该字符型常量必须使用定界符3)若参数是一个变量,那么该变量前无需使用宏替换函数&例】若要在Student表中利用SEEK命令快速查找入学成绩为580的学生,那么应执行如下命令:USE StudentINDEX ON entrancescore TO Entr.IDXSEEK 580FIND命令和SEEK命令都是根据索引文件快速查找与给定数据相匹配的记录FIND命令通常用于查找字符型数据,SEEK命令通常用于查找数值型或日期型数据在Visual FoxPro中,如果说索引文件仅仅是对表进行逻辑上的排序的话,那么排序(SORT)命令则是对表进行物理上的排序。

    换句话说,排序命令可以对当前表根据指定的规则进行重新排序,并将重新排序的记录保存成一个新的有序表需要注意的是,Visual FoxPro在使用排序命令时并不改变当前表中记录的位置,而是将排序的结果形成一个新的有序表6.6 建立排序命令格式SORT TO 表名 ON 字段名AD命令功能该命令首先将当前表按照指定的字段进行排序,然后将排序好的记录置于新表中例】若要对Student表根据entrancescore字段进行排序,并将排序结果保存在Studentsort表中另外,Studentsort表中记录的入学成绩均应大于480,那么应执行如下命令:USE StudentSORT TO Studentsort ON entrancescore FOR entrancescore480。

    点击阅读更多内容
    卖家[上传人]:痛苦女王
    资质:实名认证