1/60VisualFoxPro程序设计教程/第2章数据库基础知识第5章数据排序、检索、统计和多个表的操作内容提要:5.1分类排序数据的分类和索引5.2索引排序多工作区操作5.3数据检索5.4数据统计5.5多个表的操作2/60VisualFoxPro程序设计教程/第2章数据库基础知识VFP提供了分类排序和索引排序两种方法,分类排序是把排序结果放到一个新的表中,而索引排序不产生新表,而是产生的索引文件来表示记录的排序。分类排序的命令如下:【命令】SORTTO新表文件名ON排序字段名1[/A][/D][/C][,排序字段名2][/A][/D]…][ASCENDING|DESCENDING][范围][FOR条件|WHILE条件][FIELDS字段名表]5.1分类排序3/60VisualFoxPro程序设计教程/第2章数据库基础知识【功能】对当前表按照排序字段进行升序或降序重新排列,并生成一个新表存放排序结果。【说明】(1)新表文件名指排序后的结果生成的新表文件名,原来记录号发生变化。(2)排序字段名(亦称关键字),可以是C、N、D型。N型按数值的大小排列;D型按日期值的大小排列;C型字段,英文按字母顺序、汉字按拼音字母的顺序排列。4/60VisualFoxPro程序设计教程/第2章数据库基础知识(3)[/A](或ASCENDING)表示记录按升序排列(递增);[/D](或DESCENDING)表示降序(递减);[/C]表示对英文数据不分大小写;升序和降序的选项缺省,默认升序。(4)可使用多个字段来多重排序,可先按字段名1(主关键字或关键字1)排序,若有相同值再按字段名2(次关键字或关键字2)排序。各排序字段名之间用逗号“,”隔开。(5)[范围][FOR条件]缺省,所有记录参与排序。(6)不能对备注字段和通用字段排序。(7)带删除标记的记录也不能参加排序。5/60VisualFoxPro程序设计教程/第2章数据库基础知识【例5-1】use学生成绩List--------------------?显示什么内容sorttopx1on数学/dusepx1list-------------------?显示什么内容?与前面有什么不同?6/60VisualFoxPro程序设计教程/第2章数据库基础知识【例5-1】use学生成绩sorttopx2on数学/d,姓名&&在几个数学相同记录内,再按姓名排序usepx2list-------------------?显示什么内容?与前面有什么不同?7/60VisualFoxPro程序设计教程/第2章数据库基础知识索引文件分为单索引文件和复合索引文件两大类。5.2.1单索引文件【命令】INDEXON索引表达式TO索引文件名[UNIQUE][ADDITIVE][COMPACT][ASCENDING][FOR条件|WHILE条件]【功能】对当前表的关键字索引,产生单索引文件。【说明】(1)命令产生单索引文件,只含一个索引项,单索引文件的扩展名是.IDX。5.2索引排序8/60VisualFoxPro程序设计教程/第2章数据库基础知识(2)索引表达式可以是一个排序的关键字字段或多个排序字段的运算组合,只能是一个表达式,不能象分类排序那样,多个字段用逗号隔开,所以对主关键和次关键的排序是通过表达式组合来实现。(3)不能用[/A]和[/D]表示升序和降序,可用表达式的组合表示升序和降序,也可用[ASCENDING]表示升序。(4)命令后面只能使用条件,不能使用[范围]和[FIELDS字段名表]。(5)[UNIQUE]表示索引文件不保留重复字段值;[ADDITIVE]缺省表示新的索引文件打开后以前的索引文件关闭,该项不缺省就不关闭;[COMPACT]表示把索引文件转换为压缩格式。(6)索引不改变原来的记录号。9/60VisualFoxPro程序设计教程/第2章数据库基础知识【例5-2】单索引文件的使用。(1)简单的索引use学生成绩indexon数学tosx1list10/60VisualFoxPro程序设计教程/第2章数据库基础知识(2)索引的降序排列use学生成绩indexon―数学tosx2list(3)主关键和次关键的选择use学生成绩indexon性别+STR(数学,3)tosx3list11/60VisualFoxPro程序设计教程/第2章数据库基础知识5.2.2复合索引文件复合索引文件含有多个排序的字段,复合索引文件的扩展名是.CDX。对复合索引文件来说又分为两种:一种是独立的复合索引文件,它的主文件名与表文件不同;一种是结构复合索引文件,它的主文件名与产生它表文件相同。一般情况下,使用较多的是结构复合索引文件,它可用命令和表设计器创建。12/60VisualFoxPro程序设计教程/第2章数据库基础知识1.用命令建立复合索引【命令】INDEXON索引表达式TAG标记名[OF索引文件名][ASCENDING|DESCNDING][UNIQUE][CANDIDATE][FOR条件|WHILE条件][ADDITIVE]【功能】创建独立或结构复合索引文件。【说明】(1)命令产生复合索引文件.CDX,索引表达式为索引的字段名或字段名组合。(2)TAG标记名称为索引标记,是为索引字段作标记,它可以是原字段名,也可以是其他的中英文字符,以后再使用索引字段就不能用字段名而要用标记名。13/60VisualFoxPro程序设计教程/第2章数据库基础知识(3)[OF索引文件名]产生独立复合索引文件,缺省产生结构复合索引文件(与表文件同名)。(4)[ASCENDING]表示升序;[DESCNDING]表示降序;[UNIQUE]表示唯一索引;[CANDIDATE]表示候选索引;[ADDITIVE]表示新索引打开不关闭以前索引文件。【例5-3】结构复合索引文件创建与设立索引项标记。use学生成绩indexon数学tagsxindexon性别tagxb14/60VisualFoxPro程序设计教程/第2章数据库基础知识2.用表设计器建立复合索引在表设计器中,只要设置了索引就自动创建了结构复合索引文件,操作步骤如下:步骤一:打开表后,选择“显示”菜单下的“表设计器”,选择“字段”选项卡,选择排序字段的升序或降序。步骤二:选“索引”选项卡,对索引字段选择:主索引/候选索引/唯一索引/普通索引。图5-1表设计器的“索引”选项卡15/60VisualFoxPro程序设计教程/第2章数据库基础知识“类型”表示对排序字段索引类型的设置,有四种:●主索引:选作主索引的字段是主关键字,不允许字段有重复值,一个表只能有一个主索引。只有数据库表可选主索引。图5-1是自由表设计器,没有主索引。●候选索引:表中的主关键字或候选关键字可选作候选索引,字段不允许有重复值,一个表可以有一个或多个候选索引。●唯一索引:选作唯一索引的字段允许有重复值,其唯一性是指索引文件中索引项的值是唯一的,若表有重复字段值,索引文件只保留该字段值前面的一条记录。●普通索引:普通索引没有前面三种索引类型的限制,即一个表可选多个普通索引,选作普通索引的字段有重复值也不会去掉。16/60VisualFoxPro程序设计教程/第2章数据库基础知识5.2.3索引文件的打开与关闭1.索引文件的打开●创建索引文件就同时打开索引文件。●结构复合索引文件在打开表文件同时自动打开,不需要单独打开。●用命令把已建立的索引文件和表同时打开。【命令】USE表文件名|?[INDEX索引文件名表|?][ORDER数值表达式|TAG标记名|单索引文件名]【说明】(1)[INDEX索引文件名表|?]为与表同时打开的单索引和复合索引文件。(2)使用“?”会出现多个表文件和索引文件供用户选择。(3)[ORDER数值表达式|TAG标记名]从复合索引文件的多个索引项选择主控索引项;[ORDER索引文件名]从打开的多个单索引文件中选择当前的主控索引文件。17/60VisualFoxPro程序设计教程/第2章数据库基础知识●索引文件已创建,先打开表文件,然后再打开索引文件的命令。【命令】SETINDEXTO索引文件名表[ORDER数值表达式|TAG标记名|单索引文件名]【功能】把表和索引文件一起打开。【说明】ORDER引导的子项和情况(2)意义相同。2.索引文件的关闭当不对索引文件操作时,可根据需要选择多种关闭索引文件的方法。●用USE或CLOSEALL命令关闭表,也同时关闭了索引文件。●只关闭索引文件,不关闭表文件。【命令】CLOSEINDEX|SETINDEXTO|SETORDERTO【功能】只关闭索引文件,回到表刚打开的状态。【说明】这三条命令对单索引文件和复合索引文件都适用。18/60VisualFoxPro程序设计教程/第2章数据库基础知识5.2.4重索引与索引的删除1.重新索引在表已经创建了索引文件之后,要插入新的记录和修改原有数据,表是否按照新的字段数据重新排列记录。这分为几种情况:(1)结构复合索引文件是总是和表一起打开,修改数据后系统自动进行记录顺序的更新。(2)单索引文件和独立复合索引文件和表都打开时,修改数据会自动更新。(3)在表打开,索引文件关闭时修改数据,系统就不会自动更新记录顺序。这种情况下,也没有必要再次创建索引文件,只需用重索引命令REINDEX,记录顺序就会修改后的数据重新排列。重索引命令如下:【命令】REINDEX[COMPACT]【功能】对关闭的索引文件,按照修改后的数据重新索引。【说明】[COMPACT]表示重索引时把索引文件转换成压缩格式。19/60VisualFoxPro程序设计教程/第2章数据库基础知识5.3.1定位查询命令1.LOCATE命令【命令】LOCATE[范围][FOR条件|WHILE条件]【功能】在指定的范围内找到满足条件的记录。【说明】(1)这是一种顺序查询方式,根据条件中的数据逐条比较记录,不管当前记录在哪儿,总是从首记录开始向下查找。(2)找到满足条件的记录后,记录指针指向该记录(为当前记录),没有找到,指针指向末记录后。(3)[范围]缺省相当于ALL;[FOR条件]缺省,命令执行后,指针指向首记录。(4)若满足条件的记录有多条,指针定位于第一条,可用CONTINUE命令指向下一条满足条件的记录。5.3数据检索20/60VisualFoxPro程序设计教程/第2章数据库基础知识(5)该命令的使用无须索引,若索引文件打开仍可使用,则按照索引顺序查询。(6)常用DISPLAY命令显示查询结果,有记录的显示表示找到满足条件的记录,没有数据显示,则没有找到。2.CONTINUE命令【命令】CONTINUE【功能】LOCATE命令执行后,继续移动记录指针到下一条满足条件的记录。21/60VisualFoxPro程序设计教程/第2章数据库基础知识【说明】该命令只能放在LOCATE命令后,可多次使用。【例5-7】LOCATE与CONTINUE命令的应用。use学生成绩locafor姓名=”李红”displocafor数学=60dispcontdisp22/60VisualFoxPro程序设计教程/第2章数据库基础知识5.3.2索引查询命令1.FIND命令【命令】FIND数值常量/字符常量/&字符变量【功能】在索引文件中查找数据。2.SEEK命令【命令】SEEK表达式【功能】以索引方式查询表中的数据。【说明】(1)SEEK命令和FIND命令功能相似,但比FIND更为灵活,SEEK查找的是表达式,可以是C、N、D、L型的常量、变量及其组合。(2)查找的字符串常量必需用定界符,字符串变量不用”&”。23/60VisualFoxPro程序设计教程/第2章数据库基础知识5.4.1统计记录个数【命令】COUNT[范围][FOR条件|WHILE条件][TO内存变量