300 likes | 417 Views
第 3 章 查询与统计 查询与统计是常用的表操作。 记录在数据表文件中是按照物理顺序排列的, 如果希望数据表文件中的数据记录按照某种固定次序来显示或处理, 需要采取一些有效的方法对文件中的记录重新组织,使其与希望中的顺序一致。 利用排序和索引,可以实现此目的。 本章主要介绍记录的排序与索引,记录的查询,数据统计和多表操作。. 3.1 排序. 【 命令格式 】SORT TO〈 文件名 〉ON〈 字段名 1〉[/A][/D][/C][ , 〈 字段名 2〉[/A][/D][/C] … ][ 范围 ][FIELDS〈 字段名表 〉][FOR/WHILE〈 条件 〉]
E N D
第3章 查询与统计 查询与统计是常用的表操作。 记录在数据表文件中是按照物理顺序排列的, 如果希望数据表文件中的数据记录按照某种固定次序来显示或处理, 需要采取一些有效的方法对文件中的记录重新组织,使其与希望中的顺序一致。 利用排序和索引,可以实现此目的。 本章主要介绍记录的排序与索引,记录的查询,数据统计和多表操作。
3.1 排序 【命令格式】SORT TO〈文件名〉ON〈字段名1〉[/A][/D][/C][,〈字段名2〉[/A][/D][/C]…][范围][FIELDS〈字段名表〉][FOR/WHILE〈条件〉] 【功能】对当前数据表中指定范围内满足条件的记录,按指定字段的升序或降序重新排列,并将排序后的记录按FIELDS子句指定的字段写入新的表文件中。 【说明】选项A为升序,D为降序,若缺省A和D,则系统默认为升序。C为忽略大小写。排序后生成的新表文件是关闭的,使用时必须先打开。
【例3.1】将TEACHER表记录按月收入升序排列,生成一个名为ATEACHER的表文件。按姓名降序排列,生成一个名为BTEACHER的表文件。【例3.1】将TEACHER表记录按月收入升序排列,生成一个名为ATEACHER的表文件。按姓名降序排列,生成一个名为BTEACHER的表文件。 USE TEACHER SORT TO ATEACHER ON 月收入 SORT TO BTEACHER ON 姓名/D
3.2 索引 索引文件有两种类型:单索引文件(IDX)和复合索引文件(CDX) 可以为数据库表建立四种索引:主索引、候选索引、唯一索引和普通索引。对于自由表,只可以建立和使用候选索引、唯一索引和普通索引。
索引类型 • 主索引:主索引可确保索引关键字中输入值的唯一性并确定记录的先后顺序。对于数据库中的每个表,只能建立一个主索引。 • 候选索引:候选索引与主索引的要求和作用是一样的。“候选”的含义是它们在表中有资格被选为主索引,是主索引的候选者。对每个数据库表和自由表都可以建立多个候选索引。
索引类型 3. 唯一索引:Visual FoxPro为了保持同早期版本的兼容性,还允许建立唯一索引。唯一索引允许表中索引关键字段存在重复值,但它只记录每个索引关键字值在表中的首次出现。 4. 普通索引:如果希望允许在索引关键字中出现重复值,可以使用普通索引。普通索引适合用在包含重复索引关键字值的表中逻辑排序记录和用于查询。在一个表中可以建立多个普通索引。
建立索引 • 添加索引:若要添加一个新的索引,可以在“表设计器”窗口中的“索引”选项卡中单击“插入”按钮,然后利用“索引”选项卡中的各输入框和按钮设置该索引。 • 快速建立索引:可以在“表设计器”窗口中快速地建立索引。
建立索引 3. 索引命令INDEX (1)单索引文件的建立 【命令格式】INDEX ON〈索引表达式〉TO〈索引文件名〉[FOR〈条件〉][UNIQUE] [ADDITIVE] (2)复合索引文件的建立 【命令格式】INDEX ON〈索引表达式〉TAG〈索引标识〉[OF〈复合索引文件名〉] [FOR〈条件〉] [UNIQUE] [ASCENDING/DESCENDING] [ADDITIVE]
【例3.2】以月收入为索引关键字对TEACHER表建立单索引文件,索引文件名为ITEACHER.IDX。【例3.2】以月收入为索引关键字对TEACHER表建立单索引文件,索引文件名为ITEACHER.IDX。 USE TEACHER INDE ON 月收入 TO ITEACHER LIST
【例3.3】为TEACHER表建立结构复合索引文件(系统自动生成索引文件名TEACHER.CDX),以姓名降序排列,索引标识为XM;以年龄升序排列,索引标识为NL。【例3.3】为TEACHER表建立结构复合索引文件(系统自动生成索引文件名TEACHER.CDX),以姓名降序排列,索引标识为XM;以年龄升序排列,索引标识为NL。 USE TEACHER INDE ON 姓名 TAG XM DESC LIST
索引文件的打开 一个数据表往往有多个索引,而在任意时刻只能有一个索引是当前索引,称为主控索引。索引文件不能脱离所依赖的数据表文件而单独使用,在打开一个数据表文件时,结构化复合索引文件将随着数据表文件的打开而自动打开,如果要使用其他的索引文件,则要使用索引文件的打开命令。 【命令格式】 USE <表文件名> [INDEX <索引文件名表>] 【功能】打开数据表文件的同时打开由INDEX后面指定的各个索引文件。
设置主控索引 【命令格式】SET ORDER TO [〈数值表达式〉/〈单索引文件名〉/[TAG〈索引标识〉][OF〈复合索引文件名〉] [ASCENDING/DESCENDING]] 【功能】在打开的索引文件中指定主控索引文件或在打开的复合索引文件中设置主索引标识。
重新索引 对数据表进行修改、增加、删除等操作时,如果没有打开相应的索引文件,则这些索引文件不会随着数据表文件的更新而自动更新,需要使用重新索引命令。 【命令格式】REINDEX 【功能】重新建立打开的索引文件。
顺序查询 1. LOCATE命令 【格式】LOCATE [范围] FOR/WHILE〈条件〉 【功能】在表中查找满足条件的记录。 2. CONTINUE命令 【格式】CONTINUE 【功能】与LOCATE命令配合,用于继续查找
【例3.5】在TEACHER表中查找职称为副教授的记录。【例3.5】在TEACHER表中查找职称为副教授的记录。 USE TEACHER LOCATE FOR 职称=“副教授” DISP 如上例继续查找职称为副教授的记录: CONTINUE DISP
索引查询 1. FIND命令 【格式】FIND〈字符串〉/〈数字〉 【功能】在索引文件中查找与索引关键字相匹配的数据记录。 2.SEEK命令 【格式】SEEK〈表达式〉 【功能】与FIND功能相同,但允许用表达式查找。在查找字符型数据时需加定界符。
【例3.6】用FIND命令在TEACHER表中查找姓马的记录。【例3.6】用FIND命令在TEACHER表中查找姓马的记录。 USE TEACHER INDEX ON 姓名 TO ITEACHER FIND 马 DISP
【例3.7】SEEK命令的使用。 USE TEACHER INDEX ON 姓名 TO ITEACHER SEEK 马 &&错误的命令(未加定界符) SEEK “马” DISP INDE ON 月收入 TO 2TEACHER SEEK 400+480 DISP FIND 400+480 &&错误的命令(不能用表达式)
数据统计与汇总 1. 计数命令 【格式】COUNT [范围][FOR/WHILE〈条件〉] [TO〈内存变量〉] 【功能】统计满足条件的记录数。
【例3.8】分别统计TEACHER表中男、女教职工人数。【例3.8】分别统计TEACHER表中男、女教职工人数。 USE TEACHER COUNT FOR 性别="男" TO MEN COUNT FOR 性别="女" TO WOMEN ?"男教工人数为:",MEN ?"女教工人数为:" ,WOMEN ?"男女教工人数为:",MEN+WOMEN
2. 求和命令 【格式】SUM [数值型表达式表][范围][FOR/WHILE〈条件〉][TO〈内存变量表〉] 【功能】对当前表中的数值型字段的表达式求和。 【例3.9】对TEACHER表中的月收入求和。 USE TEACHER SUM 月收入
3. 求平均数命令 【格式】AVERAGE [数值型表达式表][范围][FOR/WHILE〈条件〉][TO〈内存变量表〉] 【功能】对当前表中的数值型字段的表达式求平均数。 【例3.10】对TEACHER表中的月收入求平均数。 USE TEACHER AVERAGE 月收入
4. 计算命令 【格式】CALCULATE <表达式表>[范围][FOR/WHILE <条件>][TO <内存变量表>] 【功能】计算表达式的值。 【例3.11】计算TEACHER表的月收入平均数、合计数、最大值、最小值,并统计记录个数。 USE TEACHER CALCULATE AVG(月收入),SUM(月收入),CNT(),MAX(月收入),MIN(月收入)
数据表的汇总 【格式】TOTAL TO <文件名> ON <关键字>[范围] [FIELDS<N型字段名表>][FOR/WHILE<条件>] 【功能】在当前表中,对关键字相同的记录的数值型字段求和,并将结果存入一个新表。 【说明】在分组求和之前须按分组关键字段建立索引。 【例3.12】对TEACHER表按教研室分组求和,将分组求和结果放在TEMP中。 USE TEACHER INDE ON 教研室 TO 3TEACHER TOTA TO TEMP ON 教研室 USE TEMP LIST
多表操作 在Visual FoxPro中,一个工作区只能打开一个数据表文件,如果在同一个工作区中打开了另一个数据表文件,则系统自动关闭前一个已打开的数据表文件。如果同时使用多个数据表文件,就需要在不同的工作区中分别打开,这就要通过选择工作区的命令来实现。VFP在内存中提供了32767个工作区,工作区编号从1到32767。每个工作区只允许打开一个表,一个表只能在一个工作区打开。前10个工作区除使用编号外,还依次使用了A~J的工作区别名。
1. 工作区的选择 【命令格式】SELECT <工作区号/别名> 【功能】选择指定的工作区为当前工作区。 【说明】若指定工作区号为0,则选择未被使用的最小工作区为当前工作区。 【例3.12】在不同工作区中打开学生表、分数表和课程表,并分别为它们定义别名。 SELECT A &&选择1号工作区为当前工作区 USE 学生表 ALIAS XSB &&z在1号工作区打开学生表并定义别名为XSB LIST SELECT B &&选择2号工作区为当前工作区 USE 分数表 ALIAS FSB LIST SELECT 0 &&选择未用的最小工作区(第3工作区)为当前工作区 USE 课程表 ALIAS KCB LIST
2. 工作区的互访 【命令格式】工作区别名.字段名 【功能】在当前工作区访问指定工作区打开表的字段。 【例3.13】在不同工作区分别打开学生表和分数表,在当前工作区访问其他工作区。 SELECT 1 USE 学生表 GO 3 SELECT 2 USE 分数表 ?学号 &&显示当前工作区打开表当前记录的学号 结果显示:2005032101 ?A.学号 &&显示指定工作区打开表当前记录的学号 结果显示:2005032103
关联的概念 关联就是令在不同工作区打开表的记录指针建立一种临时的联动关系,使一个表的记录指针移动时另一个表的记录指针能随之移动。 在关联的两个表中,当前表是主动表,称为父表,别名工作区中的表是被动表,称为子表。两个表必须有相同的字段才能建立两个表的关联,这个相同的字段称为关键字段。
关联的种类 有一一关系、一多关系、多一关系和多多关系。在关联的两个表中,若父表的一条记录对应子表的一条记录叫一一关系;若父表的一条记录对应子表的多条记录叫一多关系;若父表的多条记录对应子表的一条记录叫多一关系;若父表的多条记录对应子表的多条记录叫多多关系。 一一关系可以看作是一多关系或多一关系的一个特例,VFP能够处理一多关系和多一关系,但不处理多多关系。
建立关联的命令 【命令格式】SET RELATION TO〈关键表达式〉INTO〈别名〉 【功能】通过关键表达式将当前表和别名工作区表建立关联。 【例3.14】将学生表与分数表建立关联后,显示学生的学号、姓名、性别、班级、成绩等字段的内容。 SELECT 2 USE 学生表 INDEX ON 学号 TO XH SELECT 1 USE 分数表 SET RELATION TO 学号 INTO B LIST 学号,B.姓名,B.性别,B.班级,课程编码,成绩