1、第三章 数据库和数据表的操作第二部分3.4 索引文件及其应用数据表中的顺序是按输入的顺序存储在表中。数据表中的顺序是按输入的顺序存储在表中。如果查找某条记录怎么办?如果查找某条记录怎么办?3.4.1 索引文件及分类索引文件及分类 1.索引文件索引文件索引文件:它仅由两个字段组成,一个字段是索引文件:它仅由两个字段组成,一个字段是排序的关键字值(也可以是一个表达式),另排序的关键字值(也可以是一个表达式),另一个字段是每个关键字在原始数据表中对应的一个字段是每个关键字在原始数据表中对应的记录号。例,在记录号。例,在Rsda.dbf数据表中,以编号为数据表中,以编号为关键字段并按升序建立的索引文件
2、的示意图如关键字段并按升序建立的索引文件的示意图如下图所示。下图所示。在索引文件中,记录是按索引关键字值的顺序排列的在索引文件中,记录是按索引关键字值的顺序排列的,当要查找某一编号的记录时,当要查找某一编号的记录时,VFP先在索引文件中查找先在索引文件中查找该编号,找到后再根据对应的记录号,在数据表中将记该编号,找到后再根据对应的记录号,在数据表中将记录指针快速移动到该记录上。录指针快速移动到该记录上。一个索引文件中可以只有一个索引,也可以有一个索引文件中可以只有一个索引,也可以有多个索引多个索引。可以包含多个索引的索引文件称该文件为复合索引文件。可以包含多个索引的索引文件称该文件为复合索引文
3、件。在复合索引文件中,需要为每个索引指定一个索引标识在复合索引文件中,需要为每个索引指定一个索引标识名,以便于通过索引标识相互区分各个索引。名,以便于通过索引标识相互区分各个索引。3.4.1 索引文件及分类索引文件及分类 2.索引的类型索引的类型(1)主索引主索引主索引通常是主索引通常是数据表的关键字索引数据表的关键字索引,作为主索引的,作为主索引的字段称为主关键字。主索引不能用在自由表中,而字段称为主关键字。主索引不能用在自由表中,而只能用在数据库表中,可用于在只能用在数据库表中,可用于在永久关系中建立参永久关系中建立参照完整性照完整性。创建主索引的字段。创建主索引的字段不允许有重复值不允许
4、有重复值,且,且一个表一个表只能有一个主索引只能有一个主索引。例如,在数据表中,常用学生证号、身份证号、工例如,在数据表中,常用学生证号、身份证号、工作证号等作为主索引,而姓名可能有同名的情况,作证号等作为主索引,而姓名可能有同名的情况,一般不能作为主索引。一般不能作为主索引。3.4.1 索引文件及分类索引文件及分类(2)候选索引候选索引候选索引类似于主索引,候选索引类似于主索引,其索引值就不能有重复其索引值就不能有重复值。值。与主索引不同的是,与主索引不同的是,一个数据表中可以有多个候选一个数据表中可以有多个候选索引索引,而且侯选索引不能用来在永久关系中建立参,而且侯选索引不能用来在永久关系
5、中建立参照完整性。照完整性。(3)惟一索引惟一索引惟一索引表示索引值只能取一个,如果有两个或两惟一索引表示索引值只能取一个,如果有两个或两个以上的索引值,则只能取其中一个,因此,惟一个以上的索引值,则只能取其中一个,因此,惟一索引使用时可能会隐藏一些记录。例如,若有两个索引使用时可能会隐藏一些记录。例如,若有两个同名的人员,将姓名字段作为惟一索引,则只能找同名的人员,将姓名字段作为惟一索引,则只能找到一个记录,另一个记录将不会找到。到一个记录,另一个记录将不会找到。3.4.1 索引文件及分类索引文件及分类(4)普通索引普通索引 普通索引没有上面各索引的限制,是普通索引没有上面各索引的限制,是允
6、许重复索引值的允许重复索引值的索引索引。作为普通索引的字段,其字段值可以重复,。作为普通索引的字段,其字段值可以重复,也可也可以作为排序的依据以作为排序的依据,但因为可能有多个相同的索引值,但因为可能有多个相同的索引值,因此查询时会找到多个符合条件的记录。一个数据表中因此查询时会找到多个符合条件的记录。一个数据表中可以有可以有多个多个普通索引。普通索引。3.4.1 索引文件及分类索引文件及分类 3.索引文件的分类索引文件的分类单入口索引文件单入口索引文件(扩展名为(扩展名为.IDX)(IDX索引索引文件中只包含一个索引文件中只包含一个索引)复合索引文件复合索引文件(扩展名(扩展名.CDX),)
7、,.CDX索引文索引文件中可以包含有一个或多个索引,所以称为复件中可以包含有一个或多个索引,所以称为复合索引文件。合索引文件。结构化复合索引文件结构化复合索引文件非结构化复合索引文件非结构化复合索引文件(独立符合索引文件独立符合索引文件)结构化复合索引结构化复合索引的主文件名与数据表的的主文件名与数据表的主文件名相同,并随着数据表的打开而主文件名相同,并随着数据表的打开而打开,在添加、更改或删除记录时会自打开,在添加、更改或删除记录时会自动进行维护;动进行维护;非结构化复合索引文件非结构化复合索引文件(独立符合索引文独立符合索引文件件)的主文件名与数据表文件不同,必须的主文件名与数据表文件不同
8、,必须用命令打开。用命令打开。3.4.2 创建索引文件创建索引文件1.建立结构化复合索引文件建立结构化复合索引文件(1)在表设计器中创建索引文件在表设计器中创建索引文件(2)命令方式创建索引命令方式创建索引【格式格式】INDEX ON 表达式 TAG 索引标识名 FOR 条件表达式 ASCENDING|DESCENDING UNIQUE|CANDIDATEADDITIVE【功能功能】建立结构化复合索引文件。建立结构化复合索引文件。对对rsda表(表(1)按编号升序建立索引;()按编号升序建立索引;(2)按工作日期降序;()按工作日期降序;(3)先)先按按性别性别升序升序,若性别相同,则按,若性
9、别相同,则按工作日期工作日期升序建立索引(升序建立索引(rsda.cdx)USE rsda INDEX ON 编号编号 TAG bhINDEX ON 工作日期工作日期 TAG gzrq desc INDEX ON 性别性别+dtoc(工作日期工作日期)TAG xbrq 2.建立独立复合索引文件建立独立复合索引文件独立复合索引文件的扩展名也是独立复合索引文件的扩展名也是.CDX,但其但其主文件名与数据表文件名主文件名与数据表文件名不相同,且不相同,且使用时还需使用时还需单独打开单独打开。独立复合索引文件。独立复合索引文件主要用来创建那些使用不太频繁的索引。主要用来创建那些使用不太频繁的索引。独立
10、复合索引文件不能在表设计器中创建,独立复合索引文件不能在表设计器中创建,命令建立。命令建立。【格式格式】INDEX ON 表达式TAG 索引标识名 OF 独立复合索引文件名独立复合索引文件名 FOR 条件表达式 ASCENDING|DESCENDING UNIQUE|CANDIDATEADDITIVE 例:对例:对rsgl.dbf表,(表,(1)编号升序建立索引;)编号升序建立索引;(2)先按)先按性别性别升序升序,若性别相同,则按,若性别相同,则按工作工作日期日期升序建立独立索引文件升序建立独立索引文件gl.cdxuse rsglindex on 编号编号 tag bh cand of gl
11、.cdxindex on 性别性别+dtoc(出生日期出生日期)tag xbcsrq of gl.cdx 3.重新建立索引文件重新建立索引文件在数据表的使用过程中,当增删记录或数据表中被在数据表的使用过程中,当增删记录或数据表中被索引文件使用的关键字段改动时,索引文件使用的关键字段改动时,结构化复合索引结构化复合索引会随着数据表的打开自动打开并能及时得到更新会随着数据表的打开自动打开并能及时得到更新,但如果在使用数据表时未打开相应的独立复合索引但如果在使用数据表时未打开相应的独立复合索引文件或传统的单入口文件或传统的单入口.IDX索引文件,则索引文件会索引文件,则索引文件会因为无法及时更新而产
12、生错误索引。这时须打开索因为无法及时更新而产生错误索引。这时须打开索引文件,并对其重新索引。引文件,并对其重新索引。菜单方式:菜单方式:打开数据表打开数据表“显示显示”“”“浏览浏览”,菜单,菜单“表表”、“重重建建立索引建建立索引”命令,或打开数据表后用命令,或打开数据表后用REINDEX命令命令重新建立索引。重新建立索引。命令方式命令方式【格式格式】REINDEX 4、索引的删除若单索引:直接在windows中删除若复合索引,删除索引标识删除所有的索引标识:Delete tag all删除特指的索引标识Delete tag,3.4.3 索引文件的使用索引文件的使用 1.指定主控索引指定主控
13、索引 一个数据表可以建立一个数据表可以建立多个索引文件多个索引文件,每个索引,每个索引文件中又可能包含文件中又可能包含多个索引多个索引,而一种索引就是,而一种索引就是一种排序方式一种排序方式 在使用索引时,必须指明哪一个索引是对数据在使用索引时,必须指明哪一个索引是对数据表记录排序起作用的,即指定主控索引。表记录排序起作用的,即指定主控索引。在没有指定哪一个索引为主控索引之前,数据在没有指定哪一个索引为主控索引之前,数据表的表的访问顺序访问顺序仍然是原来的物理顺序,即按记仍然是原来的物理顺序,即按记录号的顺序访问。录号的顺序访问。主控索引和主索引有什么区别?主控索引和主索引有什么区别?主控索引
14、和主索引是完全不同的概念。主主控索引和主索引是完全不同的概念。主索引是用来控制数据的完整性的,而主控索引是用来控制数据的完整性的,而主控索引是用来指定目前记录排列顺序的。索引是用来指定目前记录排列顺序的。1.指定主控索引 菜单方式:菜单方式:“浏览浏览”“表表”“”“属性属性”命令命令-即弹出即弹出“工作区工作区属性属性”对话框对话框设定主控索引后,利用设定主控索引后,利用LIST、DISPLAY命令输命令输出的记录顺序也是排序后的顺序。出的记录顺序也是排序后的顺序。主控索引只是改变了记录的输出顺序,记录在数主控索引只是改变了记录的输出顺序,记录在数据库中的顺序并没有发生变化。据库中的顺序并没
15、有发生变化。命令方式命令方式【格式一格式一】USE 数据表名 ORDER TAG ASCENDING|DESCENDING【功能功能】打开表,同时指定结构化复合索引文件的索引为主打开表,同时指定结构化复合索引文件的索引为主控索引。控索引。【格式二格式二】SET ORDER TO TAG ASCENDING|DESCENDING【功能功能】打开表后,指定结构化复合索引文件的索引为主控打开表后,指定结构化复合索引文件的索引为主控索引。索引。对于独立的复合索引文件或单入口的索引文件,需要用对于独立的复合索引文件或单入口的索引文件,需要用命令将其打开和关闭,只有打开要使用的独立复合索引命令将其打开和关
16、闭,只有打开要使用的独立复合索引文件后,才能指定其中的索引为主控索引。文件后,才能指定其中的索引为主控索引。【格式一格式一】USE ORDER TAG OF ASCENDING|DESCENDING【格式二格式二】SET INDEX TO TAG OF (4)关闭索引文件【格式一】SET INDEX TO【格式二】CLOSE INDEX2.使用索引快速查找记录 FIND命令和命令和SEEK命令都可在指定主控命令都可在指定主控索引的情况下进行记录的查找操作。索引的情况下进行记录的查找操作。SEEK 表达式表达式USE Rsda ORDER TAG bh&打开打开Rsda同时同时指定指定BH为主控
17、索引为主控索引SEEK 03002disp SET ORDER TO gzrq&重新指定重新指定rq为主控为主控索引索引seek 1963/09/02&日期格式要与设置相同,否则会出错日期格式要与设置相同,否则会出错dispUse rsdaset order to bh3.5 数据表的统计计算 3.5.1 累加求和及求平均值 对每个记录的对每个记录的横向求和横向求和和统计可以用前面介绍的操和统计可以用前面介绍的操作或命令方便地给出,如作或命令方便地给出,如REPLACE命令。对于每命令。对于每个记录的个记录的纵向求和纵向求和统计可以用统计可以用累加求和累加求和命令实现。命令实现。【格式格式】S
18、UM|AVERAGE 表达式表范围 FOR 条件表达式 TO 内存变量名表|TO 数组变量名【例例】求出求出Rsgz.dbf中计算机系所有职工的月中计算机系所有职工的月基本工资平均值及全年实发工资之和并显示。基本工资平均值及全年实发工资之和并显示。AVERAGE 基本工资基本工资 TO a FOR SUBSTR(编编号号,1,2)=03 SUM 实发工资实发工资*12 TO b FOR SUBSTR(编编号号,1,2)=03“【例例】求出求出xscj每门课的平均成绩,每个每门课的平均成绩,每个同学的平均成绩和总成绩。同学的平均成绩和总成绩。use xscj.dbf brow average 英
19、语英语,数学数学,计算机计算机 to a,b,c?a,b,c repl all 总成绩总成绩 with 英语英语+数学数学+计算机,计算机,平均成绩平均成绩 with 总成绩总成绩/3 3.5.2 统计记录个数统计记录个数【格式格式】COUNT 范围范围FOR 条件表达式条件表达式 WHILE 条件表达式条件表达式TO 内存变量名表内存变量名表|TO 数组变量名数组变量名 例:统计每门课成绩均在例:统计每门课成绩均在90分以上的人数,以及不及格分以上的人数,以及不及格的人数。的人数。count for 英语英语=90 and 数学数学=90 and 计算机计算机=90 to s1 count
20、for 英语英语60 or 数学数学60 or 计算机计算机60 to s2?S1,s2 3.5.3 分类汇总分类汇总 分类汇总对已经建立了索引并且指定了主控索引的数据表,分类汇总对已经建立了索引并且指定了主控索引的数据表,可以按关键字进行分类求和可以按关键字进行分类求和【格式格式】TOTAL ON 关键字表达式关键字表达式 TO 新表名新表名 FIELDS 字段名表字段名表 范围范围FOR 条件表达式条件表达式WHILE 条件表达式条件表达式2 当前数据表必须是按关键字表达式索引过,并当前数据表必须是按关键字表达式索引过,并指定该索引为主控索引,以保证具有相同关键字值的记指定该索引为主控索引
21、,以保证具有相同关键字值的记录能连续访问。录能连续访问。FIELDS短语给出了需分类求和的字段名,这些字段短语给出了需分类求和的字段名,这些字段只能是数值型或货币型的,如果缺省,则对当前表中的只能是数值型或货币型的,如果缺省,则对当前表中的所有数值型或货币型字段分类求和。不管选不选所有数值型或货币型字段分类求和。不管选不选FIELDS短语,新表与当前表的结构是一样的。短语,新表与当前表的结构是一样的。对当前数据表中的若干个关键字表达式相同的记录,对当前数据表中的若干个关键字表达式相同的记录,生成新表中的一条记录。这条记录的非数值型或非货币生成新表中的一条记录。这条记录的非数值型或非货币型字段取
22、自关键字相同的一组记录中首记录的相应字段,型字段取自关键字相同的一组记录中首记录的相应字段,参加求和的字段值取自求和结果。参加求和的字段值取自求和结果。例题(1)统计本月每种商品的台数和总价,以及统计本月每种商品的台数和总价,以及每个售货员销售的台数和总价每个售货员销售的台数和总价例题 USE xs.dbf brow repl all 总价总价 with 单价单价*台数台数 index on 售货员售货员 to shy total on 售货员售货员 to shytj fields 台数台数,总价总价 index on 商品名商品名 to spm total on 商品名商品名 to sptj
23、 fields 台数台数,总价总价 use shytj brow use sptj brow(2)统计每天的销售台数和总价,以及本月统计每天的销售台数和总价,以及本月每天每个售货员的销售台数和总价。每天每个售货员的销售台数和总价。Index on 日期日期 tag rq Total on 日期日期 to rqtj fields 台数台数,总价总价 Index on 日期日期+售货员售货员 tag rqshy Total on 日期日期+售货员售货员 to rqshtj fields 台台数数,总价总价3.6 数据交换 3.6.1 数组与数据表的数据交换 1.将数据表中的记录数据保存到数组中将数
24、据表中的记录数据保存到数组中【格式一格式一】SCATTER FIELDS 字段名表字段名表 MEMO TO 数组名数组名【格式二格式二】COPY TO ARRAY 数组名数组名FIELDS 字段名表字段名表 范围范围FOR 逻辑逻辑表达式表达式【功能功能】将当前打开的数据表中的某些记将当前打开的数据表中的某些记录数据存储在数组中。录数据存储在数组中。2.将数组中的数据传递到当前数据表中将数组中的数据传递到当前数据表中【格式一格式一】GATHER FROM 数组名数组名 FIELDS 字段名表字段名表MEMO【格式二格式二】APPEND FROM ARRAY 数组名数组名 FOR 逻辑表达式逻辑
25、表达式FIELDS 字段名表字段名表【功能功能】将数组中各元素的数据传递给当前打开将数组中各元素的数据传递给当前打开的数据表中。的数据表中。注意:请读者将注意:请读者将COPY TO ARRAY与与SCATTER、APPEND FROM ARRAY与与GATHER FROM的差的差别搞清楚。别搞清楚。例:将第例:将第1条记录与第条记录与第4条记录互换条记录互换 go 1 Scatter to a&把第一条记录存到变量把第一条记录存到变量a中中 go 4 Scatter to b&把第四条记录存到变量把第四条记录存到变量b中中 go 1 gather from b&把把b中存的第中存的第4条记录
26、复制到条记录复制到第第1条记录条记录 go 4 gather from a&把把a中存的第中存的第1条记录复制到第条记录复制到第4条记录条记录 例:将前四条记录复制到另一新表例:将前四条记录复制到另一新表xscjtemp中中 copy to array b next 4&将前四条记录复制到内存变将前四条记录复制到内存变量中量中 disp memo&显示内存变量显示内存变量 copy stru to xscjtemp&生成一个与生成一个与xscj相同的表结相同的表结构,空表构,空表 use xscjtemp&打开表打开表 append from array b&将内存中存储的记录追加到将内存中存
27、储的记录追加到表表 brow3.6.2 文件复制文件复制 1.复制部分记录或整个数据表(生成新表)复制部分记录或整个数据表(生成新表)【格式格式】COPY TO 表文件名 FOR|WHILE FIELDS DATABASE NAME WITH CDX|WITH PRODUCTION|SDF|SYLK|WK1|WKS|WR1|WRK|XLS|XL5|DELIMITED WITH|WITH BLANK|例题:将例题:将rsda中中1980年以后工作的员工复年以后工作的员工复制到新表制到新表rsda80 use rsda copy to rsda1 fields 姓名姓名,性别性别,职称职称,工作工
28、作日期日期 for year(工作日期工作日期)1980 use rsda1 brow 2.复制数据表的结构复制数据表的结构【格式格式】COPY STRUCTURE TO 表文件名FIELDS 字段名表 WITH CDX|WITH PRODUCTION 说明:说明:若不选可选项,生成的表结构具有与原若不选可选项,生成的表结构具有与原数据表相同的字段名、类型和宽度。数据表相同的字段名、类型和宽度。若选若选FIELDS子句,生成的表结构只有字段子句,生成的表结构只有字段名表中的字段,字段名之间用逗号隔开。名表中的字段,字段名之间用逗号隔开。CDX和和PRODUCTION的意义与复制记录时的的意义与
29、复制记录时的意义一致。意义一致。3.7 多数据表操作 在一个数据库中,一般都有着许多个数据在一个数据库中,一般都有着许多个数据表。而在对这些表的使用中,也经常是多表。而在对这些表的使用中,也经常是多个表中的数据同时被用到。个表中的数据同时被用到。VFP提供了强提供了强有力的多数据表操作能力,引入了有力的多数据表操作能力,引入了工作区工作区和和表的别名表的别名这两个概念。用户可以在这两个概念。用户可以在不同不同的工作区中同时打开多个表,也可以在不的工作区中同时打开多个表,也可以在不同的工作区打开同一个表同的工作区打开同一个表,通过表的别名,通过表的别名,用户可以引用在不同工作区打开的表中的用户可
30、以引用在不同工作区打开的表中的数据。数据。3.7.1 工作区的基本概念 所谓“打开”数据表,实际上就是VFP在内存中开辟了一个区域(亦称缓冲区)与磁盘上数据表之间建立起一种映射关系,使VFP通过缓冲区使用磁盘上数据表里的数据,这个内存中的缓冲区就称为工作区。1.工作区的性质工作区的性质(1)在每)在每一个工作区中一个工作区中只能打开一个只能打开一个表表,VFP最多可以开辟最多可以开辟32767个工作区,个工作区,打开打开32767个表。个表。允许一个表在允许一个表在几个工几个工作区作区中同时打开中同时打开。(2)在某一时刻在某一时刻只能选择一个工作区为只能选择一个工作区为“当前工作区当前工作区
31、”,对其中的表进行操作。对其中的表进行操作。系统初始状态默认系统初始状态默认1号工作区为号工作区为当当前工作区前工作区。(3)每一工作区打开的数据表都有各自的记录指针。)每一工作区打开的数据表都有各自的记录指针。在在一般情况下,一般情况下,对数据表的操作只能移动当前工作区的记录对数据表的操作只能移动当前工作区的记录指针指针。当使得数据表之间。当使得数据表之间建立临时建立临时关系以后,另一工作区关系以后,另一工作区的记录指针才能根据要求伴随当前工作区的记录指针作相的记录指针才能根据要求伴随当前工作区的记录指针作相应的移动应的移动。(4)内存变量内存变量对各工作区是公用的对各工作区是公用的,每一工
32、作区的,每一工作区的字段字段变量变量对其它各工作区也是公用的。对其它各工作区也是公用的。在任意工作区都可以对在任意工作区都可以对其它工作区的当前记录进行其它工作区的当前记录进行读、写读、写操作操作。工作区的编号和别名工作区的编号和别名 为了标识每一个工作区,系统给每一工作为了标识每一个工作区,系统给每一工作区编号,号码为区编号,号码为1、2、32767。同时还为。同时还为工作区规定了别名,其中工作区规定了别名,其中1至至10号工作区别名为号工作区别名为A、B、J;11至至32767号工作区别名为号工作区别名为W11、W12、W32767。给数据表命名时,给数据表命名时,不要与工作区的别名冲突不
33、要与工作区的别名冲突,否则容易引起混乱。否则容易引起混乱。数据表别名数据表别名 在打开数据表的同时,可以为数据表起一个别在打开数据表的同时,可以为数据表起一个别名,这个别名也作为名,这个别名也作为打开该数据表的工作区别名打开该数据表的工作区别名。格式格式USE ALIAS|again 说明:说明:若不指定工作区,则默认为在当前工作若不指定工作区,则默认为在当前工作区上打开指定的数据表,并区上打开指定的数据表,并同时关闭以前在当前同时关闭以前在当前工作区上打开的数据表工作区上打开的数据表。ALIAS 为可选项,不指定别名时,原为可选项,不指定别名时,原数据表名就是它的别名。数据表名就是它的别名。
34、USE Rsda ALIAS da&表表Rsda的别名就是的别名就是da USE Rsda&默认默认Rsda表的别名表的别名若选择了若选择了IN 0短语,表示在当前空闲的短语,表示在当前空闲的编号编号最小工作区最小工作区上打开数据表。上打开数据表。该命令只是在指定的工作区上打开数据表,该命令只是在指定的工作区上打开数据表,并不能改变当前工作区并不能改变当前工作区。改变当前工作需要单。改变当前工作需要单独的命令。独的命令。一旦一个工作区上打开了一个数据表,一旦一个工作区上打开了一个数据表,数据数据表就和该工作区建立起对应关系表就和该工作区建立起对应关系,所以打开数,所以打开数据表后可以用数据表的
35、别名来代替工作区别名。据表后可以用数据表的别名来代替工作区别名。3.7.2 工作区的选择和使用工作区的选择和使用 1.选择工作区(1)利用利用“数据工作区数据工作区”窗口选择工作区窗口选择工作区选择选择窗口窗口菜单中的菜单中的数据工作期数据工作期命令,或单命令,或单击常用工具栏中的击常用工具栏中的数据工作期窗口数据工作期窗口按钮,打开按钮,打开数据工作期数据工作期窗口。窗口。这时默认当前工作区为这时默认当前工作区为1。单击打开按钮选择。单击打开按钮选择一个数据表打开。若再次单击打开按钮,可以一个数据表打开。若再次单击打开按钮,可以依次在其它工作区打开其它数据表,并且依次在其它工作区打开其它数据
36、表,并且可以用显可以用显示的示的别名别名选择工作区选择工作区。在数据工作期窗口还可以浏览各工作区打开的数在数据工作期窗口还可以浏览各工作区打开的数据表,还可以关闭他们。据表,还可以关闭他们。(2)利用利用SELECT命令选择工作区命令选择工作区格式格式SELECT|说明:说明:选择当前工作区选择当前工作区,选择的工作区,选择的工作区中可以是在前面已经打开了数据表,也中可以是在前面已经打开了数据表,也可以是未曾打开表。可以是未曾打开表。例:例:USE Rsda&默认在默认在1号工作区打开号工作区打开Rsda.dbf SELECT d&选择选择4号工作区为当前工作区号工作区为当前工作区 USE R
37、sgl&在当前(在当前(4号)工作区打开号)工作区打开Rsgl.dbf USE Rsgz ALIAS gz&在当前在当前4号工作区打开号工作区打开Rsgz,同时关闭,同时关闭Rsgl SELECT 1&选择选择1区为当前工作区区为当前工作区 LIST&显示当前(显示当前(1号)工作区数据表(号)工作区数据表(Rsda)的记录)的记录 SELECT gz&或或SELE 4,SELE d,但不能但不能SELE Rsgz LIST&显示显示Rsgz的记录的记录 SELE Rsda&是否可以?为什幺?是否可以?为什幺?LIST?SELECT()&给出当前工作区号函数,返回当前工作区号给出当前工作区号函
38、数,返回当前工作区号例:例:USE Rsgl IN 10?SELECT()USE&关闭当前工作区上的数据表关闭当前工作区上的数据表 USE Rsgl IN 0?SELECT()2在不同工作区打开同一个数据表在不同工作区打开同一个数据表例例 SELE 1 USE Rsda USE Rsda ALIAS da IN 3 AGAIN SELE 2 USE Rsda AGAIN 3.使用非当前工作区中表的数据使用非当前工作区中表的数据方法是在非当前工作区的表的字段名前加注方法是在非当前工作区的表的字段名前加注工作区别名或表的别名。格式为:工作区别名或表的别名。格式为:-或或 .注意,这里的符号注意,这
39、里的符号“-”是是“-”和和“”两个两个(均为半角)符号复合而成。(均为半角)符号复合而成。例例(rsgl(编号、部门名、姓名、性别、出生日期、文化程度、职位、婚编号、部门名、姓名、性别、出生日期、文化程度、职位、婚否否),Rsda(编号、姓名、性别、工作日期、职称、简历、照片编号、姓名、性别、工作日期、职称、简历、照片)select 1use rsgluse rsda in 2sele 1List 姓名姓名,部门名部门名,出生日期出生日期,b-姓名姓名,b-工作日期工作日期显示结果如下:在在VFP中,表之间关联有中,表之间关联有临时关系临时关系和和永久关系永久关系两种关联两种关联1.设置表的
40、临时关系设置表的临时关系(1)利用数据工作期窗口建立表的临时关系利用数据工作期窗口建立表的临时关系3.7.3 数据表的关联数据表的关联123List 姓名姓名,部门名部门名,出生日期出生日期,b-姓名姓名,b-工作日期工作日期(2)利用命令建立表之间的临时关系利用命令建立表之间的临时关系【格式格式】SET RELATION TO 关键字表达式|数值表达式1 INTO 工作区别名1|子表别名1 ,关键字表达式2|数值表达式2 INTO 工作区别名2|表别名2 ADDITIVE说明:说明:建立临时关系以后,父表和子表记录指针的移动的规则是:父表指针每移动到一个记录,子表则按关键字表达式的值进行索引
41、查找,并将记录指针定位在相应记录上。若子表中没有记录和父表的当前记录相关联,子表的记录指针将指向EOF;若子表中有多个记录和父表的当前记录相关联,则子表的记录指针将指向第一个相匹配的记录。必须选择父表所在工作区为当前工作区,然后再使用本命令与非当前工作区中的数据表(子表)建立关联。选ADDITIVE项可使父数据表与子表建立关联时,原先已存在的关联仍然保留。如果不选用该项,则建立新关联时将取消原有关联。子表必须按关键字表达式中的关键字段建立索引,且被指定为主控索引。通常情况下,用两个表都具有的相同字段作为建立临时关系的关键字表达式。不选任何可选项则取消已与当前表建立的关联。父表可以与多个子表建立
42、关联。【例例】某书店有一个图书库存数据表某书店有一个图书库存数据表Tskc.dbf,存放有该书店所有的图书信息,存放有该书店所有的图书信息,另有一个图书调价数据表另有一个图书调价数据表tstj.dbf,其中存,其中存放着图书调价后的新价格放着图书调价后的新价格,现要求编制程,现要求编制程序,用序,用Tstj.dbf中的单价数据更新中的单价数据更新Tskc.dbf中的单价数据。假设中的单价数据。假设Tstj.dbf数数据表中的记录和据表中的记录和Tskc.dbf中的记录是一一中的记录是一一对应的,即凡是出现在对应的,即凡是出现在Tskc.dbf中图书都中图书都调价了,则可用如下的程序:调价了,则
43、可用如下的程序:select 1 use tskc select 2 use tstj index on 图书编号图书编号 tag tsbh set order to tsbh select 1 set relation to 图书编号图书编号 into b repl all 单价单价 with b-单价单价 list 2设置表间的永久关系设置表间的永久关系永久关系永久关系是存储在数据库文件(是存储在数据库文件(.DBC)中的数据表之)中的数据表之间的关系间的关系,它作为数据库的组成部分一直保留。它不像,它作为数据库的组成部分一直保留。它不像临时关系每次打开数据表时都要重新建立。临时关系每次打
44、开数据表时都要重新建立。数据库中的数据表建立永久关系后,借助这种关系不仅数据库中的数据表建立永久关系后,借助这种关系不仅仅从当前选定的表中访问数据,而且还可以访问相关数仅从当前选定的表中访问数据,而且还可以访问相关数据表中的数据。据表中的数据。当在查询设计器,视图设计器、表单设计器中的数据环当在查询设计器,视图设计器、表单设计器中的数据环境中使用这些数据表时,这些永久关系将作为这些表之境中使用这些数据表时,这些永久关系将作为这些表之间的默认连接关系自动出现。而且以后使用查询文件,间的默认连接关系自动出现。而且以后使用查询文件,视图文件及表格文件时,这些永久关系也自动把相关数视图文件及表格文件时
45、,这些永久关系也自动把相关数据表连接起来。据表连接起来。与永久关系的作用不同,临时关系是控制表之与永久关系的作用不同,临时关系是控制表之间间记录指针记录指针的连动关系的连动关系。永久关系不具有这个。永久关系不具有这个功能,而是使功能,而是使相关数据建立连接相关数据建立连接关系关系。在永久关系中还可以建立参照完整性,对各数在永久关系中还可以建立参照完整性,对各数据表之间进行完整性约束。据表之间进行完整性约束。表之间关系的类型表之间关系的类型表与表之间的关系实际上就是,表与表之间的关系实际上就是,按照某一关键按照某一关键字建立的几个数据表之间字建立的几个数据表之间相关记录相关记录的关系的关系。根据
46、一个表中的记录与另一表中相关记录之间根据一个表中的记录与另一表中相关记录之间的对应数量关系,关系的类型可分为:的对应数量关系,关系的类型可分为:一对一关系一对一关系:是指一个表中的一个记录与另:是指一个表中的一个记录与另一表中的唯一记录相关联。一表中的唯一记录相关联。一对多关系一对多关系:是指一个表中的一个记录与另:是指一个表中的一个记录与另一表中的多个记录相关联,但另一表中的一一表中的多个记录相关联,但另一表中的一个记录则只能与这个表中的唯一记录相对应。个记录则只能与这个表中的唯一记录相对应。在关系数据库设计时,应避免将表设计成在关系数据库设计时,应避免将表设计成“多多对多关系对多关系”,通
47、过数据规范化设计将,通过数据规范化设计将“多对多多对多关系关系”转换成转换成“一对多关系一对多关系”来建立数据库。来建立数据库。也可以在两个表间建立一个连接表,两个表分也可以在两个表间建立一个连接表,两个表分别和连接表建立一对多关系,间接实现多对多别和连接表建立一对多关系,间接实现多对多关系关系(1)建立表间的永久连接)建立表间的永久连接 建立建立Rsbm与与Rsgl的关联、的关联、Rsgl与与Rsda的关联。的关联。Rsgl与与Rsda根据编号建立一对根据编号建立一对一的关联一的关联;由于在;由于在Rsbm中一个部门可以中一个部门可以在在Rsgl中找到多条记录,所以两个数据中找到多条记录,所
48、以两个数据表之间的关系为表之间的关系为一对多一对多的关系。两个表已的关系。两个表已根据共同字段根据共同字段“部门名部门名”建立了索引,建立了索引,“一一”方(方(Rsbm)建立了以)建立了以“部门名部门名”为索引标识的主索引,为索引标识的主索引,“多多”方建立了以方建立了以“部门名部门名”为索引标识的普通索引。为索引标识的普通索引。在数据库设计器中建立永久关系(2)编辑数据表之间的关联 永久关系永久关系临时关系临时关系区别区别作用作用主要用来设置参照完整性主要用来设置参照完整性控制两张打开的表之间记录的访问控制两张打开的表之间记录的访问创建方创建方法法创建主表的创建主表的主索引或候选索主索引或
49、候选索引引 创建子表的创建子表的任意任意类型类型索引索引 基于索引创建永久关系基于索引创建永久关系打开两张要创建临时关系的表打开两张要创建临时关系的表 设置子表的主控索引设置子表的主控索引 选择主表工作区选择主表工作区 用用SET RELATIONSET RELATION 命令创建临时关命令创建临时关系系创建条创建条件件只能在同一数据库中的表之只能在同一数据库中的表之间创建间创建可以在任意库表、自由表、视图、可以在任意库表、自由表、视图、临时表之间创建临时表之间创建主表数主表数一张表可以作为多张永久关一张表可以作为多张永久关系的子表,即一张子表可以系的子表,即一张子表可以有多张主表有多张主表一
50、张表只能作为一张临时关系的子一张表只能作为一张临时关系的子表表生命期生命期永久存储在数据库文件中永久存储在数据库文件中随表的关闭而解除随表的关闭而解除联系联系创建永久关系或临时关系的基础是两张表之间确实存在着关系创建永久关系或临时关系的基础是两张表之间确实存在着关系 VFPVFP根据表之间的永久关系在表单或报表的数据环境中自动创建临根据表之间的永久关系在表单或报表的数据环境中自动创建临时关系时关系 一张主表可以有多张子表一张主表可以有多张子表3.8 管理数据库 3.8.1 使用多个数据库1在项目中新建或添加数据库在项目中新建或添加数据库2从项目中移去数据库从项目中移去数据库3打开多个数据库打开