您的位置: 网站首页 > 程序开发 > Visaul FoxPro程序设计 > 第2章 数据表的基本操作 > 【2.4 数据表的查询与统计】

2.4 数据表的查询与统计

 

2.4  数据表的查询与统计

当数据表中录入了很多记录之后,如果需要查询或者对指定的记录进行统计,使用Visual FoxPro自带的查询与统计功能能够方便地进行操作,下面就分别对其数据表的查询与统计进行讲解。

2.4.1  数据表的查询

Visual FoxPro中,可以通过3种方式对数据表进行查询:一是通过查询设计器进行查询;二是通过SQL语言进行查询;三是通过查询命令进行查询,这也是本节所要讲解的内容。

1.条件查询

格式:LOCATE [<范围>] FOR <条件>

功能:在当前表文件的指定范围内按顺序查找符合条件的第一条记录,并将记录指针指向该记录。

说明:

1)当找到记录时,记录指针便指向第一条满足条件的记录处,且FOUND()函数返回逻辑值为真(.T.)。

2)若没有找到记录,则FOUND()函数返回逻辑值为假(.F.)。若指定了查找范围,则记录指针将指向范围内最后一条记录处;否则,记录指针指向文件末尾。

LOCATE命令在查找到符合条件的首记录时,记录指针即指向该记录。若要以相同的条件继续进行查找,可使用与之配套的继续查找命令(CONTINUE)进行。

【例2-18在学生档案表(xsda.dbf)中,查找入学成绩大于580分的女生记录。

USE xsda

LOCATE FOR 入学成绩>580 AND 性别=.F.

? FOUND()               &&显示.T.,表示已经找到

? RECNO()               &&显示为3,表示记录指针指向第3条记录

? DISPLAY               &&显示找到的第3条记录内容

? CONTINUE              &&继续按相同的条件查找

? EOF()                 &&显示为.F.,表示记录指针未指向末尾

2.常用查询

格式:FIND <字符串>/<常数>

功能:它是指在数据表和索引文件均打开的情况下,只能在索引表中快速进行查询。

说明:

1FIND命令只能查找字符串或常数。

2)在使用该命令时,必须打开对应的索引文件,并使对应的索引项成为主控制索引项。

3如果找到指定的记录,则记录指针便指向该记录,且FOUND()函数返回值为真(.T.)。

4)如果没有找到指定的记录,则记录指针便指向文件末尾,且FOUND()函数返回值为假(.F.)。

5)对所要查找的字符串,必须使用定界符括起来。

【例2-19在学生档案表(xsda.dbf)中使用FIND命令进行查找。

USE xsda

SET INDEX TO xsda-xm        &&打开以姓名进行索引的单索引文件xsda-xm.idx

FIND                      &&查找姓李的学生,此为模糊查询

DISPLAY                     &&显示第1个姓李的学生的记录内容

SET EXACT ON                &&设置精确匹配

FIND

? FOUND()                   &&显示.F.,表示没有找到

FIND 赵美珍

DISPLAY                     &&显示找到的赵美珍的记录内容

XM="周友全"

FIND &XM                    &&本命令只能查询常量,使用变量时应进行宏代换

DISPLAY                     &&显示找到的周友全的记录内容

USE

3.表达式查询

格式:SEEK <表达式>

功能:当数据表和相关的索引文件打开后,可以使用SEEK命令在索引表中快速将记录指针定位到与所指定的<表达式>值相匹配的第一条记录。

说明:

1)在使用本命令进行查询前,必须打开相应的索引文件,并使对应的索引项成为主控索引项,且<表达式>的类型必须和索引关键字表达式的类型一致。

2)通过SEEK命令可以查询常量、变量或者表达式的值。

3)该命令可以查询除备注型和通用型外的任何类型的数据。

4)在进行查询时,若查找成功,记录指针指向所查找的记录处,FOUND()函数返回值为真(.T.);若没有找到,则记录指针指向文件末尾,FOUND()函数返回值为假(.F.)。

5)在使用字符串作为查找值时,应使用字符串的定界符进行。

【例2-20在学生档案表(xsda.dbf)中使用SEEK命令进行查找。

USE xsda

SET ORDER TO TAG 姓名        &&指定“姓名”为主索引项

XM="陈昌红"

SEEK XM                     &&本命令可以直接使用变量查询

DISPLAY                     &&显示找到的陈昌红的记录内容

SEEK "高美清"                &&查询字符串时应使用定界符

SET ORDER TO TAG 出生年月    &&指定“出生年月”为主索引项

STORE {^1986-10-05} TO CS

SEEK CS                     &&直接使用变量查询

DISPLAY                     &&显示19861005出生的记录内容

USE

2.4.2  数据表的统计

Visual FoxPro中,若需要对数值字段进行计算,可以通过以下一些命令进行操作。

1.统计表中的记录(COUNT

格式:COUNT[范围] [FOR <条件>][WHILE <条件>][TO <内存变量>]

功能:统计指定范围内满足条件的记录个数。

说明:

缺少[范围]选项和[条件]选项时,将得到当前数据表所有记录的个数。

[TO <内存变量>]选项时,则将统计结果存入指定的内存变量中。

注意:COUNT FOR WHILE 条件为“真”时,对一定范围内的记录进行计数。如果是SET TALK ON,将显示记录的数目;如果是SET DELETE OFF,则带有删除标记的记录也包括在计数中。

【例2-21在学生档案表(xsda.dbf)中,统计1986101以前出生的学生。

USE xsda

COUNT FOR 出生年月<{^1986-10-01} TO CS1986       &&给出统计的条件

? CS1986                                        &&显示4,表示有4条记录

2.记录分类求和(TOTAL

格式:TOTAL TO <关键字> TO <文件名>[<范围>]

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

功能:对当前数据表中指定的数值型字段进行分类求和,并生成一个汇总数据表。

说明:

1)原数据表中的记录对于指定的<关键字>应该是有序的,否则在执行本命令前应先按此<关键字>进行排序或索引。

2)选择[FIELDS]选项时,表示只对指定的数值型字段的值求和;否则将对所有数值型字段的值求和。

注意:要使用此命令,当前工作区中的表必须经过排序或索引。对于具有相同字段值或索引关键字段值的各组记录,将分别计算其总计值。总计结果放入另一个表的记录中,同时还将在此表中对这些字段值或索引关键字创建一条记录。如果第二个表中数值字段的宽度不足以放置总计值时,将会发生数值溢出错误。

【例2-22在学生档案表(xsda.dbf)中,统计1986年以前出生的学生。

USE xsda

INDEX ON 性别TAG XB

TOTAL ON 职称TO XB-1 FIELDS 入学成绩     &&按性别统计入学成绩之和

USE XB-1

BROWSE                                  &&显示汇总的结果,如图2-43所示

2-43  汇总后产生的数据表

3.多记录求和(SUM

格式:SUM [<表达式表>][<范围>][FOR <条件>][WHILE <条件>][TO <内存变量表>]

功能:在指定范围内满足条件的所有记录,计算出各记录对应于指定表达式的值,再分别对这些值求和。

说明:

1)在<表达式表>中可以是字段变量、内存变量、常数、函数以及它们的各种组合,但整个表达式必须是数值型。

2)如果缺省<表达式表>时,表示默认对数据表中所有数值字段的值进行求和。

3)当有[TO <内存变量表>]选项时,则自动将各表达式求和的结果依次存入到指定的内存变量中。

【例2-23在学生档案表(xsda.dbf)中,统计所有入学成绩的总和。

USE xsda

SUM 入学成绩TO RX       &&统计入学成绩的总和

RS                   &&显示统计的总和是5823.50

4.计算多条记录平均数(AVERAGE

格式:

AVERAGE [<表达式表>][<范围>][FOR <条件>][WHILE <条件>]

                [TO <内存变量表>]

功能:将指定范围内满足条件的所有记录,计算出各记录所对应于指定表达式的值,再分别对应这些值求平均值。

【例2-24在学生档案表(xsda.dbf)中,计算男女学生的平均入学成绩。

USE xsda

AVERAGE 入学成绩FOR 性别=.T. TO XB-T

AVERAGE 入学成绩FOR 性别=.F. TO XB-F

? XB-T                              &&显示男生入学成绩的平均值

? XB-F                              &&显示女生入学成绩的平均值