450 likes | 577 Vues
Visual FoxPro 程序设计. 河南财专信息工程系. 2014/11/8. 第 3 章 查询与统计. 3.1 排序与索引 3.2 数据查询 3.3 数据统计与汇总 3.4 多表操作. 第 3 章 查询与统计. 3.1 排序与索引. 1. 排序 (Sort) 排序是将表记录的顺序按指定的字段重新排列,生成一个新的表文件。 格式: SORT TO〈 文件名 〉ON〈 字段名 1〉[/A][/D][/C][ , 〈 字段名 2〉[/A][/D][/C] … ][ 范围 ][FIELDS〈 字段名表 〉][FOR/WHILE〈 条件 〉]
E N D
Visual FoxPro 程序设计 河南财专信息工程系 2014/11/8
第3章 查询与统计 • 3.1 排序与索引 • 3.2 数据查询 • 3.3 数据统计与汇总 • 3.4 多表操作
第3章 查询与统计 3.1 排序与索引 1.排序(Sort) 排序是将表记录的顺序按指定的字段重新排列,生成一个新的表文件。 格式:SORT TO〈文件名〉ON〈字段名1〉[/A][/D][/C][,〈字段名2〉[/A][/D][/C]…][范围][FIELDS〈字段名表〉][FOR/WHILE〈条件〉] 功能:按指定的字段对表记录进行排序,生成一个新的表文件。 说明:1.选项A为升序,D为降序,若缺省A和D,则系统默认为升序。C为忽略大小写。 2.数值型数据按数值大小排序,日期型数据按年月日的顺序进行比较排序,字符型数据按字符的ASC码大小排序。
第3章 查询与统计 3.1 排序与索引 例1:将TEACHER记录按月收入升序排列,生成一个名为ATEACHER的表文件。 USE TEACHER SORT TO ATEACHER ON 月收入 USE ATEACHER LIST
第3章 查询与统计 3.1 排序与索引 例2:将TEACHER表记录按性别升序和月收入降序排列,生成BTEACHER表文件。 USE TEACHER SORT TO BTEACHER ON 性别/A,月收入/D USE BTEACHER LIST
第3章 查询与统计 3.1 排序与索引 2.索引(Index) (1)索引的概念 索引文件是表文件的一个辅助性文件,它是将记录的顺序按关键字重新排列,所存储的仅是记录指针的逻辑顺序,而不改变记录的物理顺序和记录号。与排序文件相比,索引文件占用的存储空间小,查询速度快。 VFP的索引文件有两种类型:单索引文件(IDX)和复合索引文件(CDX)。 单索引文件只包括一个索引关键字(如teacher表按月收入字段建立索引文件)。复合索引文件允许包含多个索引项(如teacher表按性别和月收入两个字段建立索引文件),每个索引项可指定一个索引标识(Index Tag),作为索引文件的别名。
第3章 查询与统计 3.1 排序与索引 复合索引文件又分为结构复合索引和非结构复合索引。结构复合索引是和表名相同的文件主名(如teacher表的结构复合索引文件名为teacher.cdx),它随表的打开而打开,在表记录的添加、删除和修改时会自动更改。非结构复合索引是用户为它另起了名字的文件(扩展名仍为CDX),使用时要用相应的打开命令来打开。
第3章 查询与统计 3.1 排序与索引 (2)索引文件的建立 • 单索引文件的建立 格式:INDEX ON〈索引表达式〉TO〈索引文件名〉[FOR〈条件〉] [UNIQUE] [ADDITIVE] • 复合索引文件的建立 格式:INDEX ON〈索引表达式〉TAG〈索引标识〉[OF〈复合索引文件名〉] [FOR〈条件〉] [ASCENDING/DESCENDING] [UNIQUE] [ADDITIVE] 功能:建立索引文件。
第3章 查询与统计 3.1 排序与索引 说明: • 1.索引表达式的数据类型可以是字符型、数值型、日期型、逻辑型,但不能是备注型和通用型。 • 2.索引表达式可以是一个字段,也可以是多个字段,当为多个字段时要用连接运算符+/-号将多个字段连接起来,并要求各字段的数据类型要一致。 • 3.若有UNIQUE选项,表示在索引项中若有相同的字段值时只记录第1项。 • 4.ADDITIVE选项表示在建立新的索引文件时而不关闭原来打开的索引文件。
第3章 查询与统计 3.1 排序与索引 • 5.索引标识为索引文件的别名。若只有TAG〈索引标识〉而缺省OF〈复合索引文件名〉选项,则建立的索引文件属于结构复合索引文件,若有OF〈复合索引文件名〉选项则建立的索引文件属于非结构复合索引文件。 • 6.ASCENDING为升序,DESCENDING为降序。若缺省升序和降序,则默认升序。降序只能在结构复合索引文件中设置,而不能在单索引文件和非结构复合索引文件中设置。
第3章 查询与统计 3.1 排序与索引 例1:以月收入为索引关键字对TEACHER表建立单索引文件,索引文件名为ITEACHER.IDX。 USE TEACHER INDE ON 月收入 TO ITEACHER LIST
第3章 查询与统计 3.1 排序与索引 例2:为TEACHER表建立一个以姓名降序排列的结构复合索引文件(系统自动生成索引文件名TEACHER.CDX),索引标识为XM。 USE TEACHER INDE ON 姓名 TAG XM DESC LIST
第3章 查询与统计 3.1 排序与索引 例3:为TEACHER表建立一个以教研室升序,月收入降序排列的结构复合索引文件(系统自动生成索引文件名TEACHER.CDX),索引标识为JYSYSR。 USE TEACHER INDE ON ASC(教研室)-月收入 TAG JYSYSR LIST
第3章 查询与统计 3.1 排序与索引 例4:为TEACHER表建立一个以教研室升序,月收入升序排列的非结构复合索引文件,索引标识为JYSYSR,索引文件名为TEAC.CDX。 USE TEACHER INDE ON ASC(教研室)+月收入 TAG JYSYSR OF TEAC LIST
第3章 查询与统计 3.1 排序与索引 (3)索引文件的打开 • 索引文件建立时生成的索引文件呈打开状态。 • 结构复合索引文件随表的打开而打开。 • 其他索引文件可用下列命令打开: 格式1:SET INDEX TO [索引文件表] 功能:打开当前表指定的索引文件,最多可以同时打开7个索引文件。若缺省索引文件名,则关闭当前打开的索引文件。 格式2:USE〈表名〉INDEX〈索引文件表〉 功能:打开表的同时打开指定的索引文件。
第3章 查询与统计 3.1 排序与索引 (4)设置主控索引 格式:SET ORDER TO [〈数值表达式〉/〈单索引文件名〉/[TAG〈索引标识〉][OF〈复合索引文件名〉] 功能:在打开的索引文件中指定主控索引文件或在打开的复合索引文件中设置主索引标识。 说明:数值表达式的值为0-7,表示打开的第N个索引文件为当前有效的索引。若未指定主控索引,则系统默认为1。若指定0,则退出索引控制,恢复表记录顺序。
第3章 查询与统计 3.1 排序与索引 例:同时打开TEACHER表的索引文件ATEACHER、BTEACHER、CTEACHER。 USE TEACHER SET INDE TO ATEACHER,BTEACHER,CTEACHER LIST &&显示ATEACHER SET ORDE TO 2 LIST &&显示BTEACHER SET ORDE TO CTEACHER LIST &&显示CTEACHER SET ORDE TO 0 LIST &&显示TEACHER
第3章 查询与统计 3.1 排序与索引 (5)索引文件的关闭 • 当表关闭时索引文件也随之关闭。 • 用CLOSE ALL命令关闭所有文件。 • 用SET INDEX TO关闭当前打开的索引文件。 (6)索引的更新 • 自动更新:当表中的数据发生变化时,所有当前打开的索引文件会自动更新。 • 重新索引:对于未打开的索引文件,可用REINDEX命令重新索引。 例:设TEACHER表按月收入建立的索引文件为ITEACHER。若索引文件已打开,当第三条记录的月收入增加500元时,索引文件自动更新,若索引文件未打开,当第五条记录的月收入增加500元,需重新索引。
第3章 查询与统计 3.1 排序与索引 操作如下: USE TEACHER INDE ON 月收入 TO ITEACHER LIST REPL RECO 3 月收入 WITH 月收入+500 LIST &&索引文件呈打开状态,索引文件自动更新。 SET INDE TO &&关闭索引文件。 REPL RECO 5 月收入 WITH 月收入+500 LIST &&索引文件未打开,索引文件未更新。 SET INDE TO ITEACHER &&打开索引文件。 LIST REIN LIST
第3章 查询与统计 3.2 数据查询 1.顺序查询 在表中查询记录有两条命令: (1)LOCATE命令 格式:LOCATE [范围] FOR/WHILE〈条件〉 功能:在表中查找满足条件的记录。 例:在TEACHER中查找职称为副教授的记录。 USE TEACHER LOCA FOR 职称="副教授" DISP
第3章 查询与统计 3.2 数据查询 (2)CONTINUE命令 格式:CONTINUE 功能:与LOCATE命令配合,用于继续查找。 如上例继续查找职称为副教授的记录: CONT DISP
第3章 查询与统计 3.2 数据查询 2.索引查询 在索引文件中查询记录也有两条命令: (1)FIND命令 格式:FIND〈字符串〉/〈数字〉 功能:在索引文件中查找与索引关键字相匹配的数据记录。 例:用FIND命令在TEACHER中查找姓马的记录。 USE TEACHER INDE ON 姓名 TO ITEACHER FIND 马 DISP
第3章 查询与统计 3.2 数据查询 (2)SEEK命令 格式:SEEK〈表达式〉 功能:与FIND功能相同,但允许用表达式查找。在查找字符型数据时需加定界符。 例:USE TEACHER INDE ON 姓名 TO ITEACHER SEEK 马 &&错误的命令(未加定界符) SEEK "马" DISP INDE ON 月收入 TO BTEACHER SEEK 400+480 DISP FIND 400+480 &&错误的命令(不能用表达式)
第3章 查询与统计 3.3 数据统计与汇总 1.计数命令 格式:COUNT [范围][FOR/WHILE〈条件〉] [TO〈内存变量〉] 功能:统计满足条件的记录数。 例:分别统计TEACHER中男、女教职工人数。 USE TEACHER COUN FOR 性别="男" TO MEN COUN FOR 性别="女" TO WOMEN ?"男教工人数为:",MEN ?"女教工人数为:" ,WOMEN ?"男女教工人数为:",MEN+WOMEN
第3章 查询与统计 3.3 数据统计与汇总 2.求和命令 格式:SUM [数值型表达式表][范围][FOR/WHILE〈条件〉][TO〈内存变量表〉] 功能:对当前表中的数值型字段的表达式求和。 例:对TEACHER中的月收入求和。 USE TEACHER SUM 月收入
第3章 查询与统计 3.3 数据统计与汇总 3.求平均数命令 格式:AVERAGE [数值型表达式表][范围][FOR/WHILE〈条件〉][TO〈内存变量表〉] 功能:对当前表中的数值型字段的表达式求平均数。 例:对TEACHER中的月收入求平均数。 USE TEACHER AVER 月收入
第3章 查询与统计 3.3 数据统计与汇总 4.计算命令 格式:CALCULATE〈表达式表〉[范围][FOR/WHILE〈条件〉][TO〈内存变量表〉] 功能:计算表达式的值。 说明:表达式表中的函数有计数函数CNT(),求和函数SUM(〈数值型表达式〉),求平均数函数AVG(〈数值型表达式〉),最大值函数MAX(〈表达式〉),最小值函数MIN(〈表达式〉),净现值函数NPV(〈数值型表达式〉)和标准差函数STD(〈数值型表达式〉)等系统函数。
第3章 查询与统计 3.3 数据统计与汇总 例:计算TEACHER表的月收入平均数、合计数、最大值、最小值,并统计记录个数。 USE TEACHER CALC AVG(月收入),SUM(月收入),MAX(月收入),MIN(月收入),CNT()
第3章 查询与统计 3.3 数据统计与汇总 5.汇总命令 格式:TOTAL TO 〈文件名〉 ON〈关键字〉[范围] [FIELDS〈N型字段名表〉][FOR/WHILE〈条件〉] 功能:在当前表中,对关键字相同的记录的数值型字段求和,并将结果存入一个新表。 说明:在分组求和之前须按分组关键字段建立索引。 例:对TEACHER表按教研室分组求和,将分组求和结果放在TEMP中。
第3章 查询与统计 3.3 数据统计与汇总 USE TEACHER INDE ON 教研室 TO ITEACHER TOTA TO TEMP ON 教研室 USE TEMP LIST
第3章 查询与统计 3.4多表操作 1.工作区的选择和互访 VFP在内存中提供了32767个工作区,工作区编号从1到32767。每个工作区只允许打开一个表,一个表只能在一个工作区打开。前10个工作区除使用编号外,还依次使用了A-J的工作区别名。 VFP内存中的工作区
第3章 查询与统计 3.4多表操作 (1)工作区的选择 格式:SELECT〈工作区号〉/〈工作区别名〉 功能:选择指定的工作区为当前工作区。 说明:若指定工作区号为0,则选择未被使用的最小号工作区为当前工作区。
第3章 查询与统计 3.4多表操作 例:在第1工作区、第2工作区和第3工作区分别打开TEACHER.DBF、STUDENT.DBF、JSGL.DBF。 SELE 1 &&选择第1工作区为当前工作区 USE TEACHER LIST SELE B &&选择第2工作区为当前工作区 USE STUDENT LIST SELE 0 &&选择未用的最小工作区(第3工作区)为当前工作区 USE JSGL LIST
第3章 查询与统计 3.4多表操作 (2)工作区的互访 格式:工作区别名.字段名 功能:在当前工作区访问指定工作区打开表的字段。 例1:在不同工作区分别打开teacher和student表,在当前工作区访问其他工作区。 SELE 1 USE TEACHER SELE 2 USE STUDENT ?姓名 &&显示当前工作区打开表当前记录的姓名 于得水 ?A.姓名 &&显示指定工作区打开表当前记录的姓名 张三
第3章 查询与统计 3.4多表操作 例2:有一单价表DJ.DBF和一用户表USER.DBF如下,要求计算出本月各用户的费用。 DJ.DBF: USER.DBF:
第3章 查询与统计 3.4多表操作 SELE 1 USE DJ SELE 2 USE USER REPL ALL 金额 WITH 用水*A.水价+用电*A.电价+用气*A.煤气价 LIST
第3章 查询与统计 3.4多表操作 2.表的关联 (1)关联的概念 关联就是令在不同工作区打开表的记录指针建立一种临时的联动关系,使一个表的记录指针移动时另一个表的记录指针能随之移动到匹配的记录。 在关联的两个表中,当前表是主动表,称为父表,别名工作区中的表是被动表,称为子表。两个表必须有相同的字段才能建立两个表的关联,这个相同的字段称为关键字段。 (2)关联的种类 有一一关系、一多关系、多一关系和多多关系。在关联的两个表中,若父表的一条记录对应子表的一条记录叫一一关系,父表的一条记录对应子表的多条记录叫一多关系。其他关系依此类推。
一一关系可以看作是一多关系或多一关系的一个特例,VFP能够处理一多关系和多一关系,但不处理多多关系。一一关系可以看作是一多关系或多一关系的一个特例,VFP能够处理一多关系和多一关系,但不处理多多关系。 关联的种类及对应关系 第3章 查询与统计 3.4多表操作
第3章 查询与统计 3.4多表操作 (3)建立关联的命令 格式:SET RELATION TO〈关键表达式〉INTO〈工作区别名〉 功能:通过关键表达式将当前表和别名工作区表建立关联。 说明:子表应在关键字上建立索引。 例:有一图书调价单TJD.DBF和一订货单DHD.DBF如下,要求用TJD中的新价修改DHD中的单价,并改正金额字段值。
第3章 查询与统计 3.4多表操作 DHD.DBF: TJD.DBF:
第3章 查询与统计 3.4多表操作 SELE 1 USE TJD INDE ON 书名 TO TJDID SELE 2 USE DHD SET RELA TO 书名 INTO A REPL ALL 单价 WITH A.新价,金额 WITH 单价*册数 LIST
第3章 查询与统计 3.4多表操作 3.表的联接 联接是将当前工作区的表和指定工作区的表按照关键字段进行联接,形成一个新表。 格式:JOIN WITH〈工作区号/别名〉TO〈新表名〉FOR〈联接条件〉[FIELDS〈字段名表〉] 功能:联接两个表,生成一个新表。 例:现有TEACHER和TEACHER1两个表如下,要求按姓名将TEACHER和TEACHER1联接起来,生成一个TEACHER2表,新表包括姓名、性别、学历、教研室和职称字段。
第3章 查询与统计 3.4多表操作 TEACHER.DBF:
第3章 查询与统计 3.4多表操作 TEACHER1.DBF:
第3章 查询与统计 3.4多表操作 SELE 1 USE TEACHER SELE 2 USE TEACHER1 JOIN WITH A TO TEACHER2 FOR 姓名=A.姓名 FIEL 姓名,性别,学历,A.教研室,A.职称 USE TEACHER2 LIST