• 沒有找到結果。

排序与索引

数据表中的数据通常是按输入的先后次序实际存放,有时为了查询等工作需要将表中的 顺序按某种要求重新排列,以加快操作的速度。为此,Visual FoxPro 提供了可对表文件进行 物理和逻辑排列的两种方法——排序和索引。

3.4.1 排序 1.排序的概念

“排序”是将已建好的表记录按某一关键字规定的顺序重新排列,产生一新的表文件。

这个新的表文件的内容可与原来的表文件完全相同,也可以是原来表文件的一部分。“关键 字”是用作排序的字段,其类型不能是 M、G 型。数据从小到大排列称为“升序”。若是字 符型数据,则按其内部代码的值论大小。

2.排序命令(SORT)

格式:SORT TO <新文件名> ON <字段名 1>[/A][/C][/D] [,<字段名 2>[/A][/C][/D]...]

[<范围>] [FIELDS <字段名表>] [FOR <条件>] [WHILE <条件>]

功能:对当前表文件,按指定的字段值重新排序,生成一个以<新文件名>命名的排序表 文件。

说明:

(1)新文件的默认扩展名为.DBF。

(2)若有多个排序字段时,先按命令中<字段名 1>的值顺序排列,<字段名 1>值相同 则按<字段名 2>值的顺序排列,依次类推。其中<字段名 1>称为主关键字,这种排序也称为 多重排序。

(3)/A 表示排升序,缺省时为升序;/D 表示排降序;/C 表示排序时字母不分大小写,

它应用于 C 型字段,若 /C 和/A 或/D 结合时只需要一个斜线,如 /AC 或/DC。

(4)<范围>用于限定 SORT 命令的作用范围,若省略<范围>,则相当于 All。

(5)若有 FIELDS 项,则生成的新表文件中只含<字段名表>中的字段;若 FIELDS <字 段名表>缺省,结构与当前表文件相同。

(6)SORT 命令尽管生成了新的排序文件,但原来的表文件依然存在,只是排序文件 中记录的顺序不同。

(7)带有删除标记的记录不参加排序,显示时原表中还有此记录,但排序后的表中不 存在。

【例 3.10】对 xsda 表,按入学分数 rxf 降序排列,排序后的文件名设为 xsdafs.DBF。

CLEAR &&清屏 USE xsda &&打开 xsda 表

SORT TO xsdafs ON rxf/D &&对 xsda 表按 rxf 降序,排序后文件名为 xsdafs.DBF USE xsdafs &&打开排序文件 xsdafs.DBF,此时 xsda 表自动关闭 LIST &&显示 xsdafs 表的内容

运行结果:

88 Visual FoxPro 程序设计(第二版)

与例 3.1 显示结果对比可以看出,记录按入学分数 rxf 降序排列,但内容没变。注意:1 号与 13 号后的“*”是删除标记。

【例 3.11】对 xsda 表中的男生,按入学分数 rxf 升序排列,入学分数相同的按出生日期 排降序。排序后的文件名为 xsda2.DBF,表文件中只有 XM、XB、CSRQ 和 RXF 四项。

CLEAR &&清屏 USE xsda &&打开 xsda 表

SORT TO xsda2 ON rxf,csrq/D FIELDS xm,xb,csrq,rxf FOR xb="男"

USE xsda2 &&打开排序文件 xsda2.DBF,此时 xsda 表自动关闭 LIST &&显示 xsda2 表的内容

运行结果:

3.4.2 索引 1.索引的概念

表的索引类似于一本书的目录。利用书本的索引来查阅所需的内容要比将整本书逐页翻 阅快捷得多。

表的索引产生索引文件(.IDX 或.CDX),它仅由两部分组成:一部分是有序的索引关键 字;另一部分是记录号,它指出相应记录在表文件中的位置,因此,比原表文件小得多。在 使用时,只要知道索引关键字的值,就能通过相应的记录号索引到该记录在原表中的数据。

由此,索引文件总是依附、从属于原表文件而存在,不可单独使用。

把记录在数据文件中实际存放的顺序称为记录的“物理顺序”,而把索引打开后列表显 示的顺序称为记录的“逻辑顺序”。图 3-38 所示是索引文件和表文件关系示意图。

图 3-38 索引文件和表文件关系示意图

对同一个表,可建立多个不同的索引文件。索引文件建立以后,要打开才能起作用。索

引文件打开以后,记录指针的移动、定位按逻辑顺序进行。索引文件必须在打开表的同时或 之后打开。

为了在两个以上的表间建立关系,必须先对建立关系的字段建立索引。

2.索引类型

(1)索引文件结构。用户可以为一个表同时建立多个索引文件,每个索引文件表示处 理记录的不同顺序。在 Visual FoxPro 中,索引文件结构可以分为两大类:复合索引文件

(CDX)和单索引文件(IDX),复合索引文件又可以进一步分为结构化复合索引文件和非 结构化复合索引文件。

1)单索引文件。单索引文件如图 3-39 所示,仅由一个关键字值和其对应的记录物理位 置构成。

关键字值 物理位置

1500 5 1000 1 ... ...

480 12 图 3-39 单索引文件结构

2)复合索引文件。复合索引文件内部结构如图 3-40 所示。从图中可以看到,复合索引 文件可以由多个关键字值和其对应的多个记录物理位置构成。每一个关键字值和其对应的物 理位置构成了一个索引“标识”,在复合索引文件中,每一个索引标识等价于一个独立索引 文件。换言之,复合索引文件等价于多个独立索引文件。

图 3-40 复合索引文件结构

结构化和非结构化复合索引文件的结构是相同的,但在形式上和使用上仍然存在一些差 异。结构化复合索引文件的文件名与源表同名,非结构化复合索引文件的文件名与源表不同 名;结构化复合索引文件随着源表的打开而自动打开,非结构化复合索引文件不会随着源表 的打开而自动打开,要由用户打开。

标识 1 标识 2 标识 n

关键字值 1 物理位置 1 关键字值 2 物理位置 2 关键字值 n 物理位置 n

1500 5 胡六四 3 1001 1

1000 1 江涛 5 1002 2

# # # # # #

480 12 丁家兵 9 6003 13

单索引文件(IDX)

复合索引文件(CDX) 结构化复合索引文件

非结构化复合索引文件 索引文件结构

90 Visual FoxPro 程序设计(第二版)

(2)索引文件类型。索引可分为以下 4 种类型:

1)主索引:仅适合数据库表。主索引的索引表达式不允许出现重复值和空值,一个数 据库表只能建一个主索引。

2)候选索引:候选索引与主索引具有相同的特性,索引表达式不允许出现重复值和空 值。一个数据库表可以建多个候选索引。数据库表无主索引时,可以指定一个候选索引作为 主索引。自由表也可以建立候选索引。

3)普通索引:普通索引的索引表达式可以出现重复值。可以建多个普通索引。

4)唯一索引:唯一索引的索引表达式可以出现重复值,但在索引文件中仅出现重复值 的第一条记录。可以建多个唯一索引。

3.索引操作

索引操作主要是指建立、插入、删除索引等,可通过表设计器和命令方式进行。

(1)表设计器方式建立索引。对数据库表学生档案(xsda.dbf)中的“学号(xh)”字 段建立主索引(升序),“姓名(xm)”字段建立普通索引(降序),“入学分(rxf)”字段建 立普通索引(升序)。建立方法如下:

1)以独占方式打开数据库表 xsda.dbf,选择“显示”菜单的“表设计器”命令。

2)单击“索引”选项卡,依次选择或输入索引名、索引类型、索引表达式和筛选条 件,如图 3-41 所示。

图 3-41 “表设计器”的“索引”选项卡 说明:

“排序”:即指定索引是升序还是降序,向上箭头为升序(从小到大),向下箭头为降 序。排序按钮可以通过鼠标单击在两种状态间切换。西文字符按其 ASCII 码值论大小,汉字 等字符串按其内码论大小。

“索引名”:就是索引标识名,可以根据用户的意愿起名。

“类型”:即上述介绍的 4 种索引类型之一(主索引、候选索引、普通索引和唯一索 引),但自由表没有主索引。

“表达式”:就是索引表达式。可以仅包含一个字段,也可以是多个字段的组合,如 xb+DTOC(csrq),即按“性别 xb”索引,如性别相同则按“出生日期 csrq”索引等。

“筛选”:筛选条件是一个逻辑表达式,相当于命令中的 FOR 条件。如果有筛选条件,

格式:INDEX ON <索引表达式> TAG <索引标识名>[OF <CDX 文件名>]|TO <索引文件名>

[FOR <条件>][ASCENDING|DESCENDING]

TAG|TO:“TAG <索引标识名>”用来指定索引标识名,如不含“OF <CDX 文件名>”,

表示创建结构化复合索引文件,结构化复合索引文件名与表同名,如含“OF <CDX 文件名

>”,表示创建非结构化复合索引文件,OF 后指定的是存放该索引的复合索引文件名;“TO <

索引文件名>”,则创建独立的索引文件(IDX)。TAG 和 TO 只能任选其一。

FOR <条件>:指定索引过滤条件。

ASCENDING|DESCENDING:ASCENDING 表示索引顺序为升序,“DESCENDING”

表示索引顺序为降序,此为可选项,可任选其一,默认为升序。

UNIQUE|CANDIDATE:UNIQUE 指定唯一索引,即索引文件中只包含索引关键字相同 的第一个记录,CANDIDATE 指定候选索引,只有在创建复合索引时才能使用。

ADDITIVE:所有先前已打开的索引文件仍保持打开状态。如省略,则自动关闭先前已

92 Visual FoxPro 程序设计(第二版)

【例 3.12】建立单索引。

use xsda &&打开表 xsda

copy next 5 to xsda1 &&复制表 xsda 中的前 5 个记录,生成一个新表 xsda1 clear &&清屏

use xsda1 &&打开表 xsda1

list &&显示表 xsda1 中的所有记录 运行结果:

index on xh to xsdaxh.idx &&对表 xsda1 按学号 xh 建立索引,索引文件名为 xsdaxh.idx list &&显示按学号 xh 建立索引后的表 xsda1

运行结果:

由上可知,记录号并没改变(物理顺序),而显示顺序按学号 XH 大小改变了(逻辑顺序)。

【例 3.13】对 xsda 索引,按入学分 rxf 升序、入学分相同的按出生日期 csrq 降序显示。

USE xsda

INDEX ON STR(rxf)+ DTOC(csrq) TO xsda2 LIST (显示内容略)

【例 3.14】为 xsda1 建立结构化复合索引文件,标识为“学号”,按“降序”排列。

clear

use xsda1 index on xh tag 学号 descending list

运行结果:

【例 3.15】为 xsda1 建立结构化复合索引文件,标识为“性别”,指定“唯一”

clear

use xsda1 index on xb tag 性别 unique list

运行结果:

注意

以 上 两 例 中 , 两 条 INDEX ON 命 令 创 建 了 结 构 化 复 合 索 引 文 件

(xsda1.cdx),并在其中建立了两个索引标识(“学号”和“性别”)。

若要建立非结构化复合索引文件,必须使用 OF 参数指明非结构化复合索引文件名,如:

INDEX ON xm TAG 姓名 OF xsdacd2.cdx INDEX ON xb TAG 性别 OF xsdacd2.cdx

由上述可知,复合索引完全可以代替单索引。

ORDER[<expN>|[TAG]<索引标志>][OF<非结构索引文件名>]

[ASCENDING|DESCENDING]]

USE xsda index xsdacd2 ORDER tag 姓名 of xsdacd2 &&打开表的同时打开复合索引文件

USE xsda index xsdacd2 ORDER tag 姓名 of xsdacd2 &&打开表的同时打开复合索引文件

相關文件