第六章表的索引与统计
一、建立表索引文件
1.菜单方式建立索引
索引文件中包含根据“学号”字段建立的候选索引(索引标记名为XH)、根据“姓名”字段建立的普通索引(索引标记名为XM)。
首先建立或打开XSDA表,执行系统菜单中的显示/表设计器命令,切换到索引选项卡
(1)在索引名框中,输入XH;从类型列表中,选定索引类型为“候选索引”;在表达式框中,输入作为记录排序依据的学号,或者通过单击表达式框后面的对话按钮,从弹出的“表达式生成器”中建立。
(2)在第二个索引名框中,输入XM;从类型列表中选定索引类型为“普通索引”;在表达式框中输入姓名。
(3)单击确定后,弹出结构为永久性更改的对话框,单击“是”按钮。
建立的索引在XSDA.CDX文件中,记录的排列顺序会按照先根据学号升序排列,学号相同时,再根据姓名首字母的拼音升序排序。
说明:
(1)索引的分类:
a.单索引文件:只存储一个索引的索引文件,扩展名为.IDX。又可细分为:标准单索引文件和压缩单索引文件;
b.复合索引文件:存储多个索引的索引文件,扩展名为.CDX。又可细分为:结构化复合索引文件和非结构化复合索引文件
(2)索引方式
a.主索引: 关键字不可重复
b.候选索引:关键字不可重复
c.唯一索引:关键字可重复,与旧版本兼容
d.普通索引:关键字可重复
2.命令方式建立索引
命令格式:
INDEX ON <索引关键字>
TO <单索引文件名>|
TAG <索引标识符名> [OF <复合索引名>]
[FOR <条件>]
[COMPACT]
[ASCENDING]|[DESCENDING]
[UNIQUE|CANDICATE][ADDITIVE]
说明:
1)索引关键字可以是单个字段名,或用字段名组成的表达式。
2)TO子句是建立单索引文件。
3)TAG是建立复合索引标识,当不选OF子句时建立的是与表同名的结构化复合索引文件,当选OF子句时建立的是非结构化复合索引文件。
4)COMPACT用来指定单索引文件是压缩的。复合索引总是压缩的。
5)ASCENDING、DESCENDING子句表示升、降序,默认为升序。
6)UNIQUE子句建立唯一索引。
7)CANDIDATE子句建立候选索引。
8)ADDITIVE子句建立该索引文件是不关闭以前打开的索引文件,默认是关闭以前打开的索引文件。
USE 员工&&打开员工表
INDEX ON 编号 TAG BH CANDIDATE&&将编号列设为候选索引
INDEX ON 部门代码 TAG BMDM&&将部门代码设置为普通索引
运行结果为:
此时的索引为:
二、指定主控索引
要让索引起作用,必须指定其为主控索引,否则,数据表的访问顺序仍然是原来的物理顺序。
1.菜单操作
打开XSDA.DBF文件,表/属性命令,弹出工作区属性对话框
单击索引顺序项的下拉列表,选择XH索引标记,单击确定,打开数据记录浏览窗口,观察记录排列顺序。
2.命令操作
USE 员工&&打开数据表
BROWSE&&浏览当前记录
运行结果为:
SET ORDER TO TAG BH&&指定主控索引为 BH
BROWSE&&浏览当前记录
运行结果为:
注意:主控索引只是改变了记录输出的顺序,记录在数据表中的物理顺序并没有发生变化,而且在指定了主控索引后,TOP和BOTTOM均是在索引排序后逻辑上的第一条和最后一条记录,同样,用SKIP命令移动记录指针时也是排序后的逻辑顺序。
CLOSE ALL&&关闭工作区的所有表文件
USE XSDA&&打开XSDA表
GO BOTTOM&&将指针从当前记录移动到最后一条记录
?RECNO()&&返回当前记录号
运行结果为:
SET ORDER TO TAG XH&&按照XH进行排序
GO TOP&&将指针移动到第一条记录
?RECNO()&&返回当前记录号
运行结果为:
SKIP +2&&将指针向下移动两条记录
?RECNO()&&返回当前记录号
运行结果为:
说明:这里的记录号之所以是5,是因为我们将表按照学号列进行了排序,这里可以对表格进行浏览:
BROWSE&&浏览表格
运行结果为:
从浏览结果来看,指针的定位并没有问题,而肖婷婷也确实是未排序之前的表中的第五条记录:
GO BOTTOM&&将指针移动到最后一条记录
?RECNO()&&返回当前记录号
运行结果为:
此时再次浏览表格:
现在的最后一条记录确实是原表中的第七条记录。
三、索引查询
USE XSDA&&打开XSDA表
SET ORDER TO TAG XM&&按照XM进行排序
SEEK “曲丽芳”&&查找姓名为曲丽芳的记录
?FOUND(),EOF()&&FOUND()返回查找姓名为曲丽芳的记录是否找到,EOF()检查指针是否已经定位在最后一条记录之后。
运行结果为:
DISPLAY&&展示查找的记录
运行结果为:
SEEK “李小明”&&查找姓名为李小明的记录
?FOUND(),EOF()&&FOUND()返回查找姓名为李小明的记录是否找到,EOF()检查指针是否已经定位在最后一条记录之后。
运行结果为:
DISPLAY&&展示查找的记录
运行结果为:
四、数值型字段的求和与求平均值
1.SUM命令
SUM命令是对当前数据表中指定范围内满足条件的记录的纵向求和运算,即在同一个数值型字段的求和运算。
USE 员工&&打开员工表
SUM 基本工资 TO A1&&将基本工资加和的结果传给A1
?A1&&显示A1的值
运行结果为:
SUM 基本工资 FOR 部门代码=”01” TO B1&&将部门代码为01的基本工资加和的结果传给B1
?B1&&显示B1的值
运行结果为:
2.AVERAGE 命令
AVERAGE 命令是对当前数据表中指定范围内满足条件的记录的纵向求平均值运算,即同一个数值型字段的求平均值运算。
USE 员工&&打开员工表
AVERAGE 基本工资TO A1&&将基本工资平均值的结果传给A1
?A1&&显示A1的值
运行结果为:
AVERAGE 基本工资 FOR 部门代码=”02”TO B1&&将部门代码为02的基本工资平均值传给B1
?B1&&显示B1的值
运行结果为:
五、统计记录个数
COUNT 命令是统计当前数据表中指定范围内符合条件的记录个数。
USE 员工&&打开员工表
COUNT ALL TO A1&&将全部计数的结果传给A1
?A1&&显示A1的值
运行结果为:
COUNT ALL FOR 部门代码=”11”TO B1&&将部门代码为11的计数结果传给B1
?B1&&显示B1的值
运行结果为:
六、分类汇总
分类汇总操作是对已经建立了索引并且指定了主控索引的数据表,按分类关键字进行分类汇总。其操作是对数据表中具有相同关键字表达式值的所有连续记录进行求和,并将所求的和作为一条新记录送入新数据表。
USE 员工&&打开员工表
SET ORDER TO BMDM&&将员工表按照BMDM进行排序
BROW&&浏览表格
运行结果为:
TOTAL ON 部门代码 TO GZHZ&&按照部门代码进行分类汇总的值存储在GZHZ中,注意此处并不会有答案,分类汇总的字段应该为索引。
USE GZHZ&&打开GZHZ(分类汇总的结果是一张表)
BROWSE&&浏览表格
运行结果为:
