您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页第4章 索引与排序

第4章 索引与排序

来源:五一七教育网
第4章 索引与排序

教学目标与要求:

熟练掌握索引及索引文件的概念 熟练掌握索引的建立及使用

熟练掌握表记录的查询、统计与汇总

教学重点难点:

索引及索引文件的概念 索引的建立及使用

学习指导:

通常情况下,表中的各条记录是按输入顺序排列的,然而表的快速查询、记录的统计汇总,以及对数据库中的多个表建立各种关系时都要求对表中的记录按某种特定的次序重新排序(输出)。本章主要介绍索引技术的排序方法以及建立在索引基础上的表的查询、统计与汇总等操作。

4.1索引与排序

4.1.1 索引及索引文件概述

1. 索引的概念

索引是使表中的记录有序排列的一种技术。一般情况下,表中记录的顺序是由记录输入的前后顺序决定的,并用记录号予以标识。为了加快记录的检索、显示、查询及汇总速度,需要对表中记录顺序重新组织,而索引技术则是实现这些目的的最为可行的方法。

索引实际上是表文件按索引关键字表达式值的大小排序的一份目录,它里面记载着索引关键字表达式与记录号的一种对应关系,从而可以确定对记录的处理顺序。因此,索引实际上是对表文件的一种逻辑排序,可以是升序,也可以是降序。其中的索引关键字表达式可以是由表的一个字段,也可以是由某些字段、变量、函数等组成的一个复合表达式。如果把数据表比作一本书,则表的索引就是这本书的目录,可以通过索引大大加快表的查询速度。表及其按姓名字段建立的索引如下:

1004 1005 宋文彬 胡大民 男 男 T T 1002 1003 王爱民 张小华 男 女 T F 职工号 1001 姓名 胡一民 性别 男 婚否 T 姓名 胡大民 胡一民 宋文彬 王爱民 张小华 记录号 5 1 4 2 3 职工.dbf

根据姓名字段建立的升序索引,其名称可以是 XM

VFP中建立索引的两个重要元素:

(1) 索引关关键字表达式:它是用来创建索引的的依据,可以是表中的某个特定字段,也可以是由字段、变量、函数等组成的复合表达式。

(2) 索引名(索引标识):索引的名称,是一个标示符。其命名规则:以字母或汉字开头,后跟字母、

第四章 第 1 页 共 16 页

汉字、数字或下划线,长度<=10个字符。

2. 索引的类型

VFP中建立的索引有4种类型,分别是: (1) 主索引

主索引是一个不允许索引表达式值重复出现或NULL值的索引。如表中的“学号”字段就可作为主索引关键字,而“姓名”、“成绩”、“出生日期”等字段就不能作为主索引,因为这些值可能会有重复。一个表只能有一个主索引。

(2) 候选索引

候选索引也是一个在索引表达式中不允许出现重复值或NULL值的索引,此种索引是主索引的候选索引。一个表可以有多个候选索引。

(3) 普通索引

普通索引是最常用的索引类型,无任何限定,也就是说该类索引表达式的值允许重复。一个表可以建立多个普通索引。

(4) 唯一索引

唯一索引允许索引表达式有重复值。当索引表达式有重复值时,只有第一个记录进入该索引。 需要说明的是,建立的表没有添加到数据库中时,索引类型没有主索引。本章涉及的表索引类型就没有主索引类型。

3.索引文件及其种类

索引一旦建立好都要存放在索引文件中。一个索引文件可以只包含一个索引,也可包含多个索引。 只能包含一个索引的索引文件称为单索引文件,其扩展名为“.IDX”,它是为了与FoxBase+兼容而保留的,在Visual FoxPro中一般很少采用。

包含一个或多个索引的索引文件称为复合索引文件,其扩展名为“.CDX”,每一个索引在其中都有一个索引标识。复合索引又分为结构化和非结构化两种,若定义复合索引文件时用户为它取了名字,则其为非结构化的,否则为结构复合化索引。在Visual FoxPro中一般采用结构化复合索引文件最为方便。结构化复合索引文件的主名与表文件同名,只是扩展名为“.CDX”。如“学生基本情况表.DBF”的结构复合索引文件名为“学生基本情况表.CDX”。结构复合索引文件随着表的打开而自动打开,在表中添加、更改或删除记录时,可随表自动更新。在后面讲解的索引文件都是结构复合索引文件。对同一个表可以建立多个索引,每一个索引代表一种处理记录的顺序,但在任何时刻,最多只有一个索引起作用,这个索引称为主控索引

4.与索引有关的几个基本概念

(1) 记录的物理顺序、逻辑顺序和使用顺序

 

物理顺序:记录在表文件中的实际排列次序。此顺序在输入记录时已确定,用记录号表示。 逻辑顺序:对于一个打开的表文件,若有主控索引存在,则表文件中的记录将按主控索引的顺序使用顺序:实际展现给用户,供用户使用的记录顺序称为使用顺序。有主控索引存在时,记录的

展现给用户,供用户使用。记录在主控索引中的顺序称为逻辑顺序。

使用顺序是逻辑顺序,否则是物理顺序。

(2) 首记录和末记录

在使用顺序中,第一条的记录称为首记录,最后一条的记录称为末记录。 (3) 指针的移动及范围项

第四章 第 2 页 共 16 页

在执行一些命令时,指针会自动移动,这种移动是按记录的使用顺序进行的,因此,命令中的范围项也是以使用顺序为基础的。如NEXT 5是指从当前记录开始,按使用顺序往下共五个记录(而record n 则不然)。

4.1.2 索引的建立

在Visual FoxPro中建立索引是非常容易的事,下面仍以“学生基本情况表.DBF”为例来讲解建立索引的方法。

1.单关键字索引的建立

由于对一个表可以建立多个索引,我们为该表建立三个索引:

(1) 以“学号”字段建立第一个索引,索引类型为候选索引,索引顺序为“升序”,索引表达式为“学号”,索引名也为“学号”。

(2) 以“出生日期”字段建立第二个索引,索引类型为普通索引,索引顺序为“降序”,索引表达式达式为“出生日期”,索引名也为“出生日期”(这里只对女同学按“出生日期”建立索引)。

(3) 以“入学成绩”字段建立第三个索引,索引类型为普通索引,索引顺序为“降序”,索引表达式为“入学成绩”,索引名也为“入学成绩”。

具体建立步骤如下:

① 打开“学生基本情况表.DBF”,选择“显示”菜单项中的“表设计器”命令,在出现的“表设计器”对话框中的“字段”选项卡上显示出表文件的结构,如图4-1所示。

② 建立第一个索引:单击“学号”字段,选择索引为升序。 ③ 建立第二个索引:单击“出生日期”字段,选择索引为降序。 ④ 建立第三个索引:单击“入学成绩”字段,选择索引为降序。

图4-1 “表设计器”对话框的“字段”选项卡

⑤ 在图4-1中单击“索引”选项卡,出现如图4-2所示的“索引”选项卡界面。

图4-2 “表设计器”对话框的“索引”选项卡

⑥ 在图4-2中分别设置好每个索引的索引名、索引类型和索引表达式。

⑦ 为第二个索引筛选记录:在图4-2中选定“出生日期”索引,然后单击其后的“筛选”按钮,在出现的“表达式生成器”对话框中设置好筛选条件,如图4-3所示。

第四章 第 3 页 共 16 页

图4-3 “表达式生成器”对话框

⑧ 设置好后按“确定”按钮,完成筛选表达式的建立,返回“表设计器”的“索引”选项卡对话框。⑨ 完成索引设置后,单击“确定”按钮,这时,系统会自动检测目前的记录数据是否违反索引关键字设定的规则,出现如图4-4所示的消息框,单击“是”按钮即可。

图4-4 表设计器消息框

2.多关键字索引的建立

为了提高对多个字段建立过滤器的查询或视图的运行效率,可以在“索引表达式”中对多个字段建立索引,实现对记录的排序工作,这种索引是按照表达式的值来排序的。

下面给“学生基本情况表.DBF”按照“出生日期”和“入学成绩”两个字段建立第四个索引,即当“出生日期”相同时,再按“入学成绩”排序。具体方法如下:

(1) 打开“学生基本情况表.DBF”,选择“显示”菜单项中的“表设计器”命令,单击“索引”选项卡。在“索引”选项卡中的第三个索引下的空白索引名处单击并输入索引名“日期成绩”,如图4-5所示。

图4-5 “表设计器”对话框的“索引”选项卡

(2) 设置索引类型为普通索引,然后单击表达式栏后的表达式生成器按钮,在出现的“表达式生成器”对话框中设置好索引表达式:DTOS(出生日期)+STR(入学成绩,5,1),单击“确定”按钮后又回到图4-5所示的表设计器的索引选项卡。

(3) 设置好后单击“确定”按钮,在出现的如同图4-4所示的对话框中同样单击“是”按钮即可。

4.1.3 使用索引(对表排序)

给一个表建立了一个索引后,如果不指定该索引为主控索引,它是不会对表起任何作用的。要让一个索引发挥作用,必须指定该索引为主控索引。在一个表的多个索引中,一次只能有一个索引被指定为主控索引。如果一个表没有指定任何索引为主控索引,那么,该表中的记录仍按原物理顺序排序;如果指定了某个索引为该表的主控索引,才能使该表的记录按指定的索引顺序排序。

下面使用前面建立好的索引对表记录进行排序:

(1) 打开表并进入“浏览”窗口,选择“表”菜单项中的“属性”命令,出现如图4-6所示的“工作区属性”对话框。

第四章 第 4 页 共 16 页

图4-6 “工作区属性”对话框

(2) 在“索引顺序”选项中,系统默认为“无顺序”,即无主控索引,表示不按任何索引来排序,只按数据记录实际位于表中的物理位置顺序来排序。

(3) 单击“索引顺序”后面的下拉按钮,在出现的下拉列表中选择某个索引为主控索引,再单击“确定”按钮,回到“浏览”窗口,这时可以看到表中记录已按该索引排序。

(4) 如选定“学号”索引项为主控索引,则“浏览”窗口显示的排序结果如图4-7所示。

图4-7 按“学号”索引项排序

(5) 如选定“出生日期”索引项为主控索引,则“浏览”窗口显示的排序结果如图4-8所示。

图4-8 按“出生日期”索引项排序

(6) 如选定“入学成绩”索引项为主控索引,则“浏览”窗口显示的排序结果如图4-9所示。

图4-9 按“入学成绩”索引项排序

(7) 如选定“日期成绩”索引项为主控索引,则“浏览”窗口显示的排序结果如图4-10所示。

图4-10 按“日期成绩”索引项排序

第四章 第 5 页 共 16 页

4.1.4 使用键盘命令建立索引

在Visual FoxPro的命令窗口使用键盘命令INDEX也可以给表建立索引。

命令格式:INDEX ON <索引关键字表达式> TAG <索引标识> [FOR <条件>]

[ASCENDING | DESCENDING]

命令功能:根据指定的<索引关键字表达式>为当前打开的表文件建立一个索引,索引名用<索引标识>来表示。该索引存放在该表文件的结构化复合索引文件(.CDX)中。

说明:

① 若命令中无[FOR]选项,将对所有记录进行索引;否则,只对符合条件的记录进行索引。

② 在[ASCENDING|DESCENDING]选项中,若选ASCENDING,则按索引表达式值的升序建立索引;若选DESCENDING,则按降序建立;若缺省该项,则默认为按升序建立。

注意:使用该命令对表建立的最新索引默认就是主控索引,表文件将以这个最新建立的索引为序排列记录。要重新设定主控索引,可使用SET ORDER TO <索引标识>命令。

例4-1 给“学生成绩表1.DBF”建立多个索引,并按各索引对表中记录排序。 1. 用单个字段建立索引

用“学号”字段建立索引,命令如下: SET DEFAULT TO D:\\学籍项目 USE 学生成绩表1 LIST

屏幕显示结果如下:

图 4-11

INDEX ON 学号 TAG XH LIST

屏幕显示结果如下:

图 4-12

2. 用多个字段建立索引

(1) 用“高等数学”与“大学英语”的成绩和来建立索引 继续在命令窗口键入以下命令:

INDEX ON 高等数学+大学英语 TAG GSYY FOR 平均>=80 LIST

屏幕显示结果如下:

第四章 第 6 页 共 16 页

图 4-13

(2) 先按“高等数学”的降序来建立,当“高等数学”相同时,再按“大学英语”的降序建立索引 继续在命令窗口键入以下命令:

INDEX ON STR(高等数学,3,0)+STR(大学英语,3,0) TAG GY DESCENDING LIST

屏幕显示结果如下:

图 4-14

要强调的是,当需要使用多个字段建立索引时,如果索引关键字表达式中使用了包括非字符型等不同类型字段,则必须通过相关函数(如STR( ),DTOC( ),TTOC( )等)将非字符型字段转换成字符型字段。 例如,如果要按照职工号、姓名、出生年月、基本工资的顺序对记录进行索引,可以建立“字符型”的索引表达式: ①INDEX ON 姓名 + DTOC(出生年月) + STR(基本工资,8,1) TAG zmdz ②INDEX ON 姓名 + DTOC (出生年月) TAG xmcs

3. 指定主控索引

前面已经为“学生成绩表1.DBF”建立了多个索引,而且目前索引标识为GS的索引为主控索引,下面重新指定主控索引并重排记录。(也可以在表菜单下的属性选项中设置)

继续在命令窗口键入以下命令: SET ORDER TO XH

LIST &&显示结果如图4-12所示 SET ORDER TO GSYY

LIST &&显示结果如图4-13所示

USE

补充

一.索引的修改

对数据表中的记录进行增、删、改、插等操作时,索引文件中原来存储的记录顺序必须随之改变。但是,如果在对表中的数据进行修改时, 没有打开对应的索引文件, 或者被修改的字段值不是主索引,那么索引文件中的索引信息就不能随表数据的修改而改变,以后使用这种未随之改变的索引文件时,就会出现索引错误。 

下列两种方法, 可以解决由于数据表更新与索引文件更新不同步出现的问题:  (1) 重新索引: INDEX ON <索引表达式> TAG <索引标记> (2) 使用更新索引命令,自动更新当前表的所有存在的索引.

第四章 第 7 页 共 16 页

命令格式: REINDEX

(也可以选”表”菜单中的”重新建立索引”命令) 二.索引的关闭

①命令格式: SET ORDER TO 功能: 撤消主控索引.

(也可以在表菜单下的属性选项中设置) ②命令格式: CLOSE INDEX 功能: 关闭索引.

三.删除索引命令

命令格式:DELETE TAG <索引标识清单>

功能:该命令用于从结构化复合索引文件中删除一个或多个索引标识。(也可以在表设计器中进行),

索引被全部删除,则结构化复合索引文件既被删除。

四.:索引文件的使用 打开有两种方式:

①伴随表文件打开而自动打开,如结构化复合索引文件 ②新建索引为打开状态

③若是非结构化复合索引文件,需另行打开。

命令格式1:SET INDEX TO [索引文件说明表] | [TAG <索引标识> OF <非结构化复合索引文件>] 命令格式2:USE [<表文件说明>] [IN <工作区>] [TAG <索引标识> OF <非结构化复合索引文件>]

例如:按姓名降序建立40岁以上职工的索引 inde on 姓名 tag xm for YEAR(DATE()) - YEAR(出生年月) >= 40 desc set order to xm list

4.1.5 对表文件进行物理排序——SROT命令

索引是对表文件的一种逻辑排序,这种技术并未改变记录的原来物理顺序,只是改变了记录的使用顺序。排序命令SORT是把表文件中的记录取出来进行物理排序后重新生成一个于原表的新表文件,这个新表文件的物理顺序和原表文件不一样了,所以可以理解为是对表文件的一种物理排序,但是值得注意的是原表文件照样存在而且并未受任何影响。

命令格式:SORT TO <新表文件说明> ON <字段名1> [/A] [/D] [/C] [,<字段名2>[/A] [/D] [/C], <字段名3>[/A] [/D] [/C],…] FIELDS <字段名表> [FOR<条件>]

命令功能:根据指定的字段把当前打开的表文件记录重新排序,并把排好序的记录重新生成一个新表文件。

说明:

① 首先按<字段名1>排序,若<字段名1>有相同值,则再按<字段名2>排,依次类推。

第四章 第 8 页 共 16 页

② 若有[FIELDS]项,则生成的新表中只有<字段名表>所列举的字段;否则有全部字段。若有[FOR]项,则生成的新表中只有满足条件的记录;否则有全部记录。

③ 若<新表文件名>的扩展名省略,则系统默认为是.DBF。

例4-2 对“学生成绩表1.DBF”按“学号”进行排序,并且生成的新表文件只要“学号”、“总分”和“平均”三个字段,而且只要平均成绩在80分以上的记录。

在命令窗口键入以下命令: SET DEFAULT TO D:\\学籍项目 USE 学生成绩表1

SORT TO 成绩表3 ON 学号 FIELDS 学号,总分,平均 FOR 平均>=80 USE 成绩表3 LIST

屏幕显示结果如下:

图 4-15

4.2 表记录的查询与数值统计

4.2.1 表记录的查询

在Visual FoxPro中,提供了两种查询记录的方法:一种是顺序查询;另一种是索引查询。其中顺序查询是指对表中记录挨个逐条查找,查找速度慢,但是顺序查询不要求表建立索引,可以在原表中直接进行查询。而索引查询要求表必须先建立好索引,而且还要设置成主控索引,查找时先在主控索引中查找相匹配的关键字,然后可按相应的记录号快速定位记录指针,查找速度快。

1. 顺序查询命令——LOCATE与CONTINUE (1) LOCATE命令

命令格式:LOCATE [<范围>] FOR <表达式>

命令功能:在规定范围内,按照表文件记录的使用顺序顺序查找满足条件的第一条记录,并把记录指针定位在找到的记录上。

说明:

① 若省略[范围]项,则默认为范围是ALL。

② 若找到,则记录指针指向该记录,FOUND() 函数(查找成功函数)为.T.;若未找到,则FOUND() 函数为.F.,指针指向范围后第一条记录;当范围项省略或为ALL时,指针指向表文件尾后,即最大记录号加1,这时,EOF() 函数为.T.。

③此命令即可在原表中查找,也可在索引中查找。 (2) CONTINUE命令

LOCATE命令在找到一个符合条件的记录后,就停止查找。但在指定范围内可能还存在符合条件的其它记录,CONTINUE命令将继续查找下去。

命令格式:CONTINUE

命令功能:此命令在执行LOCATE命令后执行,(在所剩区域内)继续查找符合条件的下一条记录(,

第四章 第 9 页 共 16 页

直至找不到为止)。

例4-3

SET DEFAULT TO D:\\学籍项目 USE 学生成绩表1

LOCATE FOR 大学英语=80

DISPLAY &&显示当前记录 屏幕显示结果如下:

记录号 学号 姓名 高等数学 大学英语 大学语文 总分 平均 4 20040304 李明飞 65 80 70 215 71.7

继续输入:

? FOUND(),RECNO() &&显示两个有关查找函数的值 屏幕显示结果如下: .T. 4 CONTINUE

? FOUND(),RECNO() 屏幕显示结果如下: .T. 6 DISPLAY 屏幕显示结果如下:

记录号 学号 姓名 高等数学 大学英语 大学语文 总分 平均 6 20020302 赵新月 85 80 75 240 80.0

CONTINUE

? FOUND(),RECNO(),EOF() 屏幕显示结果如下: .F. 9 .T.

2. 索引查询命令 (快速查询)——SEEK 命令格式:SEEK <表达式>

命令功能:在主控索引中快速查找与SEEK后面的<表达式>相匹配的索引关键字所指的第一条记录,并把记录指针定位在该记录上。

命令功能:执行这一命令时,系统根据主控索引,查找与命令中<表达式>值相匹配的记录。如果查找成功,则把指针指向逻辑顺序中第一条符合条件的记录,FOUND()为.T.,RECNO()的值为该记录号,EOF()为.F.;若查找失败,则记录指针指向主控索引尾后,RECNO()的值为主控索引记录数加1,FOUND()为.F.,EOF()为.T.。

说明 :

① SEEK命令不仅可以查询N、C型数据,而且还可查询D、L型数据。

② 要查询的数据还可用表达式给出;当要查询的数据是字符型表达式时,该字符型表达式的值可以是该索引关键字数据值的全部,也可以是从它左边开始的一部分(即精确匹配或模糊匹配); ③要查询的数据是字符常量,必须用界定符;当要查询的数据是数值型表达式时,该表达式的值必须

第四章 第 10 页 共 16 页

等于索引关键字表达式的值,查找方能成功。 说明

① 若查找成功,可用DISPLAY命令显示,此时,FOUND() 函数为.T.;若找不到,则FOUND() 函数为.F.,而EOF() 函数为.T.。

② SEEK只能查找到满足条件的首记录,若要继续查找,可用SKIP和DISPLAY命令(???)。 ③ SEEK后面的<表达式>只能和索引关键字相对应,但其可以是常量,也可以是变量。 例1.

USE 职工

INDEX ON 姓名 TAG XMSI SET ORDER TO XMSI SEEK \"宋\" DISPLAY

屏幕显示结果如下:

记录号 职工号 姓名 性别 出生日期 婚否 工资 职称 简历 部门 2 1004 宋文彬 男 73.12.14 .T. 128.34 助工 Meno 车间

1: 请同学们读下语句序列并思考问题 思考

第四章 第 11 页 共 16 页

USE 职工 INDEX ON 姓名+DTOC(出生年月) TAG XMCS SET ORDER TO XMCS SEEK \"宋\" &&查找成功吗? SEEK \"宋文彬12/14/73\" &&查找成功吗?为什么? SEEK \"宋文彬 12/14/73\" &&查找成功吗?为什么? INDEX ON TRIM(姓名)+DTOC(出生年月) TAG XMCS1 SET ORDER TO XMCS1 SEEK \"宋文彬 12/14/73\" &&查找成功吗?为什么? SEEK \"宋文彬12/14/73 \" &&查找成功吗?为什么? 如果你能正确回答以上问题,并能说明为什么,那么可以说你掌握的很好!!! 思考2: 要显示索引中所有满足要求的记录,下面例子可以实现吗? 为什么? USE 职工 &&职工表已按”职称”字段索引 INDEX ON 职称 TAG ZC SET ORDER TO ZC SEEK \"运\" DISP while 职称=\"运\" 如果你能正确回答以上问题,并能说明为什么,那么你又上了一个 台阶!!! 例4-4

SET DEFAULT TO D:\\学籍项目 USE 学生基本情况表 SET ORDER TO 学号 SEEK „20040304‟

DISPLAY 屏幕显示结果如下:

记录号 学号 姓名 性别 出生日期 入学成绩 4 20040304 李明飞 男 04/25/86 657.0 SET ORDER TO 入学成绩 RXCJ=570 SEEK RXCJ

DISPLAY 屏幕显示结果如下:

记录号 学号 姓名 性别 出生日期 入学成绩 8 20040301 袁 叶 男 02/27/87 570.0 SET ORDER TO 出生日期 SEEK {^1985/05/26}

DISPLAY 屏幕显示结果如下:

记录号 学号 姓名 性别 出生日期 入学成绩 6 20020302 赵新月 女 05/26/85 688.0 SET ORDER TO 日期成绩

SEEK DTOC({^1984/10/18})+STR(562,5,1) DISPLAY 屏幕显示结果如下:

记录号 学号 姓名 性别 出生日期 入学成绩 5 20010202 王 星 男 10/18/84 562.0 班干部 简历 照片 .T. memo gen 班干部 简历 照片 .F. memo gen

班干部 简历 照片 .T. memo gen

班干部 简历 照片 .F. memo gen

第四章 第 12 页 共 16 页

4.2.2 表记录个数的统计——COUNT命令

命令格式:COUNT [<范围>] [FOR <条件1>] [WHILE <条件2>] [TO <内存变量名>]

命令功能:在当前打开的表文件中统计指定范围内满足条件的记录个数,并把统计的结果保存在指定的内存变量中。

说明:若[范围]项省略,则默认为是ALL;若COUNT后面的选项全部省略,则统计表中所有记录个数。

例4-5

SET DEFAULT TO D:\\学籍项目 USE 学生基本情况表

COUNT FOR 性别=„女‟ AND 入学成绩>=600 TO G ? G

屏幕显示结果为: 2

4.2.3 表中数值型字段求和——SUM命令

命令格式:SUM [<数值型表达式表>] [<范围>] [FOR <条件1>] [WHILE <条件2>];

[TO <内存变量名表> | ARRAY <数组名> ]

命令功能:对当前打开的表文件中的数值型字段累加求和,并把求得的结果保存在指定的内存变量或数组中。

说明:若[范围]项省略,则默认为是ALL;若[数值型表达式表]项省略,则对表中所有数值型字段求和。 例4-6 根据“学生成绩表1.DBF”求出99级学生的三门课成绩和。 SET DEFAULT TO D:\\学籍项目 USE 学生成绩表1

SUM 高等数学,大学英语,大学语文 FOR LEFT(学号,2)='99' TO A,B,C 屏幕显示结果为:

高等数学 大学英语 大学语文

150.00 110.00 145.00

4.2.4 表中数值型字段求均——AVERAGE命令

命令格式:AVERAGE [<数值型表达式表>][<范围>] [FOR <条件1>][WHILE <条件2>];

[TO <内存变量名表> | ARRAY <数组名> ]

命令功能:对当前打开的表文件中的数值型字段列向求均,并把求得的结果保存在指定的内存变量或数组中。

说明:若[范围]项省略,则默认为是ALL;若[数值型表达式表]项省略,则对表中所有数值型字段求均。 例4-7 根据“学生基本情况表.DBF”求出2005年时全体学生的平均年龄。 SET DEFAULT TO D:\\学籍项目 USE 学生基本情况表

AVERAGE 2008-YEAR(出生日期) TO AGE ? AGE

第四章 第 13 页 共 16 页

屏幕显示结果为: 19.75

4.2.5 综合统计计算命令——CALCULATE

命令格式:CALCULATE <表达式表>[<范围>] [FOR<条件1>][WHILE<条件2>];

[TO<内存变量名表>|ARRAY<数组名>]

命令功能:对当前打开的表文件中由字段组成的表达式进行统计计算,并把求得的结果保存在指定的内存变量或数组中。

说明:命令中的<表达式表>由一些函数组成,下面列举几个常用的函数:

    

CNT():该函数不使用自变量,函数值为当前表中的记录个数。 MAX(<表达式>):函数值为<表达式>中的最大值。 MIN (<表达式>):函数值为<表达式>中的最小值。 SUM(<数值表达式>):对<数值表达式>求和。 AVG(<数值表达式>):对<数值表达式>求均。

例4-8 根据“学生基本情况表.DBF”求出全体学生平均入学成绩、入学成绩的最高分和最低分。 SET DEFAULT TO D:\\学籍项目 USE 学生基本情况表

CALCULATE AVG(入学成绩),MAX(入学成绩),MIN(入学成绩) 屏幕显示结果为:

AVG(入学成绩) MAX(入学成绩) MIN(入学成绩)

1.25 690.00 562.0

4.2.6 分类汇总命令——TOTAL

命令格式:TOTAL TO <新表文件说明> ON <关键字表达式>;

[FIELDS <数值型字段名表>] [[<范围>] [FOR <条件1>] [WHILE <条件2>]

命令功能:在当前打开的表文件中以ON后面的<表达式>作为分类标准对数值型字段进行分类汇总,汇总后生成一个新的表文件。

命令功能:执行此命令时,将建立一目的表文件,文件名由命令提供。系统将对当前表文件中“关键字表达式”的字段值相同的各组记录的N型字段进行求和操作。同时,每组记录在目的表文件中对应生成一个求和记录。凡未求和的字段,生成的记录字段值等于每组记录中第一个记录的字段值,在求和的N型字段上,生成记录的字段值等于求和的结果。另外,此目的表文件除了没有通用型、备注型字段外,与当前打开的表文件具有相同的结构。

说明:

⑴应用此命令时,当前打开的表文件必须已经根据此命令中的“关键字表达式”进行了排序或建立了索引并已指定为主控索引。

⑵在缺省<范围>项时,等价于ALL。

⑶命令中的 < N型字段名清单> 项列出了求分类和的字段名,它们必须是N型字段。未列出的N型字段不进行分类求和操作。若命令中缺省此项,则对表文件中所有的N型字段求分类和。

⑷若在N型某字段上的求和结果超过了该字段的宽度,系统将执行如下操作:

第四章 第 14 页 共 16 页

① 截去一部分小数部分,结果不超过字段宽度。若成功,则剩下部分四舍五入,若不成功,则转至步骤②。

② 当求和字段包含7位以上位数时,采用科学计数法,若还不成功,则以一串“*”号填满该字段。 以上① ②应为:此时,VFP系统会自动调整该字段宽度,以满足存放数据的要求。 例:职工表已按部门索引,汇总文件是 HZ.DBF USE 职工

INDEX ON 部门 TAG BM

TOTAL ON 部门 TO C:\\Hz FIELDS 基本工资 , 奖金 USE C:\\Hz BROWSE

说明:

① 在执行该命令之前,必须要对原表文件以ON后面的<表达式>建立索引,而且还要指定该索引为主控索引。

② 若有[FIELDS<数值型字段名表>]项,则只对指定的数值型字段分类求和,否则对所有数值型字段分类求和。

③ 新生成的数据表文件中,每一分类只产生一条记录。在每条记录中,所指定汇总的数值型字段以汇总结果作为该字段的值,其它字段以每一类别的第一条记录中的各字段值作为该字段值。

例4-9 对“学生成绩表2.DBF”按“学号”进行汇总,生成一名为“学生成绩汇总表2.DBF”。

SET DEFAULT TO D:\\学籍项目 USE 学生成绩表2 INDEX ON 学号 TAG XH LIST 屏幕显示结果为:

第四章 第 15 页 共 16 页

图4-16

TOTAL ON 学号 TO 学生成绩汇总表2 USE学生成绩汇总表2 LIST 屏幕显示结果为:

图 4-17

本章小结

为了加快记录的检索、显示、查询及汇总速度,需要对表建立索引,从而按索引重新对表记录进行排序。索引是把表记录按索引关键字表达式值的大小进行有序排列的一种技术,是对表文件的一种逻辑排序,可以是升序,也可以是降序。一个表文件可以建立多个索引,每一个索引代表一种处理记录的顺序,但在任何时刻,最多只有一个索引起作用,这个索引称为主控索引。一般把建立的多个索引都存放在一个结构化索引文件中。建立索引时必须要指定索引关键字表达式、索引标识及索引的类型(主索引,候选索引,普通索引,唯一索引);关键字表达式可以是单关键字,也可以是多关键字。索引建立好后可以指定某个索引为主控索引,并使用该索引对表排序。通过索引还可实现对表进行快速查询和统计汇总等操作。

第四章 第 16 页 共 16 页

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务