




已阅读5页,还剩74页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,第三章 数据库和数据表的操作 第二部分,3.4 索引文件及其应用,数据表中的顺序是按输入的顺序存储在表中。 如果查找某条记录怎么办?,3.4.1 索引文件及分类,1. 索引文件 索引文件:它仅由两个字段组成,一个字段是排序的关键字值(也可以是一个表达式),另一个字段是每个关键字在原始数据表中对应的记录号。例,在Rsda.dbf数据表中,以编号为关键字段并按升序建立的索引文件的示意图如下图所示。,在索引文件中,记录是按索引关键字值的顺序排列的,当要查找某一编号的记录时,VFP先在索引文件中查找该编号,找到后再根据对应的记录号,在数据表中将记录指针快速移动到该记录上。 一个索引文件中可以只有一个索引,也可以有多个索引。可以包含多个索引的索引文件称该文件为复合索引文件。在复合索引文件中,需要为每个索引指定一个索引标识名,以便于通过索引标识相互区分各个索引。,3.4.1 索引文件及分类,2. 索引的类型 (1)主索引 主索引通常是数据表的关键字索引,作为主索引的字段称为主关键字。主索引不能用在自由表中,而只能用在数据库表中,可用于在永久关系中建立参照完整性。创建主索引的字段不允许有重复值,且一个表只能有一个主索引。 例如,在数据表中,常用学生证号、身份证号、工作证号等作为主索引,而姓名可能有同名的情况,一般不能作为主索引。,3.4.1 索引文件及分类,(2)候选索引 候选索引类似于主索引,其索引值就不能有重复值。与主索引不同的是,一个数据表中可以有多个候选索引,而且侯选索引不能用来在永久关系中建立参照完整性。 (3)惟一索引 惟一索引表示索引值只能取一个,如果有两个或两个以上的索引值,则只能取其中一个,因此,惟一索引使用时可能会隐藏一些记录。例如,若有两个同名的人员,将姓名字段作为惟一索引,则只能找到一个记录,另一个记录将不会找到。,3.4.1 索引文件及分类,(4)普通索引 普通索引没有上面各索引的限制,是允许重复索引值的索引。作为普通索引的字段,其字段值可以重复,也可以作为排序的依据,但因为可能有多个相同的索引值,因此查询时会找到多个符合条件的记录。一个数据表中可以有多个普通索引。,3.4.1 索引文件及分类,3. 索引文件的分类 单入口索引文件(扩展名为.IDX)( IDX索引文件中只包含一个索引) 复合索引文件(扩展名.CDX),.CDX索引文件中可以包含有一个或多个索引,所以称为复合索引文件。 结构化复合索引文件 非结构化复合索引文件(独立符合索引文件),结构化复合索引的主文件名与数据表的主文件名相同,并随着数据表的打开而打开,在添加、更改或删除记录时会自动进行维护; 非结构化复合索引文件(独立符合索引文件)的主文件名与数据表文件不同,必须用命令打开。,3.4.2 创建索引文件,1. 建立结构化复合索引文件 (1) 在表设计器中创建索引文件,(2) 命令方式创建索引 【格式】INDEX ON 表达式 TAG 索引标识名 FOR 条件表达式 ASCENDING|DESCENDING UNIQUE|CANDIDATEADDITIVE 【功能】建立结构化复合索引文件。 对rsda表(1)按编号升序建立索引;(2)按工作日期降序;(3)先按性别升序,若性别相同,则按工作日期升序建立索引(rsda.cdx) USE rsda INDEX ON 编号 TAG bh INDEX ON 工作日期 TAG gzrq desc INDEX ON 性别+dtoc(工作日期) TAG xbrq,2. 建立独立复合索引文件 独立复合索引文件的扩展名也是.CDX,但其主文件名与数据表文件名不相同,且使用时还需单独打开。独立复合索引文件主要用来创建那些使用不太频繁的索引。 独立复合索引文件不能在表设计器中创建,命令建立。,【格式】INDEX ON 表达式TAG 索引标识名 OF 独立复合索引文件名 FOR 条件表达式 ASCENDING|DESCENDING UNIQUE|CANDIDATEADDITIVE,例:对rsgl.dbf表,(1)编号升序建立索引;(2)先按性别升序,若性别相同,则按工作日期升序建立独立索引文件gl.cdx use rsgl index on 编号 tag bh cand of gl.cdx index on 性别+dtoc(出生日期) tag xbcsrq of gl.cdx,3. 重新建立索引文件 在数据表的使用过程中,当增删记录或数据表中被索引文件使用的关键字段改动时,结构化复合索引会随着数据表的打开自动打开并能及时得到更新,但如果在使用数据表时未打开相应的独立复合索引文件或传统的单入口.IDX索引文件,则索引文件会因为无法及时更新而产生错误索引。这时须打开索引文件,并对其重新索引。,菜单方式: 打开数据表“显示”“浏览”,菜单“表”、“重建建立索引”命令,或打开数据表后用REINDEX命令重新建立索引。 命令方式 【格式】REINDEX,4、索引的删除 若单索引:直接在windows中删除 若复合索引,删除索引标识 删除所有的索引标识: Delete tag all 删除特指的索引标识 Delete tag , ,3.4.3 索引文件的使用,1. 指定主控索引 一个数据表可以建立多个索引文件,每个索引文件中又可能包含多个索引,而一种索引就是一种排序方式 在使用索引时,必须指明哪一个索引是对数据表记录排序起作用的,即指定主控索引。 在没有指定哪一个索引为主控索引之前,数据表的访问顺序仍然是原来的物理顺序,即按记录号的顺序访问。,主控索引和主索引有什么区别? 主控索引和主索引是完全不同的概念。主索引是用来控制数据的完整性的,而主控索引是用来指定目前记录排列顺序的。,1. 指定主控索引,(1) 指定结构化复合索引文件中的索引为主控索引 菜单方式: “浏览”“表”“属性”命令-即弹出“工作区属性”对话框,设定主控索引后,利用LIST、DISPLAY命令输出的记录顺序也是排序后的顺序。 主控索引只是改变了记录的输出顺序,记录在数据库中的顺序并没有发生变化。,命令方式 【格式一】USE 数据表名 ORDER TAG ASCENDING|DESCENDING 【功能】打开表,同时指定结构化复合索引文件的索引为主控索引。 【格式二】SET ORDER TO TAG ASCENDING|DESCENDING 【功能】打开表后,指定结构化复合索引文件的索引为主控索引。,(2) 指定独立复合索引文件中的索引为主控索引 对于独立的复合索引文件或单入口的索引文件,需要用命令将其打开和关闭,只有打开要使用的独立复合索引文件后,才能指定其中的索引为主控索引。 【格式一】USE ORDER TAG OF ASCENDING|DESCENDING 【格式二】SET INDEX TO TAG OF ,(4) 关闭索引文件 【格式一】SET INDEX TO 【格式二】CLOSE INDEX,2. 使用索引快速查找记录,FIND命令和SEEK命令都可在指定主控索引的情况下进行记录的查找操作。 SEEK 表达式,USE Rsda ORDER TAG bh & 打开Rsda同时指定BH为主控索引 SEEK “03002“ disp SET ORDER TO gzrq& 重新指定rq为主控索引 seek 1963/09/02 & 日期格式要与设置相同,否则会出错 disp,Use rsda set order to bh,3.5 数据表的统计计算,3.5.1 累加求和及求平均值 对每个记录的横向求和和统计可以用前面介绍的操作或命令方便地给出,如REPLACE命令。对于每个记录的纵向求和统计可以用累加求和命令实现。 【格式】SUM|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 英语,数学,计算机 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 for 英语60 or 数学60 or 计算机60 to s2 ? S1,s2,3.5.3 分类汇总 分类汇总对已经建立了索引并且指定了主控索引的数据表,可以按关键字进行分类求和 【格式】TOTAL ON 关键字表达式 TO 新表名 FIELDS 字段名表 范围FOR 条件表达式WHILE 条件表达式2, 当前数据表必须是按关键字表达式索引过,并指定该索引为主控索引,以保证具有相同关键字值的记录能连续访问。 FIELDS短语给出了需分类求和的字段名,这些字段只能是数值型或货币型的,如果缺省,则对当前表中的所有数值型或货币型字段分类求和。不管选不选FIELDS短语,新表与当前表的结构是一样的。 对当前数据表中的若干个关键字表达式相同的记录,生成新表中的一条记录。这条记录的非数值型或非货币型字段取自关键字相同的一组记录中首记录的相应字段,参加求和的字段值取自求和结果。,例题,(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 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. 将数据表中的记录数据保存到数组中 【格式一】SCATTER FIELDS 字段名表 MEMO TO 数组名 【格式二】COPY TO ARRAY 数组名FIELDS 字段名表 范围FOR 逻辑表达式 【功能】将当前打开的数据表中的某些记录数据存储在数组中。,2. 将数组中的数据传递到当前数据表中 【格式一】GATHER FROM 数组名 FIELDS 字段名表MEMO 【格式二】APPEND FROM ARRAY 数组名 FOR 逻辑表达式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条记录复制到第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 &将内存中存储的记录追加到表 brow,3.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 姓名,性别,职称,工作日期 for year(工作日期)1980 use rsda1 brow,2. 复制数据表的结构 【格式】COPY STRUCTURE TO 表文件名FIELDS 字段名表 WITH CDX | WITH PRODUCTION,说明: 若不选可选项,生成的表结构具有与原数据表相同的字段名、类型和宽度。 若选FIELDS子句,生成的表结构只有字段名表中的字段,字段名之间用逗号隔开。 CDX和PRODUCTION的意义与复制记录时的意义一致。,3.7 多数据表操作,在一个数据库中,一般都有着许多个数据表。而在对这些表的使用中,也经常是多个表中的数据同时被用到。VFP提供了强有力的多数据表操作能力,引入了工作区和表的别名这两个概念。用户可以在不同的工作区中同时打开多个表,也可以在不同的工作区打开同一个表,通过表的别名,用户可以引用在不同工作区打开的表中的数据。,3.7.1 工作区的基本概念 所谓“打开”数据表,实际上就是VFP在内存中开辟了一个区域(亦称缓冲区)与磁盘上数据表之间建立起一种映射关系,使VFP通过缓冲区使用磁盘上数据表里的数据,这个内存中的缓冲区就称为工作区。 1. 工作区的性质 (1)在每一个工作区中只能打开一个表,VFP最多可以开辟32767个工作区,打开32767个表。允许一个表在几个工作区中同时打开。,( 2 )在某一时刻只能选择一个工作区为“当前工作区”,对其中的表进行操作。系统初始状态默认1号工作区为当前工作区。 (3)每一工作区打开的数据表都有各自的记录指针。在一般情况下,对数据表的操作只能移动当前工作区的记录指针。当使得数据表之间建立临时关系以后,另一工作区的记录指针才能根据要求伴随当前工作区的记录指针作相应的移动。 (4)内存变量对各工作区是公用的,每一工作区的字段变量对其它各工作区也是公用的。在任意工作区都可以对其它工作区的当前记录进行读、写操作。,工作区的编号和别名 为了标识每一个工作区,系统给每一工作区编号,号码为1、2、32767。同时还为工作区规定了别名,其中1至10号工作区别名为A、B、J;11至32767号工作区别名为W11、W12、W32767。 给数据表命名时,不要与工作区的别名冲突,否则容易引起混乱。,数据表别名 在打开数据表的同时,可以为数据表起一个别名,这个别名也作为打开该数据表的工作区别名。 格式USE ALIASIN|again 说明: 若不指定工作区,则默认为在当前工作区上打开指定的数据表,并同时关闭以前在当前工作区上打开的数据表。 ALIAS 为可选项,不指定别名时,原数据表名就是它的别名。,USE Rsda ALIAS da &表Rsda的别名就是da USE Rsda &默认Rsda表的别名,若选择了IN 0短语,表示在当前空闲的编号最小工作区上打开数据表。 该命令只是在指定的工作区上打开数据表,并不能改变当前工作区。改变当前工作需要单独的命令。 一旦一个工作区上打开了一个数据表,数据表就和该工作区建立起对应关系,所以打开数据表后可以用数据表的别名来代替工作区别名。,3.7.2 工作区的选择和使用,1. 选择工作区 (1) 利用“数据工作区”窗口选择工作区 选择窗口菜单中的数据工作期命令,或单击常用工具栏中的数据工作期窗口按钮,打开数据工作期窗口。 这时默认当前工作区为1。单击打开按钮选择一个数据表打开。若再次单击打开按钮,可以依次在其它工作区打开其它数据表,并且可以用显示的别名选择工作区。 在数据工作期窗口还可以浏览各工作区打开的数据表,还可以关闭他们。,(2) 利用SELECT命令选择工作区 格式SELECT | 说明:选择当前工作区,选择的工作区中可以是在前面已经打开了数据表,也可以是未曾打开表。,例:USE Rsda &默认在1号工作区打开Rsda.dbf SELECT d &选择4号工作区为当前工作区 USE Rsgl &在当前(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() &给出当前工作区号函数,返回当前工作区号例: 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. 使用非当前工作区中表的数据 方法是在非当前工作区的表的字段名前加注工作区别名或表的别名。格式为: - 或 . 注意,这里的符号“-”是“-”和“”两个(均为半角)符号复合而成。,例 (rsgl(编号、部门名、姓名、性别、出生日期、文化程度、职位、婚否),Rsda(编号、姓名、性别、工作日期、职称、简历、照片) select 1 use rsgl use rsda in 2 sele 1 List 姓名,部门名, 出生日期, b-姓名,b-工作日期 显示结果如下:,在VFP中,表之间关联有临时关系和永久关系两种关联 1. 设置表的临时关系 (1) 利用数据工作期窗口建立表的临时关系,3.7.3 数据表的关联,1,2,3,List 姓名,部门名, 出生日期, b-姓名,b-工作日期,(2) 利用命令建立表之间的临时关系 【格式】SET RELATION TO 关键字表达式|数值表达式1 INTO 工作区别名1|子表别名1 ,关键字表达式2|数值表达式2 INTO 工作区别名2|表别名2 ADDITIVE 说明: 建立临时关系以后,父表和子表记录指针的移动的规则是:父表指针每移动到一个记录,子表则按关键字表达式的值进行索引查找,并将记录指针定位在相应记录上。若子表中没有记录和父表的当前记录相关联,子表的记录指针将指向EOF;若子表中有多个记录和父表的当前记录相关联,则子表的记录指针将指向第一个相匹配的记录。 必须选择父表所在工作区为当前工作区,然后再使用本命令与非当前工作区中的数据表(子表)建立关联。,选ADDITIVE项可使父数据表与子表建立关联时,原先已存在的关联仍然保留。如果不选用该项,则建立新关联时将取消原有关联。 子表必须按关键字表达式中的关键字段建立索引,且被指定为主控索引。通常情况下,用两个表都具有的相同字段作为建立临时关系的关键字表达式。 不选任何可选项则取消已与当前表建立的关联。父表可以与多个子表建立关联。,【例】某书店有一个图书库存数据表Tskc.dbf,存放有该书店所有的图书信息,另有一个图书调价数据表tstj.dbf,其中存放着图书调价后的新价格 ,现要求编制程序,用Tstj.dbf中的单价数据更新Tskc.dbf中的单价数据。假设Tstj.dbf数据表中的记录和Tskc.dbf中的记录是一一对应的,即凡是出现在Tskc.dbf中图书都调价了,则可用如下的程序:,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)中的数据表之间的关系,它作为数据库的组成部分一直保留。它不像临时关系每次打开数据表时都要重新建立。 数据库中的数据表建立永久关系后,借助这种关系不仅仅从当前选定的表中访问数据,而且还可以访问相关数据表中的数据。 当在查询设计器,视图设计器、表单设计器中的数据环境中使用这些数据表时,这些永久关系将作为这些表之间的默认连接关系自动出现。而且以后使用查询文件,视图文件及表格文件时,这些永久关系也自动把相关数据表连接起来。,与永久关系的作用不同,临时关系是控制表之间记录指针的连动关系。永久关系不具有这个功能,而是使相关数据建立连接关系。 在永久关系中还可以建立参照完整性,对各数据表之间进行完整性约束。,表之间关系的类型 表与表之间的关系实际上就是,按照某一关键字建立的几个数据表之间相关记录的关系。 根据一个表中的记录与另一表中相关记录之间的对应数量关系,关系的类型可分为: 一对一关系:是指一个表中的一个记录与另一表中的唯一记录相关联。 一对多关系:是指一个表中的一个记录与另一表中的多个记录相关联,但另一表中的一个记录则只能与这个表中的唯一记录相对应。,在关系数据库设计时,应避免将表设计成“多对多关系”,通过数据规范化设计将“多对多关系”转换成“一对多关系”来建立数据库。也可以在两个表间建立一个连接表,两个表分别和连接表建立一对多关系,间接实现多对多关系,(1)建立表间的永久连接 建立Rsbm与Rsgl的关联、Rsgl与Rsda的关联。Rsgl与Rsda根据编号建立一对一的关联;由于在Rsbm中一个部门可以在Rsgl中找到多条记录,所以两个数据表之间的关系为一对多的关系。两个表已根据共同字段“部门名”建立了索引,“一”方(Rsbm)建立了以“部门名”为索引标识的主索引,“多”方建立了以“部门名”为索引标识的普通索引。,在数据库设计器中建立永久关系,(2) 编辑数据表之间的关联,3.8 管理数据库,3.8.1 使用多个数据库 1在项目中新建或添加数据库 2从项目中移去数据库 3打开多个数据库 4设置当前数据库,5访问其它数据库中的表 OPEN DATABASE Rsgl.dbc &打开数据库Rsgl OPEN DATABASE Example.dbc &打开Example并自动将其设为当前数据库 ?DBC() &显示当前数据库名 SELECT 4 &选择第4工作区为当前工作区 USE Rsgl!Rsda.dbf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论