VFP程序设计第五章.ppt
计算机教研室计算机教研室泸州医学院计算机教研室罗敏VFP程序设计程序设计计算机教研室计算机教研室第五章第五章 查询、统计和多表操作查询、统计和多表操作v排序v索引v查询v统计v多工作区的操作计算机教研室计算机教研室返返 回回下下 页页5.1 排序命令:SORT TO 新文件名 ON 字段名1/A/B /C,字段名2/A/B/C ASCENDING|DESCENDING范围 FOR|WHILE 条件FIELDS 字段名表|FIELDS LIKE 通配符FIELDS EXCEPT 通配符计算机教研室计算机教研室3、命令说明 1)排序字段,只能为C、N、D三种类型,排序依据:C型:英文按字母顺序、汉字按拼音顺序。N型:按大小;D型:按日期的新老(新 老)2)/A升序,/D降序,缺省升序。3)先按字段名1(关键字1)排序,对关键字1相同的,再按字段名2(关键字2)排序,以此类推。示例:学生表,按性别,性别相同按入校总分排序。SORT TO 新表 ON 性别,入校总分 计算机教研室计算机教研室返返 回回下下 页页5.2 索引一、索引的概念建立一个小得多的索引文件,在索引文件里,给出由低到高(或由高到低)排列的关键字值及其相应的记录号。下例为按出生日期建立的索引文件。职工号 姓名 性别 出生日期10026 李小明 男 12/25/6210029 李新 男 10/05/6310026 刘明明 女 05/13/4010026 张继业 男 11/11/5010026 孙志 男 05/30/63 记录号 1 2 3 4 5 出生日期 记录号05/13/40 311/11/50 412/25/62 105/30/63 510/05/63 2计算机教研室计算机教研室2、索引分类单索引-文件的扩展名为.idx 为与原FOXBASE兼容而保留,只能对一个索引表达式建立索引,目前已很少使用。复合索引-文件的扩展名为.cdx 当前主要使用的索引方式,在一个文件中,可以建立针对多个索引表达式的多个索引,每个索引通过索引标识来区别。结构复合索引与表文件同名,当打开表时自动打开。分为:主索引、侯选索引、普通索引、唯一索引计算机教研室计算机教研室3、索引关键字和索引类型 索引关键字:建立索引时使用的字段或字段组合。索引类型1)主索引:数据库表中设定有主关键字的索引,要求字段具有唯一值。自由表没有主索引。2)侯选索引:同样要求唯一值。数据库表、自由表都可有多个候选索引。3)普通索引:允许多值。任意表可有多个普通索引。4)唯一索引:允许多值,但索引表中 只记录相同关键字记录的第一个。计算机教研室计算机教研室二、索引的建立 1命令方式 1)INDEX ON TO /A/B/C ADDI(1)创建独立单索引_ 学生表:出生年月,入校总分 INDE ON 出生年月 TO CSNY INDE ON 入校总分 TO RXZF计算机教研室计算机教研室返返 回回下下 页页2)创建复合索引 INDEX ON TAG ASCE DESC UNIQUE FOR ADDI 当是由多个字段组成时,多个字段之间用“十”或“一”连接,主关键字在最前面,且数据类型要相同。索引一旦建立,即自动打开,开始起作用。计算机教研室计算机教研室(1)复合索引 学生表 首先打开表:USE 学生 *TAG1:姓名降序(普通索引)INDE ON 姓名 TAG XM DESC *TAG2:性别升序,性别相同时入校总分降序(普通索引)INDE ON 性别STR(10000入校总分,3)TAG XBZFD计算机教研室计算机教研室5、索引的使用:1)打开索引 复合索引文件随表文件自动打开 单索引文件必须使用命令:(1)打开表同时打开索引 USE INDE ,打开表 带索引,.(2)表已经打开,再追加打开索引 USE SET INDE TO ,设置 索引 为 ,.计算机教研室计算机教研室返返 回回下下 页页2设置主控索引 SET ORDER TO 索引文件序号/单索引文件名/TAG索引标识OF 复合索引文件名计算机教研室计算机教研室5.3查询查询1、顺序查询:、顺序查询:locate for while CONTINUE (继续查找下一个记录)计算机教研室计算机教研室1)在规定范围内,按照使用顺序查找满足条件的第一个记录;2)continue必须放在locate之后执行,可重复使用,它在剩下的区域内按照使用顺序,继续查找下一条满足条件的记录。3)应使用DISPLAY显示查找结果。计算机教研室计算机教研室例:USE 学生情况表 LOCA FOR 性别=男&注释:第一个男同学 DISP&仅显示当前记录 LOCA FOR 性别=男&仍是第一个 DISP CONTI&第二个男同学 DISP CONTI&第三个男同学 DISP USE&表用完后应关闭计算机教研室计算机教研室二、索引查询 FIND/SEEK SKIP 查找下一条满足条件的记录 只能对建立并打开索引的索引关键字进行查找。计算机教研室计算机教研室5.4统计统计一、一、计计 数数(COUNT)COUNT COUNT FOR FOR TO TO 计数计数计数计数 范围内范围内范围内范围内 满足满足满足满足 记录数记录数记录数记录数 到到到到 在当前打开的表文件中,统计符合条件的记录个数,在当前打开的表文件中,统计符合条件的记录个数,在当前打开的表文件中,统计符合条件的记录个数,在当前打开的表文件中,统计符合条件的记录个数,例例例例:COUNT FOR:COUNT FOR 性别性别性别性别=“=“男男男男”TO A TO A COUNT FOR COUNT FOR 三好生三好生三好生三好生 TO BTO B?男生人数为:男生人数为:男生人数为:男生人数为:,A&A&显示男生人数显示男生人数显示男生人数显示男生人数?”三好生:三好生:三好生:三好生:”STR(BSTR(B,3)3)”个个个个”计算机教研室计算机教研室二、二、求求 和和 (SUM)/求平均值求平均值(AVERAGE)SUM /SUM /AVERAGEAVERAGE FOR FOR TO TO在当前表文件中在当前表文件中在当前表文件中在当前表文件中,对符合条件的记录在一个或多个字段上对符合条件的记录在一个或多个字段上对符合条件的记录在一个或多个字段上对符合条件的记录在一个或多个字段上 的值进行求和的值进行求和的值进行求和的值进行求和/求平均值求平均值求平均值求平均值。例:例:例:例:SUM SUM 入校总分入校总分入校总分入校总分 FOR FOR 性别性别性别性别=女女女女 TO ATO ASUM SUM 入校总分入校总分入校总分入校总分+10 FOR +10 FOR 三好生三好生三好生三好生 TO C TO C 与与与与 REPLA ALL REPLA ALL 入校总分入校总分入校总分入校总分 WITH WITH 入校总分入校总分入校总分入校总分+10 FOR+10 FOR 三好生三好生三好生三好生计算机教研室计算机教研室 四四.分类汇总分类汇总(TOTAL).TOTAL ON TOTAL ON TO TO FOR FOR 统计同种类型的统计同种类型的统计同种类型的统计同种类型的N N型字段的同关键字字段总和型字段的同关键字字段总和型字段的同关键字字段总和型字段的同关键字字段总和功能:数据表中功能:数据表中功能:数据表中功能:数据表中N N型字段按关键字段分组求和。型字段按关键字段分组求和。型字段按关键字段分组求和。型字段按关键字段分组求和。1 1当前打开的表文件当前打开的表文件当前打开的表文件当前打开的表文件,必须按照关键字段建立索引;必须按照关键字段建立索引;必须按照关键字段建立索引;必须按照关键字段建立索引;2 FIELD 2 FIELD 指定要汇总的指定要汇总的指定要汇总的指定要汇总的N N型字段,若省略,则汇总全部型字段,若省略,则汇总全部型字段,若省略,则汇总全部型字段,若省略,则汇总全部N N 型字段。型字段。型字段。型字段。计算机教研室计算机教研室意义:对学生,按学号分别汇总其选课成绩;意义:对学生,按学号分别汇总其选课成绩;意义:对学生,按学号分别汇总其选课成绩;意义:对学生,按学号分别汇总其选课成绩;统计汇总营业员的销售额;等等。统计汇总营业员的销售额;等等。统计汇总营业员的销售额;等等。统计汇总营业员的销售额;等等。这些操作无法用这些操作无法用这些操作无法用这些操作无法用 SUM SUM 简单完成,而可以用简单完成,而可以用简单完成,而可以用简单完成,而可以用TOTALTOTAL计算机教研室计算机教研室5.3多工作区的操作多工作区的操作一、工作区一、工作区一、工作区一、工作区1 1多工作区的特点多工作区的特点多工作区的特点多工作区的特点 (1)(1)每个工作区中只能打开一个表文件每个工作区中只能打开一个表文件每个工作区中只能打开一个表文件每个工作区中只能打开一个表文件,一个一个一个一个 表文件表文件表文件表文件也只能在一个工作区中打开也只能在一个工作区中打开也只能在一个工作区中打开也只能在一个工作区中打开.(2)(2)用户直接操作的工作区称为当前工作区用户直接操作的工作区称为当前工作区用户直接操作的工作区称为当前工作区用户直接操作的工作区称为当前工作区.当前工作区当前工作区当前工作区当前工作区 的表为当前表的表为当前表的表为当前表的表为当前表;启动启动启动启动VFPVFP后后后后,默认默认默认默认1 1号工作区为当前工作区号工作区为当前工作区号工作区为当前工作区号工作区为当前工作区.(3)(3)系统为每个工作区中打开的表设置一个记录指针系统为每个工作区中打开的表设置一个记录指针系统为每个工作区中打开的表设置一个记录指针系统为每个工作区中打开的表设置一个记录指针,一一一一般情况下他们各自独立般情况下他们各自独立般情况下他们各自独立般情况下他们各自独立,互不干扰互不干扰互不干扰互不干扰.计算机教研室计算机教研室2.2.工作区的标识工作区的标识工作区的标识工作区的标识(区号、区名、别名)区号、区名、别名)区号、区名、别名)区号、区名、别名)(1)132767:(1)132767:分别表示分别表示分别表示分别表示132767132767号工作区号工作区号工作区号工作区 (2)AJ:(2)AJ:分别表示分别表示分别表示分别表示110110号工作区号工作区号工作区号工作区 (3)(3)别名别名别名别名:打开表时建立打开表时建立打开表时建立打开表时建立 USE USE ALIAS ALIAS 若无若无若无若无ALIASALIAS子句,则表文件名为默认别名。子句,则表文件名为默认别名。子句,则表文件名为默认别名。子句,则表文件名为默认别名。USE USE 学生学生学生学生 IN C ALIAS XS&IN C ALIAS XS&别名别名别名别名XSXS或:或:或:或:USE USE 学生学生学生学生 IN 3 ALIAS XS&IN 3 ALIAS XS&别名别名别名别名XSXS USE USE 学生学生学生学生&别名学生别名学生别名学生别名学生计算机教研室计算机教研室3 3工作区的选择工作区的选择工作区的选择工作区的选择 (1)SELECT (1)SELECT (2)USE(2)USE IN IN 不改变当前工作区不改变当前工作区不改变当前工作区不改变当前工作区,而在指定的工作区打开表文件而在指定的工作区打开表文件而在指定的工作区打开表文件而在指定的工作区打开表文件4 4工作区的互访工作区的互访工作区的互访工作区的互访别名别名别名别名 字段名字段名字段名字段名 或或或或:别名别名别名别名 .字段名字段名字段名字段名 说明说明说明说明:在当前工作区中在当前工作区中在当前工作区中在当前工作区中,可以通过别名方式引用(读方式)可以通过别名方式引用(读方式)可以通过别名方式引用(读方式)可以通过别名方式引用(读方式)其他工作区中打开的表的字段值。其他工作区中打开的表的字段值。其他工作区中打开的表的字段值。其他工作区中打开的表的字段值。计算机教研室计算机教研室说明:说明:说明:说明:每个工作区中打开的表都有自己独立的记录指针每个工作区中打开的表都有自己独立的记录指针每个工作区中打开的表都有自己独立的记录指针每个工作区中打开的表都有自己独立的记录指针,用户只能操作当前工作区打开的表文件用户只能操作当前工作区打开的表文件用户只能操作当前工作区打开的表文件用户只能操作当前工作区打开的表文件,并且操作不影响并且操作不影响并且操作不影响并且操作不影响其他工作区的数据和记录指针。其他工作区的数据和记录指针。其他工作区的数据和记录指针。其他工作区的数据和记录指针。特别地,对表记录的特别地,对表记录的特别地,对表记录的特别地,对表记录的REPLACEREPLACE写操作,最好只对当前工写操作,最好只对当前工写操作,最好只对当前工写操作,最好只对当前工作区打开的表文件进行,读操作(引用)可以通过工作区作区打开的表文件进行,读操作(引用)可以通过工作区作区打开的表文件进行,读操作(引用)可以通过工作区作区打开的表文件进行,读操作(引用)可以通过工作区互访对所有工作区进行。互访对所有工作区进行。互访对所有工作区进行。互访对所有工作区进行。计算机教研室计算机教研室例:例:CLOSE ALL&关闭所有表关闭所有表 USE 学生学生&打开学生,别名学生打开学生,别名学生 SELE 0&选择新工作区选择新工作区 USE 教师教师 ALIAS JS&打开教师,别名打开教师,别名JS USE 课程课程 IN 0 ALIA KC&打开课程,别名打开课程,别名KC?SELECT()&此时当前工作区为此时当前工作区为2 DISP 学生学生.姓名,姓名,姓名,姓名,KC.课程名课程名&显示学生姓名,教师姓名,课程表课程名显示学生姓名,教师姓名,课程表课程名计算机教研室计算机教研室练习练习1、在两个工作区中分别打开学生、在两个工作区中分别打开学生.DBF(不指定别名)和(不指定别名)和选课选课.DBF(别名为(别名为Z););2、用、用SELE 命令在工作区间转换;命令在工作区间转换;3、用、用SELECT()、)、ALIAS()、)、DBF()函数检测各工作区;)函数检测各工作区;4、在工作区中移动记录指针,并检测、在工作区中移动记录指针,并检测RECNO(),),EOF()的值。)的值。计算机教研室计算机教研室二、表间关系与关联二、表间关系与关联 1.问题的由来:由于各工作区的记录指针各自独立,不能问题的由来:由于各工作区的记录指针各自独立,不能相互带动,给操作带来麻烦。相互带动,给操作带来麻烦。表关联的目的,是使其他工作区的记录指针根据关键字表关联的目的,是使其他工作区的记录指针根据关键字相等的原则,随同本区的记录指针一起移动。相等的原则,随同本区的记录指针一起移动。关联可以在两个或多个表之间建立。关联可以在两个或多个表之间建立。父表:建立关联的表,其记录指针将带动另一个表的记录父表:建立关联的表,其记录指针将带动另一个表的记录指针跟随移动。指针跟随移动。子表:被关联的表,其记录指针随父表而动。子表:被关联的表,其记录指针随父表而动。计算机教研室计算机教研室2.用命令建立关联用命令建立关联SET RELATION TO INTO ADDITVIE计算机教研室计算机教研室关联步骤:关联步骤:1、首先为子表按关联关键字(例如学生表的学号和选课、首先为子表按关联关键字(例如学生表的学号和选课表的学号,选课表为父表,学生表为子表)建立索引,表的学号,选课表为父表,学生表为子表)建立索引,(若按记录号建立关联,可以不索引)。(若按记录号建立关联,可以不索引)。2、以父表为当前表,用菜单方式或命令方式建立关联。、以父表为当前表,用菜单方式或命令方式建立关联。建立关联后,当父表指针移动时,子表记录指针将同建立关联后,当父表指针移动时,子表记录指针将同时移动到满足关联条件的记录上。(子表关键字父表关时移动到满足关联条件的记录上。(子表关键字父表关键字)键字)注意:当子表为当前表时,子表记录指针移动,不能带动注意:当子表为当前表时,子表记录指针移动,不能带动附表指针跟随移动。附表指针跟随移动。计算机教研室计算机教研室3.表的关联类型:表的关联类型:一对一关联一对一关联:父表与子表间记录按关联关键字一一对应。父表与子表间记录按关联关键字一一对应。一对多关联一对多关联:父表的每一个记录按关联关键字与子表的多父表的每一个记录按关联关键字与子表的多个记录对应个记录对应;子表的每个记录仍与父表的一个记录对应。子表的每个记录仍与父表的一个记录对应。如学生如学生.DBF与选课与选课.DBF多对一关系多对一关系:父表的多个记录按关联关键字与子表的一个父表的多个记录按关联关键字与子表的一个记录对应记录对应;子表的每个记录仍与父表的一个记录对应。如子表的每个记录仍与父表的一个记录对应。如选课选课.DBF与课程与课程.DBF计算机教研室计算机教研室多对多关系多对多关系:父表的多个记录按关联关键字与子表的多个父表的多个记录按关联关键字与子表的多个记录对应记录对应;如教师如教师.DBF与课程与课程.DBF。在。在Visual FoxPro中,中,不直接处理多对多关系,而是拆分为一对多与多对一关系不直接处理多对多关系,而是拆分为一对多与多对一关系进行处理。如教师进行处理。如教师课程。拆分为:课程。拆分为:教师教师 授课授课 课程课程 一对多一对多 多对一多对一 计算机教研室计算机教研室关键字表达式应是两个表共有的公共字段;关键字表达式应是两个表共有的公共字段;当前区打开的,是关联表(父表),可以不索引。当前区打开的,是关联表(父表),可以不索引。在另一区打开的是被关联表(子表),子表必须按关键字在另一区打开的是被关联表(子表),子表必须按关键字索引。索引。选择选择ADDITIVE短语时短语时,以前建立的关联将保留以前建立的关联将保留,由此可建由此可建立多区关联,否则以前设置的关联自动取消。立多区关联,否则以前设置的关联自动取消。不带任何选项的不带任何选项的SET RELATION TO命令将关闭当前工作命令将关闭当前工作区表文件与其他工作区表建立的关联。区表文件与其他工作区表建立的关联。一旦建立关联,则当父表的记录指针移动时,子表的记录一旦建立关联,则当父表的记录指针移动时,子表的记录指针按关键字相等的原则而随动。指针按关键字相等的原则而随动。当子表记录指针移动时,父表的记录指针不随之移动当子表记录指针移动时,父表的记录指针不随之移动计算机教研室计算机教研室关联小结关联小结1、注意事项:、注意事项:1)父表记录指针的移动通过子表的索引带动子表的记)父表记录指针的移动通过子表的索引带动子表的记录指针移动,所以:录指针移动,所以:子表必须索引;子表无法带动父表。子表必须索引;子表无法带动父表。2)不能建立表的环状关联。)不能建立表的环状关联。2、建立关联时,父表、子表的选择:、建立关联时,父表、子表的选择:1)要进行修改的表一般应该是父表;要进行修改的表一般应该是父表;2)在多对一关系中在多对一关系中,关键字多方的表,应设为父表,关关键字多方的表,应设为父表,关键字一方的表,应作为子表。键字一方的表,应作为子表。3)多表关联时,综合考虑上述两点)多表关联时,综合考虑上述两点 及操作的方便性。及操作的方便性。计算机教研室计算机教研室三、表之间的连接三、表之间的连接格式:格式:JOIN WITH TO FOR FIELDS 执行过程:执行过程:从当前工作区中第一条记录始从当前工作区中第一条记录始,在指定的别名在指定的别名工作区表中找满足条件的记录工作区表中找满足条件的记录,每找到一条记录每找到一条记录,就将当前就将当前工作区中的当前记录与指定的别名工作区中找到的记录工作区中的当前记录与指定的别名工作区中找到的记录,连接成一条新记录存于新表文件中。连接成一条新记录存于新表文件中。当前表记录指针前移一位,继续以上操作,直到当前当前表记录指针前移一位,继续以上操作,直到当前表记录指针到达表记录指针到达EOF。计算机教研室计算机教研室1)FOR 是必选项是必选项,两个表必须按条件的要求进行连接两个表必须按条件的要求进行连接,连接中最常用的是等连接中最常用的是等值连接值连接,即连接条件为两个表中公共字段值应相等。即连接条件为两个表中公共字段值应相等。2)如选择了)如选择了FIELD,则则连接生成的新表文件中字连接生成的新表文件中字段按字段表来确定段按字段表来确定,字段表中的字段必须是当前工作区或字段表中的字段必须是当前工作区或指定的别名工作区的字段指定的别名工作区的字段3)一次只能联结两个表,若要联结多个,应分步进行;)一次只能联结两个表,若要联结多个,应分步进行;4)与)与SORT和和TOTAL一样,新表不会自动打开,而应使一样,新表不会自动打开,而应使用用USE命令打开。命令打开。5)两个表都不需要排序或索引。)两个表都不需要排序或索引。计算机教研室计算机教研室 表的连接示例表的连接示例 从学生表从学生表 、选课表,课程表、选课表,课程表生成完整的学生课程表生成完整的学生课程表 计算机教研室计算机教研室 表的连接示例表的连接示例 第一步:第一步:学生表学生表 、选课表,按学号相等生成新的学、选课表,按学号相等生成新的学生选课表。生选课表。计算机教研室计算机教研室 表的连接示例表的连接示例第一步:第一步:连接学生表与选课表,生成学生选课表连接学生表与选课表,生成学生选课表 USE USE 学生学生.dbf IN 0 EXCLUSIVE.dbf IN 0 EXCLUSIVE USE USE 选课选课.dbf IN 0 EXCLUSIVE.dbf IN 0 EXCLUSIVE SELE SELE 选课选课 JOIN WITH JOIN WITH 学生学生 TO TO 学生选课学生选课 FOR FOR 学号学号=学生学生.学号学号 FIEL FIEL 学号学号,学生学生.姓名姓名,课程号课程号,成绩成绩 USE USE 学生选课学生选课.dbf IN 0 EXCLUSIVE.dbf IN 0 EXCLUSIVE计算机教研室计算机教研室 表的连接示例表的连接示例 第二步:学生选课表、课程表再次连接,按课程号相第二步:学生选课表、课程表再次连接,按课程号相等,生成最终的学生课程表等,生成最终的学生课程表计算机教研室计算机教研室 表的连接示例表的连接示例第二步:学生选课表、课程表再次连接,按课程号相等,第二步:学生选课表、课程表再次连接,按课程号相等,生成最终的学生课程表生成最终的学生课程表 USE USE 学生选课学生选课.dbf IN 0 EXCLUSIVE.dbf IN 0 EXCLUSIVE USE USE 课程课程.dbf IN 0 EXCLUSIVE.dbf IN 0 EXCLUSIVE SELE SELE 学生选课学生选课JOIN WITH JOIN WITH 课程课程 FOR FOR 课程号课程号=课程课程.课程号课程号 FIEL FIEL 学号学号,姓名姓名,课程课程.课程名课程名,课程课程.课时课时,成绩成绩 TO TO 学生课程学生课程 USE USE 学生课程学生课程.dbf IN 0 EXCLUSIVE.dbf IN 0 EXCLUSIVE计算机教研室计算机教研室四、表文件的更新四、表文件的更新UPDATE ON FROM REPLACE WITH ,WITH RANDOMNote:当前表文件与别名表文件必须按关键字段索引,若当前表文件与别名表文件必须按关键字段索引,若加上加上RANDOM则可不对别名表文件进行索引。则可不对别名表文件进行索引。