220 likes | 331 Views
计算机文化基础. 第 13 章 多表操作. 多表操作. 以前所进行的操作中,在同一时刻只能打开一个表文件,这是 单工作区操作 。但是在有些情况下,我们需要同时了解多个表文件中的内容,例如 图8-1 。在表文件 Stud1.DBF 中,有姓名,班级,电话三项;在 Stud2.DBF 中,有姓名,性别,籍贯,英语四个字段。在单工作区操作方式下,同时只能打开一个文件,若要想同时查看姓名,班级,英语三项内容就很麻烦。在这种情况下,可以用多工作区的方式来解决。
E N D
计算机文化基础 第13章 多表操作
多表操作 以前所进行的操作中,在同一时刻只能打开一个表文件,这是单工作区操作。但是在有些情况下,我们需要同时了解多个表文件中的内容,例如 图8-1 。在表文件Stud1.DBF中,有姓名,班级,电话三项;在Stud2.DBF中,有姓名,性别,籍贯,英语四个字段。在单工作区操作方式下,同时只能打开一个文件,若要想同时查看姓名,班级,英语三项内容就很麻烦。在这种情况下,可以用多工作区的方式来解决。 在这一章里,我们需要用到两个以上的表,所以,请大家根据 rsda.dbf的内容再建立两个新表 xl.dbf和 tz.dbf (单击查看“学历表”xl.dbf结构) (单击查看“增加工资表”tz.dbf结构) 开 始
图 8-1 表 stud1.dbf 表 stud2.dbf
学历表 XL.dbf 的结构 XL.dbf 中有三个字段: 编号 C 4 姓名 C 6 学历 C 4 其中 编号 和 姓名的类型与内容与 rsda.dbf一样,指的是同一批人。
增加工资表TZ.dbf 的结构 TZ.dbf 中有三个字段: 编号 C 4 姓名 C 6 增加工资 N 5 其中 编号 和 姓名的类型与内容与 rsda.dbf一样,指的是同一批人。
第一节 工作区的概念 (1) 工作区 ——就是内存中的一个存储区域,用来存放从外存调入内存的表文件,一个工作区内同时只能打开一个表文件。 工作区代号——每个工作区都有一个代号,分别用1,2,……32767表示。 工作区别名——用户在工作区中打开某个数据表时所赋给的别名。对于前十个工作区,也可以用 A – J 来作为别名表示。
工作区的概念 (2) 工作区相互独立—— 各工作区中表文件的记录指针相互独立,例如用户对1号工作区中的表文件进行操作,并不会改变2号工作区中表文件的指针位置。 当前工作区——为了能同时打开多个表文件,可以在内存中开辟多个工作区,每个工作区中可以打开一个不同的表文件。在某一时刻,用户同时只能在一个工作区内操作,此工作区叫当前工作区,又叫主工作区。用户可以根据需要改变当前工作区。
单工作区操作 Use rsda 打开表文件 rsda.dbf,也就是将 rsda.dbf 从外存调入到内存中,默认状态下,内存中只开辟了一个工作区,用来存放从外存调入内存的表文件,且一个工作区中同时只能打开一个表文件。例如如下操作。 Use rsda List Use xl 当用户打开 xl.dbf 时,尽管用户并没有对 rsda.dbf执行关闭操作(use),但是,系统会自动先关闭前一个表文件rsda.dbf, 然后再打开 xl.dbf 。
第二节 如何同时打开多个表文件 • 建立( 开辟 )、选择工作区 • 格式:SELECT < 工作区号 > • 功能:建立指定的工作区或使指定的工作区成为主工作区。 • 例如:使表文件rsda.dbf和xl.dbf 同时处于打开状态。 • select 1 将1号区置为当前工作区 • use rsda 在1号区中打开rsda.dbf • select 2 将2号区置为当前工作区 • use xl 在2号区中打开xl.dbf,不影响1号区中的文件。 • list 显示xl.dbf的内容 • select 1再次将1号区置为当前工作区 • list 显示1号工作区中已打开的表文件的内容
第三节 工作区间的互相访问 • 只有在当前工作区中,用户可以打开或关闭表文件,用户可以对当前工作区中已打开的表文件进行任意操作,包括增、删、改、编辑、定位、查询等。用户不能对其它非当前工作区中的表文件进行此类操作,但是,用户可以访问其它工作区中已打开的表文件里的当前记录的各个字段值。 • 不论用户当前位于哪个工作区,都可以引用在其他工作区中打开的表中的字段,引用时,要在此字段前加上被访问工作区的别名。引用格式如下: • 别名 -> 字段名 • 说明:<别名> 可以是 A – J中的一个,或者干脆就用被访问的文件名,<字段名> 指明了被访问的文件中的字段,箭头是减号和大于号的组合。 注意:哪个字段不是当前工作区的,须用 某区的别名表示 • 看图说明
例题:对rsda.dbf和 xl.dbf进行操作,显示黄丽丽的姓名、学历、职称的内容。 例题分析 显示当前表文件的内容 表示显示A工作区中已打开的表文件的当前记录的职称字段的值。由于其不在当前工作区,所以前面要加上工作区别名。
例题分析 • 本题中,因为我们的目的是显示黄丽丽的姓名、学历、职称,而这三个字段分处在两个表文件中,所以需要同时打开两个表文件 rsda.dbf 和 xl.dbf。 • 由于工作区之间是相互独立的,在1号工作区中将记录指针指向黄丽丽的记录,并不能保证2号工作区中的记录指针也指向黄丽丽,所以,在两个工作区里都执行了查找定位操作 Locate for 姓名=‘黄丽丽’ 将黄丽丽的记录置为当前记录 • 命令 disp 姓名,学历,A->职称中,由于职称字段不在当前工作区中,所以在他的前面要加上其所在工作区的别名 A-> 。注意: A->职称表示显示 A 区中当前记录的职称字段的值。 • 问题:最后一条命令为什么不能写成 • list field 姓名,学历,A->职称
第四节 表文件间的关联 • 在上一节工作区互访的例题中,由于两个工作区之间记录指针是相互独立的,所以需要分别在两个工作区中进行定位操作,将黄丽丽的记录都置为当前记录,然后才能同时显示黄丽丽的姓名、学历、职称三个字段的值。如果要显示另一个人的内容,还要再次进行定位操作,比较麻烦。 • 解决的方法是:将在不同工作区中打开的表文件,按照表与表之间的公共字段建立逻辑联系,当主表文件(主动表)的记录指针移动时,另一个工作区中与之具有逻辑关联的表文件(被动表)记录指针也相应的移动,从而使多表操作变的很方便。这种方法叫做表文件间的关联。
表文件间的关联 格式: Set relation to [ 关系表达式 ] into <工作区号> 功能:根据[关系表达式],建立当前工作区中的表文件(主动表)与<工作区号>所指定的工作区中的表文件(被动表)之间的关联。 说明: 1、建立关联之前,主动表与被动表必须在不同的工作区中同时被打开。 2、关联建立好以后,当移动主动表中记录指针时,被动表中的记录指针也会根据所建立的关联自动的做相应地移动,反之不行。 3、若两个表是按照它们的某个关键字段(公共字段)建立的关联,则建立关联之前,被动表必须按此关键字段建立了索引,且索引文件已打开。除非是按照记录号表达式建立的关联。 4、取消关联可用 SET RELATION TO 5、若想在保留当前关联关系的前提下,增加与其他数据库的关联。则可在建立第二个关联时加上 ADDITIVE子句。否则,就会将前一个关联取消。 例题: 例1例2例3
例题1: 在rsda.dbf(主动表)与xl.dbf(被动表)之间按照编号建立关联,使得当rsda.dbf的记录指针指向某一记录时,xl.dbf的记录指针也指向相同编号的记录。 说明: 在1区打开表xl 按关键字建立索引 在2区打开表rsda 在主工作区中建立关联 将主动表的记录指针指向 ‘0104’号记录 选择工作区,将当前工作区变为被动表(xl)所在的工作区(1号工作区) 可以看出被动表的指针也指向编号为0104的记录
例题2: 在rsda.dbf(主动表)与xl.dbf(被动表)之间按照姓名建立关联,然后显示所有人的编号、姓名、学历、职称字段的内容。 由于学历不在 当前工作区, 所以前面要加上 其所在工作区别名 前缀
例题3: 在rsda.dbf(主动表)与xl.dbf及tz.dbf按照姓名建立关联,然后显示所有人的编号、姓名、学历、职称、增加工资字段的内容。 • SELE 2 • USE XL • INDEX ON 姓名 TO XM1 • SELE 3 • USE TZ • INDEX ON 姓名 TO XM2 • SELE 1 • USE RSDA • SET RELATION TO 姓名 INTO B • SET RELATION TO 姓名 INTO C ADDITIVE • LIST 编号,姓名,B->学历,职称,C->增加工资
第五节 表文件间的连接 • 如果能想办法将原本不在同一个表文件中的字段合并到同一个表中,则接下来的操作就变成了单表操作了。 • 连接命令就是将两个表文件连接生成一个新表,新表中可以包含两个老表里的各个字段。 • 由于连接命令的结果要生成一个新表,所以会占用额外的存储空间。
表文件间的连接 格式: JOIN WITH < 别名> TO < 新表文件名> [FIELDS <字段名表> ] FOR <条件> 功能:将当前工作区中的表文件按照FOR 后面的<条件>与〈别名〉所指定的工作区中的表文件进行连接,连接的结果放入<新表文件名>所指定的表文件中。
表文件间的连接 说明: 1、省略 field <字段名表> 时,新表文件将包含两表文件的所有字段。否则新表中的字段为<字段名表> 中指定的字段。<别名>工作区中的字段应写为<别名>-><字段名> 。 2、省略for<条件>时,则主表中每个记录都将和辅表中每个记录连接,新表中的记录数将是主表的记录数乘以辅表的记录数。所以一般情况下,必须给出 for<条件>,并应注意条件的唯一性。 例:for 姓名=b->姓名 或 for 编号=b->编号 3、两个被连接的表文件必须分别在主工作区和<别名>工作区中被打开,且都不需要排序或索引。 4、 单击显示本命令的执行过程 5、 看图说明:
连接命令的执行过程 先将主表文件的当前记录置为第一条记录,然后按给定的条件对别名表中的每一条记录依次进行判断,若满足条件,由 fields <字段名表> 生成一条新记录,并加入到新生成的表中。然后接着在辅表文件中继续寻找符合条件的记录,找到后再和主表文件中当前记录连接形成第二个记录追加到新文件中。依次下去,直到没有满足条件的记录,此时,主表文件当前记录后移一个记录,再反复上述操作,直到主表文件的当前记录指向文件尾,则结束连接。
例题:在rsda.dbf与xl.dbf之间按照姓名相等的原则建立连接,生成的新表rx.dbf中包含姓名、性别、职称学历字段的内容。例题:在rsda.dbf与xl.dbf之间按照姓名相等的原则建立连接,生成的新表rx.dbf中包含姓名、性别、职称学历字段的内容。 按照姓名相等的原则 注意:连接的结果存放在新表中