760 likes | 911 Views
第五章 查询、统计与多表操作. 大纲要求 : 1 、排序与索引 2 、查询 1 )顺序查询 LOCATE … CONTINUE ; 2 )索引查询 FIND , SEEK … SKIP ; 3 、多工作区操作 1 )工作区的选择 2 )表与表之间的连接与关联. 要点 1 表的排序. 1 、排序的概念 把当前数据表中的数据记录按某种顺序重新排列构成一个新数据表文件。 要首先打开当前表; 要生成新文件; 新文件要用 USE 命令打开才能使用。. 要点 1 表的排序. 2 、排序命令 sort to < 新文件名>
E N D
第五章 查询、统计与多表操作 • 大纲要求: 1、排序与索引 2、查询 1)顺序查询 LOCATE … CONTINUE ; 2)索引查询 FIND,SEEK…SKIP ; 3、多工作区操作 1)工作区的选择 2)表与表之间的连接与关联
要点1 表的排序 1、排序的概念 把当前数据表中的数据记录按某种顺序重新排列构成一个新数据表文件。 • 要首先打开当前表; • 要生成新文件; • 新文件要用USE命令打开才能使用。
要点1 表的排序 2、排序命令 sort to <新文件名> on <字段名1>[/A] [/D] [,<字段名2> [/A] [/D] …… ] [<范围>] [for / while<条件>] [fields<字段名列表>] 排序 到 新文件 按 字段1 /升序 /降序 ,字段2 /升序 /降序 …… 排序范围 选择条件 <条件> 排序字段 <字段列表>
要点1 表的排序 3、命令说明 1) 排序字段,只能为C、N、D三种类型,排序依据: C型:英文按字母顺序、汉字按拼音顺序。 N型: 按大小; D型: 按日期的新老(新 > 老) 2)[/A]—升序,[/D]—降序,缺省—升序。 3)先按字段名1(关键字1)排序,对关键字1相同的,再按字段名2(关键字2)排序,以此类推。 示例: 学生表,按性别,性别相同按入校总分排序。 SORT TO 新表 ON 性别,入校总分
记录号 1 2 3 4 5 职工号 姓名 性别 出生日期 10026 李小明 男 12/25/62 10029 李新 男 10/05/63 10026 刘明明 女 05/13/40 10026 张继业 男 11/11/50 10026 孙志 男 05/30/63 要点2 索引 1、索引概念——加速查找 建立一个小得多的索引文件,在索引文件里,给出由低到高(或由高到低)排列的关键字值及其相应的记录号。 下例为按出生日期建立的索引文件。 出生日期 记录号 05/13/40 3 11/11/50 4 12/25/62 1 05/30/63 5 10/05/63 2 表文件 索引文件
要点2 索引 2、索引分类 单索引-----文件的扩展名为.idx 为与原FOXBASE兼容而保留,只能对一个索引表达式建立索引,目前已很少使用。 复合索引-------文件的扩展名为.cdx 当前主要使用的索引方式,在一个文件中,可以建立针对多个索引表达式的多个索引,每个索引通过索引标识来区别。 结构复合索引与表文件同名,当打开表时自动打开。分为: 主索引、侯选索引、普通索引、唯一索引
要点2 索引 3、索引关键字和索引类型 索引关键字:建立索引时使用的字段或字段组合。 索引类型 1)主索引:数据库表中设定有主关键字的索引,要求字段具有唯一值。自由表没有主索引。 2)侯选索引:同样要求唯一值。数据库表、自由表都可有多个候选索引。 3)普通索引:允许多值。任意表可有多个普通索引。 4)唯一索引:允许多值,但索引表中 只记录相同关键字记录的第一个。
要点2 索引 4、索引的建立 1)菜单方式: 首先,打开表; “显示”菜单=》“表设计器” 或:“窗口”菜单=》“数据工作期”=》 =》选中表=》“属性”=》“修改”=> “表设计器” 在表设计器中, (1) “字段”卡片中选择索引为升序或降序。 (2) “索引”卡片中选择索引类型。
要点2 索引 4、索引的建立 2)命令方式: (1)创建独立单索引 index on <关键字表达式> to <索引文件名> [for<条件表达式>] [ADDITIVE] 索引 按 <关键字表达式> 到 <单索引文件名.IDX> 对满足 <条件> (的记录) 新增索引 • 关键字表达式一般是单个字段,若有多个,则需转化为相同数据类型并用+、-连接,<索引关键字>可以是N、C、D型。 • 索引一旦建立,即自动打开,开始起作用。
问题:对表进行索引后指针在什么位置 要点2 索引 4、索引的建立 2)命令方式: (2)创建复合索引 INDEX ON <索引表达式> TAG <标记名> [ASCE ] [DESC ] [UNIQUE] [FOR <条件>] [ADDI ] 索引 按 <索引表达式> 标识 <标记名> 升序/降序 唯一索引 对满足 <条件> (的记录) 新增 • 当<索引表达式>是由多个字段组成时,多个字段之间用“十”或“一”连接,主关键字在最前面,且数据类型要相同 。 • 索引一旦建立,即自动打开,开始起作用。
要点2 索引 4、索引的建立——示例: (1)创建独立单索引_ 学生表: 出生年月 INDE ON 出生年月 TO CSNY (2)复合索引 学生表 首先打开表: USE 学生 * TAG1: 姓名降序 (普通索引) INDE ON 姓名 TAG XM DESC * TAG2: 性别升序,性别相同时入校总分降序(普通索引) INDE ON 性别+STR(10000-入校总分,3) TAG XBZFD
要点2 索引 5、索引的使用: 1)打开索引 复合索引文件随表文件自动打开 单索引文件必须使用命令: (1) 打开表同时打开索引 USE <表> INDE <单索引1.IDX>,<单索引2.IDX>,…… 打开表 <表> 带索引 <单索引1.IDX>,<单索引2.IDX>…. (2) 表已经打开,再追加打开索引 USE <表> SET INDE TO <单索引1.IDX>,<单索引2.IDX>,…… 设置 索引 为 <单索引1.IDX>,<单索引2.IDX>….
要点2 索引 5、索引的使用: 2)设置主控索引 复合索引文件中有多个TAG(索引标识) 单索引文件也可能有多个,默认起作用的是第一个。 要改变当前起作用的索引项,就要设置主控索引: (1) 菜单操作 “数据工作期”=》选中表=》“属性”=》“索引顺序” 在下拉菜单中选择主控索引
要点2 索引 P10 5、索引的使用: 2)设置主控索引 (2) 命令方式 命令1:用于单索引列表中指定主索引。 SET ORDER TO <单索引文件名|索引标识名> 设置 主控 为 单索引文件 SET ORDER TO <n> 设置 主控 为 第n个单索引文件
例: 例1:USE e:\vfp2\学生情况表.dbf EXCLUSIVE orde tag x1 打开学生情况表,并将索引标识 X1设置为主控索引 例2: set orde to 出生年月 将索引标识出生年月设置为主控索引 例3: set orde to 1 将本表的第一个索引标识设置为主控索引
要点2 索引 P11 5、索引的使用: 3)更新索引 当修改、添加、删除、插入记录时,复合索引将自动更新。单索引只有随表打开才能自动更新,否则,将与表记录不一致。 (1) 所有单索引文件必须打开。 (2) 索引更新命令 REINDEX 更新(重新索引) 索引
要点2 索引 5、索引的使用: 4)删除索引 菜单方式 • 进入表设计器。 2)在“索引”卡片中,选中要删除的索引标识,“删除”。 或:在“字段”卡片中,选中要删除索引的字段,将“索引”项改为(无)。
要点2 索引 5、索引的使用: 4)删除索引 命令方式: • DELETE TAG ALL 删除 索引标识 全部 同时删除复合索引文件。 2)DELETE TAG <索引标识1> [,<索引标识2>……] 删除 索引标识 <索引标识1> [,<索引标识2> … 例: DELETE TAG XHA 删除复合索引标识 XHA (学号的升序索引)
关闭当前索引 • 命令格式:set orde to • 功能:关闭当前索引,使表的排列顺序回到原始顺序
练习1 练习: 结构复合索引:在表设计器中建立学号、姓名、出生日期的普通索引,在命令窗口依次显示。 用鼠标方式和SET ORDER 命令,分别改变主控索引并浏览显示。 3)建立多关键字索引,先按入校总分(降序),入校总分相同,再按出生年月(升序),浏览显示记录内容。
5.3 查询 1、顺序查询: 菜单方式(自学) 1) 打开表 2)“显示”菜单=》“浏览” 3)“表”菜单=》“转到记录”=》“定位” 4)在弹出的“定位记录”对话框中: 单击 “For”右边按钮,进入表达式生成器。 5)生成FOR子句的表达式。“确定”按钮 6)“定位记录”按钮。
5.3 查询 1、顺序查询: 命令方式: locate [<范围>] [for <条件>] [while <条件>] CONTINUE (继续查找下一个记录) 1)在规定范围内,按照使用顺序查找满足条件的第一个记录; 2)continue必须放在locate之后执行,可重复使用, 它在剩下的区域内按照使用顺序,继续查找下一条满足条件的记录。 3)应使用DISPLAY显示查找结果。 (为什么不用LIST?)
要点3 查询 例:USE 学生情况表 LOCA FOR 性别=‘男’ && 注释:第一个男同学 DISP && 仅显示当前记录 LOCA FOR 性别=‘男’ && 仍是第一个 DISP CONTI && 第二个男同学 DISP CONTI && 第三个男同学 DISP USE && 表用完后应关闭
要点3 查询 P4 相关函数——EOF()和FOUND() 无论用直接查找的LOCATE、 CONTINUE,还是索引查找的 FIND、SEEK (不包括SKIP ) : 1)当查找成功时EOF() = .F. FOUND() = .T. 2) 当查找失败时EOF() = .T. FOUND() = .F.
要点3 查询 例:USE 学生情况表 LOCA FOR 三好生 &&第一个三好生 ?FOUND(), EOF() && 结果为 .T. (找到) .F. (未到尾) CONT IF FOUND( ) && 或 IF .NOT. EOF() DISP USE&& 关闭表
5.3 查询 2、索引查询——SEEK 检测表达式的值是否相等 格式: SEEK <表达式> 查找第一条满足条件的记录 SKIP 查找下一条满足条件的记录 • 只能对建立并打开索引的索引关键字进行查找。 • 能对索引文件关键字为 C 、N 、 D型的进行查找; • 可以用 EOF() 和 FOUND() 测试 SEEK 的结果,但只能用 EOF() 测试SKIP 的结果。 • 复合索引关键字只能用 SEEK 查询, 且SEEK后的<表达式>必须与索引表达式相同。
5.3 查询 2、索引查询——SEEK 检测表达式的值是否相等 USE 学生情况表 INDE ON 学号 SEEK ‘s0201104’ ? Found() && 结果为.T. 找到 DISP && 显示该同学记录 INDE ON DATE()-出生年月 TAG NL SEEK 18 && 注意SEEK 后表达式的类型 DISP && 将显示第一个18岁同学 SKIP && 定位到第二个18岁同学记录 USE && 关闭表
练习2 1、用LOCA查找学号为某值的同学。 2、用LOCA + CONT 查询入校总分高于450的各个男同学记录。 3、建立关于入校总分、出生年月的复合索引后,用索引查询命令 SEEK + SKIP 查找基本工资等于某常量或内存变量的学生。 上述过程中,检查FOUND()、EOF()的值。
5.4 多个表同时使用 (1)工作区的概念 单表操作:在每个工作区中,用户可以单独打开一个表文件, 在 打开 表文件的同时, 该区原打开的表文件 自动关闭。 多表操作: 1、定义:工作区是一块内存区域,用于打开一个表; 2、VFP提供32767个工作区,可以同时打开255个表文件。 3、前10个工作区编号为1,2,3,… 10。 英文编号为 A ,B,C,… J 或a、b、c、d、 … j。
5.4 多个表同时使用 (2)当前工作区 1、定义:用户目前正在操作的工作区,称为当前工作区。 2、无论何时,系统只有一个当前工作区,系统初始化时,自动置第一个工作区为 当前工作区,用户可用命令选择当前工作区。
5.4 多个表同时使用 (3) 表的打开 命令格式: USE [<表文件名> [ IN <工作区号> ] [ALIAS <别名> ] • 在打开表的同时,关闭原来在该区打开的表。 • 别名:8个字符以内,若无ALIAS子句,则表文件名为默认别名。 例如: USE 学生 IN C ALIAS XS &&别名XS 或:USE 学生 IN 3 ALIAS XS &&别名XS USE 学生 &&别名学生
5.4 多个表同时使用 (4)工作区的选择 命令格式:SELECT <工作区号/别名> 功能:为打开的表选择工作区。 特别格式:SELECT 0 功能: 给出并选择空闲的最小工作区号。 其中,别名有三种: • 系统规定的别名A~J ,不区分大小写; • 用use <文件名> alias <别名>定义的表的别名: • 未用ALIAS指定别名时,取表文件名为别名。
5.4 多个表同时使用 说明: • 每个工作区中打开的表都有自己独立的记录指针, • 用户只能操作当前工作区打开的表文件,并且操作不影响其他工作区的数据和记录指针。 • 特别地,对表记录的REPLACE写操作,最好只对当前工作区打开的表文件进行,读操作(引用)可以通过工作区互访对所有工作区进行。
5.4 多个表同时使用 (5) 数据工作期(自学) • 作用: 设置数据工作环境. • 包含: 打开表, 表索引, 结构修改, 表关系; 字段筛选, 记录过滤; • 进入方式: 1 . “窗口”菜单-> “数据工作期”; 2. 命令窗口中,使用 SET VIEW ON / OFF 打开 / 关闭 数据工作期 ;
5.4 多个表同时使用 相关函数:I SELECT([0/1/别名])当前工作区号/最大工作区号/<别名>所在工作区号. 无参数时返回当前工作区号. DBF([区号/别名])指定工作区/别名所在工作区打开的表文件名.无参数时返回当前区打开的表文件名. RECNO([区号/别名])指定工作区/别名所在工作区的记录号,无参数时,返回当前工作区打开表的当前记录号. ALIAS([<数值表达式>])返回指定工作区中表文件名。 数值表达式用于指定工作区号。 若用use <文件名> alias <别名>打开表,则返回别名。 若用use <文件名>打开表,则返回表名。
5.4 多个表同时使用 • (6)工作区的互访 格式: 别名-> 字段名 (减号 + 大于号) 或:别名 .字段名 或 表名.字段名 说明: 在当前工作区中,可以通过别名方式引用(读方式)其他工作区中打开的表的字段值。
5.4 多个表同时使用 例: CLOSE ALL &&关闭所有表 USE 学生 &&打开学生,别名学生 SELE 0 && 选择新工作区 USE 教师 ALIAS JS && 打开教师,别名JS USE 课程 IN 0 ALIA KC && 打开课程,别名KC ?SELECT() &&此时当前工作区为3 DISP 学生.姓名,B->姓名,课程名 && 显示学生姓名,教师姓名,课程表课程名
练习4 1、在两个工作区中分别打开学生.DBF(不指定别名)和选课.DBF(别名为Z); 2、用SELE <别名/区号>命令在工作区间转换; 3、用SELECT(<n>)、ALIAS( <n> )、DBF( <n> )函数检测各工作区; 4、在工作区中移动记录指针,并检测RECNO( <n> ),RECNO( <n> )、EOF( <n> ),EOF( <n> )的值。
5.4 多个表同时使用 (7)表间关系与关联 问题的由来:由于各工作区的记录指针各自独立,不能相互带动,给操作带来麻烦。 表关联的目的,是使其他工作区的记录指针根据关键字相等的原则,随同本区的记录指针一起移动。 关联可以在两个或多个表之间建立,但每一步只能建立两个表之间的关联。 父表:建立关联的表,其记录指针将带动另一个表的记录指针跟随移动。 子表:被关联的表,其记录指针随父表而动。
5.4 多个表同时使用 关联步骤: 1、首先为子表按关联关键字(例如学生表的学号和选课表的学号,选课表为父表,学生表为子表)建立索引,(若按记录号建立关联,可以不索引)。 2、以父表为当前表,用菜单方式或命令方式建立关联。 建立关联后,当父表指针移动时,子表记录指针将同时移动到满足关联条件的记录上。(子表关键字=父表关键字) 注意:注意:当子表为当前表时,子表记录指针移动,不能带动附表指针跟随移动。
5.4 多个表同时使用 表的关联类型: • 一对一关联: 父表与子表间记录按关联关键字一一对应。 • 一对多关联: 父表的每一个记录按关联关键字与子表的多个记录对应;子表的每个记录仍与父表的一个记录对应。 如学生.DBF与选课.DBF • 多对一关系:父表的多个记录按关联关键字与子表的一个记录对应;子表的每个记录仍与父表的一个记录对应。如选课.DBF与课程.DBF
5.4 多个表同时使用 表的关联类型: • 多对多关系:父表的多个记录按关联关键字与子表的多个记录对应;如教师.DBF与课程.DBF。在Visual FoxPro中,不直接处理多对多关系,而是拆分为一对多与多对一关系进行处理。如教师《==》课程。拆分为: 教师 《---》 授课《 ----》课程 一对多 多对一
5.4 多个表同时使用 数据工作期中建立关联: • 步骤如下: • 1、打开要建立关联的两个表; • 2、选中子表为当前工作区,通过“属性”按钮设置关联关键字为主控索引(若无索引,需通过“修改”按钮立即建立)。 • 3、选中父表为当前工作区,按“关系”按钮与子表建立关联。 例如: 选课表与学生表; 职工简况表与工资表。 关联的删除。
5.4 多个表同时使用 命令建立关联: 1、打开要建立关联的两个表; 2、选中子表为当前工作区, 3、SET ORDER TO <索引项/顺序号> 设置关联关键字为主控索引 或:INDE ON <关联关键字>若无索引,立即建立 4、选中父表为当前工作区,与子表建立关联。 格式: SET RELATION TO [<关联关键字> INTO <别名>] [ADDITVE] 设置 关联 为 <关联关键字> 到 子表 [新增]
5.4 多个表同时使用 • 关键字表达式应是两个表共有的公共字段; • 当前区打开的,是关联表(父表),可以不索引。 • 在另一区打开的是被关联表(子表),子表必须按关键字索引。 • 选择ADDITIVE短语时,以前建立的关联将保留,由此可建立多区关联,否则以前设置的关联自动取消。 • 不带任何选项的SET RELATION TO命令将关闭当前工作区表文件与其他工作区表建立的关联。 • 一旦建立关联,则当父表的记录指针移动时,子表的记录指针按关键字相等的原则而随动。 • 当子表记录指针移动时,父表的记录指针不随之移动。
5.4 多个表同时使用 ZGJK.DBF(父) GZ.DBF(子) 例 用表关联查询张继业工资 1、在GZ中,按公共字段‘职工号’建立索引; 2、以ZGJK为父表,GZ为子表,职工号为关键字,建立关联, 3、查询,显示两表中相应字段;
ZGJK.DBF(父) 5.4 多个表同时使用 SELE 2 USE GZ ALIAS Z INDE ON 职工号 TAG ZGHA SELE 1 USE ZGJK ALIAS JK SET RELA TO 职工号 INTO B LOCA FOR 姓名=‘张继业’ ? 姓名,职称, GZ.基本工资 &&显示张继业的情况 SET RELA TO&&取消关联 CLEA ALL &&关闭表 • 命令序列 GZ.DBF(子)
5.4 多个表同时使用 若父表为一,子表为多关系,为了正确浏览多方(子表)记录,应通过命令说明。 命令格式: 1、SET SKIP TO <别名> 设置 跳进 到 子表 说明: 首先应正常使用SET RELA TO 命令建立关联。然后再用此命令。 2、SET SKIP TO 取消 一对多关系 。 • 一对多关联
5.4 多个表同时使用 ( 8 ) 多表关联 在两个以上的表之间建立关联,按连接方式,可以分为两种: 1、串接 表B 关联2 表A 关联1 表C 表A 是表B的父表,它们之间建立关联; 表B 是表C的父表,它们之间也建立关联;
5.4 多个表同时使用 授课 课程号 教师 教师号 课程 串接示例: 多对一 一对多 步骤: 1、打开三个表; 2、授课表按教师号索引,课程表按课程号索引; 3、建立教师表到授课表的关联,并指定一对多关系; 4、建立授课表到课程表的关联。 5、用LIST命令查看教师授课的课程名、课时等情况。