当数据表中录入了很多记录之后,如果需要查询或者对指定的记录进行统计,使用Visual FoxPro自带的查询与统计功能能够方便地进行操作,下面就分别对其数据表的查询与统计进行讲解。
在Visual FoxPro中,可以通过3种方式对数据表进行查询:一是通过查询设计器进行查询;二是通过SQL语言进行查询;三是通过查询命令进行查询,这也是本节所要讲解的内容。
格式: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.,表示记录指针未指向末尾
格式:FIND <字符串>/<常数>
功能:它是指在数据表和索引文件均打开的情况下,只能在索引表中快速进行查询。
说明:
(1)FIND命令只能查找字符串或常数。
(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
格式: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 &&显示1986年10月05日出生的记录内容
USE
在Visual FoxPro中,若需要对数值字段进行计算,可以通过以下一些命令进行操作。
格式:COUNT[范围] [FOR <条件>][WHILE <条件>][TO <内存变量>]
功能:统计指定范围内满足条件的记录个数。
说明:
① 缺少[范围]选项和[条件]选项时,将得到当前数据表所有记录的个数。
② 有[TO <内存变量>]选项时,则将统计结果存入指定的内存变量中。
注意:COUNT 在FOR 或WHILE 条件为“真”时,对一定范围内的记录进行计数。如果是SET TALK ON,将显示记录的数目;如果是SET DELETE OFF,则带有删除标记的记录也包括在计数中。
【例2-21】在学生档案表(xsda.dbf)中,统计1986年10月1日以前出生的学生。
USE xsda
COUNT FOR 出生年月<{^1986-10-01} TO CS1986 &&给出统计的条件
? CS1986 &&显示4,表示有4条记录
格式: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 汇总后产生的数据表
格式:SUM [<表达式表>][<范围>][FOR <条件>][WHILE <条件>][TO <内存变量表>]
功能:在指定范围内满足条件的所有记录,计算出各记录对应于指定表达式的值,再分别对这些值求和。
说明:
(1)在<表达式表>中可以是字段变量、内存变量、常数、函数以及它们的各种组合,但整个表达式必须是数值型。
(2)如果缺省<表达式表>时,表示默认对数据表中所有数值字段的值进行求和。
(3)当有[TO <内存变量表>]选项时,则自动将各表达式求和的结果依次存入到指定的内存变量中。
【例2-23】在学生档案表(xsda.dbf)中,统计所有入学成绩的总和。
USE xsda
SUM 入学成绩TO RX &&统计入学成绩的总和
?RS &&显示统计的总和是5823.50
格式:
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 &&显示女生入学成绩的平均值