Download presentation
Presentation is loading. Please wait.
1
第四章 排序、索引与数据库 教学目标: 教学重点:排序、索引。 教学难点:访问远程数据源,创建本地和远程表的视图 。
在数据库系统中,数据查询与统计是最常见的两种应用,VFP的传统查询方法有顺序和索引查询,索引查询比顺序查询效率高。数据库是一个逻辑上的概念和手段,它通过一组系统文件对相互联系的数据库表及其相关的数据库对象进行统一组织和管理,因此,在VFP 6.0中把.DBF文件称为表,而不再称为数据库或数据库文件,可以使用索引对表中数据进行排序以加快数据处理。要求学生熟练掌握数据苦的建立及数据的排序、索引。 教学重点:排序、索引。 教学难点:访问远程数据源,创建本地和远程表的视图 。
2
4.1 排序与索引 4.1.1 排 序:分类排序和索引排序。 1.概念
4.1 排序与索引 排 序:分类排序和索引排序。 1.概念 排序又称物理排序,是把表中的记录按某种顺序重新排列后,把排好次序的记录存放到一个新的表文件里,而原表中记录的次序不变。 2.SORT命令 格式:SORT TO< 新文件名> ON <字段名1>[ /A| /D][/C][,<字段名2>[ /A| /D] [/C]... ][< 范围> ][FOR <条件1>] [WHILE< 条件2>] [FIELDS <字段名表> | FIELDS LIKE <通配字段名> | FIELDS EXCEPT <通配字段名> ] 功能:对当前表文件中指定范围内所有符合条件的记录进行重新排序后形成一个新的表文件,其扩展名为.DBF。 3.说明 1)/A:升序;/D:降序,默认按升序排序。选项/C:不区分字母大小写。 2)不可选用备注型或通用型字段来排序。 3)可在ON子句中使用多个字段名实现多重排序,即先按主排序字段<字段名1>排序,对于字段值相同的记录再按第二排序字段<字段名2>排序,依此类推。 4)缺省 <范围>、FOR <条件1>、WHILE <条件2>等子句表示对所有记录排序。 5)FIELDS子句指定新表应包含的字段,默认包含原表所有字段。
3
4.1 排序与索引 例4-1 对人事表.DBF按基本工资从高到低排序,基本工资相同的按职称排序,显示基本工资最高的3人的记录。
4.1 排序与索引 例4-1 对人事表.DBF按基本工资从高到低排序,基本工资相同的按职称排序,显示基本工资最高的3人的记录。 USE 人事表 SORT TO RSB1 ON 基本工资/D,职称 USE RSB1 &&打开新表RSB1.DBF LIST NEXT 3 索 引 1.概念 索引又称逻辑排序,是按照预先规定的逻辑顺序来对表中的数据进行排序。VFP6.0中的索引保存在索引文件中,索引文件是一个只包含两列的简单表:被索引字段的值以及含有该值的每个记录在原表中的位置。也就是说索引文件是由指针构成的文件,这些指针按照索引关键字值进行排序。索引文件和表的.DBF文件分别存储,并且不改变表中记录的物理顺序。创建索引就是创建一个由指向.DBF文件记录的指针构成的文件。表的索引是记录号列表,用于确定记录的物理顺序。每个索引都有一个索引表达式来确定索引的顺序,索引表达式可以是一个字段,也可以是多个字段。
4
4.1 排序与索引 2.索引类型 (1)按功能分类 主索引(Primary Index)、候选索引(Candidate Index)、普通索引(Regular Index)和唯一索引(Unique Index)。 (2)按扩展名分类 单索引和复合索引,前者扩展名为.IDX,后者扩展名为.CDX。 1)单索引(单入口索引)。是单独的IDX索引文件,只包含一个索引关键字表达式,是一种非结构化的索引(仅仅按单一个字段索引排序,而且它只能按升序排序)。一般程序设计中的临时索引常用这种类型,必须用命令打开。 2)复合索引。包含了多个索引关键字,这些索引关键字称为索引标识,.CDX索引包含多个标识,代表着多种排序方案。复合索引文件也有两种: ① 结构复合索引:创建表或修改表结构时,可从表结构中挑选用于创建索引标记的字段,然后由VFP创建一个.CDX复合索引文件,VFP把该文件当作表的一个固有部分来处理,并在使用表时自动打开。 结构复合索引文件具有与表相同的文件名,并且当打开与它同名的表时也自动打开该.CDX复合索引文件,关闭的同时自动关闭它。当在表中进行记录的添加、修改和删除时,系统会自动对这个.CDX复合索引文件中的全部索引记录进行维护。
5
4.1 排序与索引 主索引和候选索引必须用结构复合索引文件来存储,以确保修改表时可以将索引打开,这是因为主索引和候选索引都需要唯一值,只要改变其值就必须打开。 ② 非结构复合索引文件:包含多个索引项,扩展名为.CDX。它是另行建立的,必须用命令打开。非结构复合索引文件.CDX可以看作是多个.IDX文件的组合,而实际上.IDX索引文件也是完全可以加入该文件的。 3.建立索引 格式:INDEX ON <索引关键字> TO <单索引文件名> | TAG <索引标识名>[OF <复合索引文件名> ] [FOR <条件>][COMPACT] [ASCENDING| DESCENDING] [ UNIQUE| CANDIDATE] [ADDITIVE] 功能:对当前表建立一个索引文件或增加索引标识。
6
4.1 排序与索引 说明: 1)关键字可用表达式表示。
4.1 排序与索引 说明: 1)关键字可用表达式表示。 2)TO子句适用于建立单索引文件。TAG子句用于建立复合索引文件及索引标识,或增加索引标识,索引标识由该子句的<索引标识名>指出。 3)FOR <条件>选项,则只有那些满足条件的记录才出现在索引文件中。 4)选用COMPACT,则建立一个压缩的单索引文件,复合索引文件自动采用压缩方式。 5)复合索引时,系统默认或选用ASCENDING,按索引表达式的升序建立索引。选用DESCENDING按降序建立索引。单索引文件只能按升序索引。 6)选用UNIQUE,对于索引表达式值相同的记录,只要第一记录列入索引文件(唯一索引)。 7)选用ADDITIVE,建立本索引文件时,以前打开的索引文件仍保持打开状态。 该命令默认建立普通索引型索引文件;UNIQUE表示建立唯一索引型索引文件;CANDIDATE表示索引文件是候选索引型,但需与TAG子句同时使用。
7
4.1 排序与索引 例4-2 建立单索引文件示例。 USE 人事表
4.1 排序与索引 例4-2 建立单索引文件示例。 USE 人事表 INDEX ON 姓名 TO XM && 建立按姓名升序排列的普通索引型单索引文件XM.IDX LIST && 记录已按姓名升序排列 INDEX ON 基本工资 TO JBGZ UNIQUE &&建立基本工资单索引文件JBGZ.IDX LIST &&记录已按基本工资升序排列 例4-3 为人事表. DBF建立一个结构复合索引文件,其中包括3个索引: 1)记录以基本工资降序排列,索引标识为普通索引型。 2)记录以部门升序排列,部门相同时则按基本工资升序排列,索引标识为普通索引型。 3)记录以编号降序排列,索引标识为候选索引型。 INDEX ON 基本工资 TAG JBGZ DESCENDING LIST && 记录已按基本工资降序排列 INDEX ON 部门代码+STR(基本工资,8,2) TAG BMGZ LIST INDEX ON 编号 TAG BH CANDIDATE DESCENDING LIST && 索引表达式运算后升序排列,使记录按编号降序排列
8
4.1 排序与索引 建立的索引可打开表设计器来查看:选定显示菜单的表设计器命令,然后选定“索引”选项卡。
4.1 排序与索引 建立的索引可打开表设计器来查看:选定显示菜单的表设计器命令,然后选定“索引”选项卡。 用表设计器建立或修改索引有两种办法(“显示“/”表设计器“)。(1)在“字段”选项卡“索引”列的组合框中选定向上箭头为升序索引,向下箭头为降序索引,该行字段为索引关键字。(2)使用“索引”选项卡。 “索引”选项卡中索引名列下部的空白框用来直接键入新索引;“插入”按钮用来在当前行前插入一个空行,以供键入新索引;“删除”按钮则用于删除选定的索引。 表设计器索引选项卡窗口
9
4.1 排序与索引 在索引选项卡修改索引的方法: 如:将索引名为BMGZ的表达式改为“部门代码+编号”
4.1 排序与索引 在索引选项卡修改索引的方法: 如:将索引名为BMGZ的表达式改为“部门代码+编号” 单击索引名BMGZ所在行,再单击该表达式右侧的对话按钮,在字段列表框中双击“部门代码”,在数学组合框中选定+号,在字段列表框中双击“编号”,单击“确定”按钮,表达式修改结束。用户也可在表达式列表框中或索引选项卡表达式列的文本框中直接键入表达式。 图4-3 “表达式生成器”窗口
10
4.1 排序与索引 4.使用索引 建立好索引文件后,可使记录按索引关键字排序。使用索引文件能够加快查询的速度,利用索引查询必须同时打开表与索引文件。一个表可以打开多个索引文件,同一个复合索引文件中也可能包含多个索引标识,但任何时候只有一个索引文件能起作用,在复合索引文件中也只有一个索引标识能起作用。当前起作用的索引文件称为主控索引文件,当前起作用的索引标识称为主控索引或当前索引。实现索引查询要满足的条件:打开表;打开索引文件;确定主控索引文件;对于复合索引文件还须确定主控索引。 (1)打开和关闭索引文件 若当前仅有一个索引文件被打开,它就成为主控索引文件。索引刚建立时,索引文件呈打开状态且成为主控索引文件。若当前已打开了多个索引文件,可通过SET INDEX TO命令来确定主控索引文件。 除结构复合索引能随着表的打开而打开外,其他索引文件必须用命令显式打开。可使用SET INDEX TO命令或USE命令中的INDEX子句来打开。 表关闭时索引文件就随之关闭。
11
4.1 排序与索引 命令格式:SET INDEX TO[< 索引文件表 >][ADDITIVE]
4.1 排序与索引 命令格式:SET INDEX TO[< 索引文件表 >][ADDITIVE] 功能:打开当前表的一个或多个索引文件并确定主控索引文件。 说明: 1)<索引文件表> 中第一个索引文件为主控索引文件。该命令常用于打开单索引文件。 例如: USE 人事表 SET INDEX TO JBGZ,XM && 打开JBGZ.IDX和XM.IDX,前者为主控索引文件 LIST && 记录按基本工资升序排列 2)SET INDEX TO(缺省所有选项):将关闭当前工作区中除结构复合索引文件外的所有索引文件,同时取消主控索引。 3)缺省ADDITIVE,则在打开索引文件时,除结构复合索引文件以外的索引文件均被关闭。 4)命令“USE<文件名>INDEX< 索引文件表 >”也可在打开表的同时打开索引文件,并确定 <索引文件表> 中的第一个索引文件为主控索引文件。
12
4.1 排序与索引 (2)确定主控索引 复合索引文件中当前建立的索引标识自动成为主控索引。
4.1 排序与索引 (2)确定主控索引 复合索引文件中当前建立的索引标识自动成为主控索引。 注意:表重新打开时尽管结构复合索引文件已自动打开,还须确定主控索引。 命令格式:SET ORDER TO[<数值表达式> | <单索引文件名> |[TAG]<索引标识>[ASCENDING| DESCENDING] 功能:改变主控索引文件或主控索引。 说明: 1)<数值表达式 >表示已打开索引的序号,该序号用来指定主控索引文件或主控索引。系统先为各单索引文件编号,故结构复合索引文件的序号比单索引文件大。 2)<单索引文件名> 指定该单索引文件为主控索引文件。 3)<索引标识> 指定该索引标识为主控索引。 4)SET ORDER TO或SET ORDER TO 0命令取消主控索引文件及主控索引,表中记录将按物理顺序输出。
13
4.1 排序与索引 例4-4 根据例4-2、例4-3建立的索引改变主控索引。 USE 人事表 INDEX XM,JBGZ
4.1 排序与索引 例4-4 根据例4-2、例4-3建立的索引改变主控索引。 USE 人事表 INDEX XM,JBGZ && 打开XM.IDX(索引序号为1,主控索引文件)和JBGZ.IDX(索引序号为2) LIST && 记录按姓名升序排列 SET ORDER TO TAG JBGZ && 指定人事表.CDX的索引标识JBGZ为主控索引,索引序号为3 LIST && 记录按基本工资升序排列 SET ORDER TO && 取消主控索引文件及主控索引 LIST && 记录按物理顺序显示 SET ORDER TO 2 DESCENDING && 指定人事表.CDX的索引标识JBGZ为主控索引 LIST && 记录按基本工资降序排列 SET INDEX TO && 关闭所有.IDX文件,取消主控索引 LIST && 虽然人事表.CDX未关闭,但未确定主控索引,记录按物理顺序显示
14
4.1 排序与索引 (3)删除索引(可在表设计器中使用索引选项卡选择并删除)
4.1 排序与索引 (3)删除索引(可在表设计器中使用索引选项卡选择并删除) 命令格式: DELETE TAG < 索引标识1> [,<索引标识2>]…丨ALL 功能:删除打开的结构复合索引文件的索引标识。 说明:<索引标识n>指出了要删除的索引名,ALL子句用于删除结构复合索引文件的所有索引标识。如果要删除全部索引可以使用命令DELETE TAG ALL,若某索引文件的所有索引标识都被删除,则该索引文件也已删除。 例4-5 删除例4-3建立的结构复合索引文件中的索引标识BMGZ。 USE 人事表 DELETE TAG BMGZ 5.更新索引 (1)自动更新 当表中的数据发生变化时,所有当时已打开的索引文件都会随数据的改变自动改变记录的逻辑顺序,实现索引文件的自动更新。 如:USE 人事表 SET ORDER TO TAG JBGZ && 指定索引标识JBGX为主控索引 BROWSE && 记录按价格降序排列 若在BROWSE窗口中将第6条记录的基本工资 修改为 ,关闭它后再用BROWSE命令打开,便可看到该记录已被调整为第1条记录。
15
4.1 排序与索引 (2)重新索引 若未确定主控索引文件或主控索引,修改表的记录时索引文件就不会自动更新。如果仍要维持记录的逻辑顺序,可用REINDEX命令重建索引。 命令格式为:REINDEX [COMPACT]; 也可用INDEX ON命令再次建立索引。 顺序查询命令 从指定范围的第一个记录开始按记录的顺序依次查询符合条件的记录。顺序查询命令包括LOCATE和继续查询命令CONTINUE。 1.顺序查询命令 命令格式:LOCATE FOR <条件> [ <范围>] [WHILE< 条件>] 功能:搜索满足 <条件> 的第一个记录。若找到,记录指针就指向该记录;若表中无此记录,搜索后状态条中将显示“已到定位范围末尾”,表示记录指针指向文件结束处。 说明: 1)缺省<范围>表示ALL。 2)查到记录后,要继续往下查找满足<条件>的记录必须用CONTINUE命令。
16
4.1 排序与索引 2.继续查询命令 命令格式:CONTINUE
4.1 排序与索引 2.继续查询命令 命令格式:CONTINUE 功能:在LOCATE中指定的范围内,由当前记录的下一条记录开始,依次查询符合LOCATE命令指定条件的记录。查找成功FOUND()为.T.;否则FOUND()为.F.,VFP6.0在主屏幕的状态中显示“已到文件范围末尾”,当前记录定位到记录范围的最后一条记录上。 例4-6 在人事表. DBF中查询基本工资少于1000元的教师。 USE 人事表 LOCATE FOR 基本工资<1000 DISPLAY CONTINUE ?RECNO(),姓名,基本工资 ?EOF(),RECNO() && 提示“已到文件范围末尾”,显示:
17
4.1 排序与索引 索引查询命令 在建立并打开索引的基础上进行查询,依赖二分法算法来实现,对有n条记录的数据表进行查询,比较次数最多为Log2n,如在210(1024)个记录中寻找一个满足给定条件的记录,不超过10次比较就能进行完毕;而顺序查询最多需比较1024次。顺序查询速度较慢,适用于记录数较少的表。索引查询速度很快,但其算法要求表的记录是有序的,需要事先对表进行索引或排序。 命令格式:SEEK <表达式> [ORDER<索引序号>丨[TAG]<索引名>][ASCENDING丨DESCENDING][IN<区号丨别名>] 功能:在已确定主控索引的表中按索引关键字搜索满足<表达式>值的第一个记录。 说明: 1)若能找到,就将指针定位在该记录上,否则,在主屏幕的状态条中显示“没有找到”。 2)SEEK命令可检索各种类型的关键字段值,可直接使用变量;<表达式>是字符串时,必须使用定界符定界,此时,系统默认为字符串与关键字段值的匹配为非精确相等。
18
4.1 排序与索引 3)关键字段值与<字符串>相匹配的含义是:<字符串>可以是关键字段值的全部数据,也可以是从左边开始的任意连续的部分数据。关键字段与数值相匹配的含义是:<数值常数>必须等于关键字段的值,若小数部分为0,可以忽略小数点和小数位。 4)<索引序号>丨[TAG]<索引名>指定按哪个索引定位。 5)ASCENDING丨DESCENDING指定按升序或降序定位。当表中的记录非常多时,根据索引关键字的值决定从前面开始找或从后面开始找,可以提高查找的速度。 6)在使用LOCATE,CONTINUE,SEEK, FIND查询数据时,若查到,FOUND函数就返回.T.,否则返回.F.。 7)对于字符表达式,系统允许模糊查询,即只要字符表达式值与索引关键字值左子串相同, 就认为找到。命令“SET EXACT ON| OFF”用于设置匹配环境,ON表示完全匹配,用于精确查询;OFF表示模糊匹配,系统默认OFF。运算符= =和=有类似的功能,前者表示完全匹配,后者表示模糊匹配。
19
4.1 排序与索引 例4-7 假设当前正在使用人事表,将记录定位在编号000006的记录上。 SEEK "000006" ORDER 编号
4.1 排序与索引 例4-7 假设当前正在使用人事表,将记录定位在编号000006的记录上。 SEEK "000006" ORDER 编号 例4-8 SEEK命令用法示例。 USE 人事表 INDEX ON编号TAG BH SEEK "000004" && 不可写为:SEEK编号="000004" ?RECNO() INDEX ON工作日期TAG GZRQ SEEK {^ } ?FOUND() INDEX ON 基本工资TAG JBGZ SEEK ?RECNO(),FOUND()
20
4.2 多表操作 1.工作区 2.数据工作期 4.2.2 多工作区的操作 1.选择工作区命令 格式:SELECT<工作区号 | 别名>
4.2 多表操作 工作区及工作期的概念 1.工作区 工作区用来保存表及其相关信息的一片内存空间,是标识一个表的编号的区域。打开表实际上就是将它从磁盘调入到内存的某一个工作区。每个工作区中只能同时打开一个表,但可以同时打开与表相关的其他文件,如果在同一工作区中再打开其他表则,原来在该工作区的表自动关闭。如果要同时使用多个表,就要使用多个工作区。在VFP6.0中最多可以有32767个工作区,每个工作区都有一个工作区号,分别用1~32767表示,其中1~10号也可以用A~J(别名)这10个字母表示(单个字母A~J不能用来作为表的文件名)。 2.数据工作期 数据工作期是当前动态工作环境的一种表示,每个数据工作期包含有自己的一组工作区,这些工作区含有打开的表、表索引和关系。 多工作区的操作 1.选择工作区命令 格式:SELECT<工作区号 | 别名> 功能:选择需要使用的工作区。
21
4.2 多表操作 说明: 1)选中的工作区为当前工作区。默认1号工作区为当前工作区。函数SELECT()可以返回当前工作区的区号。 例如:
4.2 多表操作 说明: 1)选中的工作区为当前工作区。默认1号工作区为当前工作区。函数SELECT()可以返回当前工作区的区号。 例如: CLOSE ALL && 关闭在所有工作区中打开了的表 ?SELECT() && 显示1 2)别名可以是工作区别名,也可以是表的别名,是代表表文件的一个简短的文件名。定义别名的格式为:USE<表文件名>ALIAS<表文件别名>。 SELECT A && 选择1号工作区 USE 人事表ALIAS RSB && 在1号工作区中打开人事表.dbf并定义别名为RSB SELECT 2 && 选择2号工作区 USE 工资表 ALIAS GZB && 在2号工作区中打开工资表.dbf并定义别名为GZB SELECT RSB && 选择1号工作区 SELECT B && 选择2号工作区
22
4.2 多表操作 3)当前工作区的表文件的字段名可以被直接引用,如果使用其他工作区的字段名,需要使用别名,格式为:别名.字段名,或者:别名->字段名。 4)SELECT 0表示选择未被使用的最小工作区。 例如: CLOSE ALL SELECT 1 && 选择1号工作区 USE 人事表.DBF SELECT 0 && 选择2号工作区 USE 工资表.DBF SELECT 0 && 选择3号工作区 2.关闭工作区和表命令 命令1 CLOSE DATABASE 功能:关闭当前打开的数据库和所有打开的表文件,并使1号工作区成为当前工作区。 命令2 CLOSE TABLES 功能:关闭当前打开的数据库中的所有表,不关闭数据库,不改变当前工作区。
23
4.2 多表操作 命令3 CLOSE ALL 功能:关闭所有工作区中打开的表和单索引文件,并且选择1号工作区为当前工作区。关闭表单设计器、报表设计器、项目管理器。 命令4 CLEAR ALL 功能:关闭所有的表,并选择1号工作区;从内存释放所有内存变量及用户定义的菜单和窗口。 数据表的连接 表之间的连接是将两个表的文件连接生成一个新的表文件,新表中的字段是从两个原表中选取出来的。 命令格式:JOIN WITH<工作区号>|<别名>TO<新表文件名>[FIELDS<字段名表>]; FOR<连接条件> 功能:按<连接条件>将当前工作区的表与<工作区号>|<别名>指定工作区的表进行连接,生成一个新的表文件。
24
4.2 多表操作 说明:1)<工作区号>|<别名>指明被连接的表。
4.2 多表操作 说明:1)<工作区号>|<别名>指明被连接的表。 2)FIELDS<字段名表>指定新表包含的字段,如无此选项,则新表文件的字段是原来两个表的所有字段,字段名相同的只保留一项。 3)连接过程是:从当前表的第一条记录开始,逐条与被连接的表的全部记录比较,连接条件为真时,就把这两条记录连接起来,作为一条记录存放到新表文件中,否则,进行下一条记录的比较。重复上述过程,直到所有记录比较完毕为止。 例4-10 CLOSE ALL SELECT 1 USE 工资表 LIST GO TOP SELECT 2 USE 人事表 JOIN WITH 工资表 TO RSGZB FIELDS 编号,姓名,A.奖励,A.岗位津贴 FOR 编号=a.编号 USE RSGZB
25
4.2 多表操作 数据表的关联 通常将主关联表文件称为父表,被关联表文件称为子表。根据父表和子表记录对应关系的不同,关联可分为一对一和一对多关联。 ·一对一关联:父表中的记录在子表中只有一条记录与之对应。 ·一对多关联:父表中的记录在子表中有多条记录与之对应。 建立数据表文件中的表间关联,一要保证建立关联的表具有相同的字段;二是父表和子表都要以该字段建立索引。 在两个数据表之间可创建两种关联类型:一种是在查询和视图设计的过程中默认连接的永久性关联(参阅4.3.3);另一种是使父表和子表动态连接的临时性关联。表间的永久性关联并不能使子表的记录指针随父表的记录指针移动。在实际应用中都通过建立表间临时关联关系来达到这一目的。在建立了表间的临时关系后,父表就可以控制子表,当在父表中移动记录指针时,子表中的记录指针也会作相应的移动。这种关系是仅在数据表间建立一种逻辑关系,即建立记录指针之间的联系,而不产生一个新的表文件。
26
4.2 多表操作 1.使用SET RELATION TO命令建立
4.2 多表操作 1.使用SET RELATION TO命令建立 命令格式:SET RELATION TO[<关键字表达式>|<数值型表达式> INTO<工作区号>丨<别名>] [,<关键字表达式> INTO<工作区号>丨<别名>]…[ADDITIVE] 功能:该命令根据<关键字表达式>的值关联当前区和<工作区号>丨<别名>区的若干个表文件。即在父表和子表之间建立关联。 说明: 1)<关键字表达式>用来指定父表的字段表达式。<别名>是子表的工作区别名或子表别名。<关键字表达式>用来指定关联条件,且<别名>表文件已按<关键字表达式>建立了索引,并且该索引是主控索引。 2)<数值型表达式>可以是记录号函数RECNO()。此时,两个或多个关联表之间的联系是根据记录号来进行关联的,父表与子表之间当前记录号保持相等。如果父表记录的记录号大于子表的记录总数,则子表的当前记录指针指向最后一条记录的下一条记录,EOF()函数值为.T.。
27
4.2 多表操作 例4-11 将人事表与工资表按记录号进行关联。 SELECT 2 USE 工资表 && 子表 LIST Go TOP
4.2 多表操作 例4-11 将人事表与工资表按记录号进行关联。 SELECT 2 USE 工资表 && 子表 LIST Go TOP SELECT 1 USE 人事表 && 父表 SET RELATION TO RECNO() INTO 工资表 GO 3 && 随着人事表的指针指向3号记录,指针也指向3号记录 DISP 姓名,基本工资,职称 && 父表 SELECT 2 && 子表 DISP 岗位津贴, 奖励 3)ADDITIVE表示建立关联时仍然保留该工作区和其他工作区已经建立的关联,如果要建立多个关联,则使用该选项。
28
4.2 多表操作 4)当两表建立关联后,如果是一对多关系,则子表具有多个关键字相同的记录,指针只指向关键字相同的第一条记录。需要找其他记录,可以使用SET SKIP TO命令。命令格式:SET SKIP TO[<表别名1>[,<表别名2>]...]。 5)如果子表中没有找到匹配的记录,指针指向文件末尾。 6)使用SET RELATION TO命令建立关联之后,当移动父表的记录指针时,子表的记录指针也随之移动,并且将引起读/写磁盘操作,这样会降低系统的性能。因此,当某些关联不再使用或暂时不用时,应及时删除关联,以提高系统的运行速度。 例4-12 列出人事表中所有人员的姓名、编号、奖励,试写出命令序列。 此题涉及人事表.dbf和工资表.dbf两个表的关联,可以以人事表.dbf为父表,建立一对多关系。 SELECT 1 USE 人事表 INDEX ON 编号TAG BH && 以“编号”字段建立普通索引 SELECT 2 USE 工资表 && 子表 SET RELATION TO 编号INTO 人事表 BROW FIELDS 姓名, 编号,工资表.奖励
29
4.2 多表操作 2.通过“数据工作期”对话框创建:菜单“窗口“→“数据工作期”
4.2 多表操作 2.通过“数据工作期”对话框创建:菜单“窗口“→“数据工作期” 1)在“数据工作期”窗口中单击“打开”按钮,分别打开人事表和工资表。 2)选择“别名” 中的人事表,单击“关系” ,“关系”列表框中出现人事表,小折线出现。 3)选择“别名” 中的工资表,选择其中的“工资表.BH”, “确定” 后出现图4-5所示。 4)双击字段列表框下的“编号”字段,单击“确定”按钮。 5)在“数据工作期”对话框中单击“一对多”。在出现的“创建一对多关联”窗口中选中子 表别名工资表,单击“移动”按钮后再单击“确定”按钮。 这样,用户已为上述两表设置了临时性关系,如图4-6所示。在右边的“关系”列表框 中可以看到上面一行父表,下面一行子表,中间的折线表示两表之间的关系。 图4-5 “表达式生成器”对话框 图4-6 创建临时关联 注意:临时关联当相关联的表文件关闭后自动消失。
30
4.3 数据库的建立与操作 (1)莱单操作方式 4.3.1 数据库的建立与删除(数据库的扩展名为.DBC)
4.3 数据库的建立与操作 数据库的建立与删除(数据库的扩展名为.DBC) 1.数据库的建立:可采用菜单、命令和项目管理器三种操作方式。 (1)莱单操作方式 选择“文件”菜单→“新建” →选择“数据库”单选按钮→单击“新建文件”按钮→在“创建”对话框中输入数据库文件名和保存位置→选择“保存”按钮,打开“数据库设计器”。 在数据库设计器上有一个浮动的数据库设计器工具栏,可以利用数据库设计器工具栏快速访问与数据库相关的选项。单击数据库设计器的“关闭”按钮,就建立了一个空的数据库,它还没有数据,也不能输入数据,还需要建立数据库表和其他数据库对象才能实施操作。 在建立数据库时,除扩展名是.dbc的数据库文件之外,还会自动建立文件名相同但扩展名是.dct的数据库备注(Memo)文件和扩展名是.dcx的数据库索引文件。用户一般不能直接使用这些文件。 (2)项目管理器方式 在项目管理器中先选择数据库→单击“新建”按钮→输入数据库的名称(扩展名为.dbc的文件)→单击“保存”,打开“数据库设计器”。
31
4.3 数据库的建立与操作 (3)命令操作方式 格式:CREATE DATABASES [<数据库文件名> | ?]
4.3 数据库的建立与操作 (3)命令操作方式 格式:CREATE DATABASES [<数据库文件名> | ?] 功能:新建一个数据库并打开它。 说明: 1)保存后该数据库文件被建立,并且自动以独占方式打开该数据库。 2)使用该命令建立数据库后并不打开数据库设计器,只是数据库处于打开状态。接着执行MODIFY DATABASE 命令,“数据库设计器”即被打开。 2.数据库的删除 格式:DELETE DATABASE [ <数据库文件名|?>][DELETE TABLES][RECYCLE] 功能:删除数据库。 说明:1)要删除的数据库要处于关闭状态,被删除的数据库中的表成为自由表。 2)VFP的数据库文件并不真正含有数据库表或其他数据库对象,只是在数据库文件中登录了相关的条目信息,数据库表或其他数据库对象独立存放在磁盘上,删除数据库不会影响表和其他数据库对象的存在。当选择了DELETE TABLES删除数据时,连表对象一起全部删除。 3)选择RECYCLE选项则将删除的文件放入回收站,需要时可以恢复。
32
4.3 数据库的建立与操作 4.3.2 数据库的操作 1.打开数据库 (建好的数据库,在使用之前必须先打开它。) (1)通过菜单打开
4.3 数据库的建立与操作 数据库的操作 1.打开数据库 (建好的数据库,在使用之前必须先打开它。) (1)通过菜单打开 选择“文件”菜单→“打开”命令,数据库打开后,即处于编辑状态。 (2)通过命令打开 格式:OPEN DATABASE[<数据库文件名>|?] [EXCLUSIVE丨SHARED] [NOUPDATE][VALIDATE] 功能:打开数据库。 说明:1)各选择项作用如下: EXCLUSIVE:独占方式打开。 SHARED:以共享方式打开。 NOUPDATE:只读方式打开,不允许修改。 VALIDATE:检查数据库是否合法 2)数据库打开后,包含在数据库中的表不会自动打开,使用时用USE命令打开。 3)可同时打开多个数据库,但只能有一个当前数据库。选择当前数据库的命令:SET DATABASE TO [打开的数据库文件名],省略选择项将使所有打开的数据库都不是当前数据库。 2.关闭数据库 格式:CLOSE DATABASE 功能:关闭当前打开的数据库。
33
4.3 数据库的建立与操作 3.编辑数据库 格式:MODIFY DATABASE [<数据库文件名> |?] [NOWAIT] [NOEDIT] 功能:打开当前数据库的“数据库设计器”,以便修改数据库。 说明: 1)NOWAIT:在打开数据库后程序继续往下运行,该子句在程序方式下有效。 2)NOEDIT:不允许修改。 3)修改数据库是指在“数据库设计器”中直接修改表的内容和表结构。在“数据库设计器”中,鼠标右键单击要修改的表→选择“浏览”(进入表的浏览窗口)或选择“修改”(打开相应的表设计器);双击要修改的表也能打开表的浏览窗口。 4.在“数据库设计器”中新建表结构 数据库在含有表之前没有实际用途,需要在“数据库设计器”中建立表或将自由表添加到数据库中。 在数据库中,直接建立表最简单和最直接的方法就是使用“数据库设计器”。 选择“数据库”菜单→“新建表”命令;空白处单击右键→选择“新建表”命令;单击“数据库设计器”工具栏上的“新建表”按钮→选择“新建表”,在“创建”对话框中输入表名、选择保存表的位置→单击“保存”按钮,此时便出现数据库表的表设计器对话框。
34
4.3 数据库的建立与操作 数据库表的表设计器对话框与自由表的表设计器对话框有所不同。
4.3 数据库的建立与操作 数据库表的表设计器对话框与自由表的表设计器对话框有所不同。 数据库表的表设计器对话框的下部,有显示、字段有效性、匹配字段类型到类和字段注释4个输入区域,这是自由表的表设计器所没有的。这是因为数据库表具有一些自由表所没有的属性,包括: 1)数据库表可以使用长表名和长字段名。 2)可以为数据库表中的字段指定标题和添加注释。 3)可以为数据库表的字段指定默认值和输入掩码。 4)数据库表的字段有默认的控件类。 5)可以为数据库表规定字段级规则和记录级规则。 6)数据库表支持参照完整性的主关键字索引和表间关系。 7)支持INSERT、UPDATE和DELETE事件的触发器等。 4-11 数据库表的表设计器对话框
35
4.3 数据库的建立与操作 5.将自由表添加到数据库
4.3 数据库的建立与操作 5.将自由表添加到数据库 在VFP中每个表可以有两种存在状态:自由表(即没有和任何数据库关联的.DBF文件)或数据库表(即与数据库关联的.DBF文件)。数据库表和自由表可互相转换,将一个自由表加入到某一个数据库时,自由表便成为数据库表;反之,将数据库表从数据库中移出便成了自由表。数据库表只能属于一个数据库,如果想将一个数据库中的表移到其他数据库,必须先将该数据库表变成自由表,然后再将其添加到另一数据库中。 (1)从“数据库设计器”中添加表 1)在数据库设计器中单击工具栏的“添加表”按钮→选择要添加表的表名→“确定 2)“数据库”菜单→“添加表”命令 3)空白处单击鼠标右键→选择“添加表”命令。 (2)使用命令添加表 格式:ADD TABLE <自由表文件名> | ?[NAME<长表名>] 功能:将自由表添加到当前数据库中。 说明:一个表只能属于一个数据库。用NAME选项给数据添加自由表并指定一个长名。
36
4.3 数据库的建立与操作 6.从数据库中移去或删除表 (1)从“数据库设计器”中移去 1)选择表→选择“数据库”菜单→“移去”
4.3 数据库的建立与操作 6.从数据库中移去或删除表 (1)从“数据库设计器”中移去 1)选择表→选择“数据库”菜单→“移去” 2)右击表→“删除” 3)单击数据库设计器工具栏的“删除表” →“移去” (2)使用命令移去 格式:REMOVE TABLE< 数据库表文件名> | ?[DELETE] [RECYCLE] 功能:从数据库中移去表。可以将数据库表转换为自由表或删除。 说明:使用DELETE选项,移出并删除。使用RECYCLE选项,移去并放到回收站。 例4-13 将“工资表”从“人事库”中移去。 OPEN DATABASE 人事库 REMOVE TABLE 工资表 7.关闭文件命令 格式:CLOSE [ALL | DATABASES [ALL] | INDEXES | PROCEDURE | TABLES [ALL]] 功能:关闭各种类型的文件。
37
4.3 数据库的建立与操作 8.显示数据库的有关信息和环境命令
4.3 数据库的建立与操作 8.显示数据库的有关信息和环境命令 格式:DISPLAY DATABASE [TO PRINT | TO FILE <文件名>] 功能:显示当前数据库的有关信息和环境。 9.显示数据库中的表命令 格式:DISPLAY TABLES [TO PRINT | TO FILE <文件名>] 功能:显示数据库中的表信息。 10.彻底删除记录命令 格式:PACK DATABASE 功能:彻底删除当前数据库中已作删除标记的记录。 11.重命名数据库中的表 格式:RENAME TABLE<表文件名1>TO<表文件名2> 功能:将当前数据库中的表重命名为表文件名2。
38
4.3 数据库的建立与操作 数据字典 用于保存对数据库中各种数据的定义或设置信息,包括表的属性、字段属性、记录规则、表间关系,以及参照完整性(Referential Integrity,RI)等。这些属性或信息均可通过数据库设计器来设置、显示或修改,并且由系统保存在数据字典中,直到相关的表从数据库中移去为止。 当设计自由表时,表设计器也用来设置字段、索引和表的各种属性。 1.长名(表名/字段名)与注释 VFP允许在数据字典中为表/字段设置不超过128个字符的长名,以及对表/字段增加适当的注释。长表名/长字段名一般能在浏览窗口或各种设计器(例如数据库设计器、查询设计器和即将介绍的视图设计器)的标题栏内显示;而注释则通常出现在项目管理器中。注意,数据库表仅在创建时可采用长表名。
39
4.3 数据库的建立与操作 2.设置字段属性 首先在文件菜单下选择打开人事库.DBC(添加“人事表.dbf”,双击表打开表),在“显示”菜单下打开“表设计器” 。 (1)格式 格式是字段的输出掩码,它决定了字段的显示风格。下面是常用的格式码: A:只允许输出文字字符(禁止输出数字、空格和标点符号)。 D:使用当前系统设置的日期格式。 L:在数值前显示填充的前导零,而不是用空格字符。 T:禁止输入字段的前导空格字符和尾空格字符。 !:表示把输入的小写字母转换为大写字母。 (2)输入掩码 X:表示允许输入任何字符。 :表示允许输入数字和正负符号。 #:表示允许输入数字、空格和正负符号。 $:表示显示当前的货币符号。 *:表示在值的左侧显示星号。 :表示用点分隔符指定小数点位置。 ,:表示用逗号分隔小数点左边的整数部分,一般用来分隔千分位。 例:指定人事表中的“编号”字段的输入掩码为“ ”,则编号字段对应9的位仅允许输入数字;指定“姓名”字段的显示格式为“AT”,则在增加新记录时,姓名字段只能接受字母输入,而不能输入空格、数字等。
40
4.3 数据库的建立与操作 (3)标题 指定显示代表字段的标题。 (4)字段验证
4.3 数据库的建立与操作 (3)标题 指定显示代表字段的标题。 (4)字段验证 字段验证区包含3个文本框,各文本框均可直接键入数据,也可通过其右边的对话按钮显示出表达式生成器对话框,在其中进行设置。 3.设置记录有效性 记录有效性规则用于记录更新时对整个记录进行检验,它通常比较同一记录中的两个或多个字段值,看它们组合在一起是否有效。如果是自由表,“表”选项卡只显示表的只读资料,而对于数据库表,可以在此设置表名和表注释、记录有效性规则和信息、触发器等。 (1)记录验证 规则文本框:用于指定记录级有效性检查规则,光标离开当前记录时进行校验。 信息文本框:用于指定出错提示信息。在校验记录级有效性规则时,发现输入与规则不符时该信息将会显示出来。
41
4.3 数据库的建立与操作 (2)触发器 字段级有效性和记录有效性规则主要限制非法数据的输入,而数据输入后还要进行修改、删除等操作。若要控制对已经存在的记录所作的非法操作,则应使用数据库表的记录级触发器。触发器是在某些事件发生时触发执行的一个表达式或一个过程。这些事件包括插入记录、修改记录和删除记录。当发生了这些事件时,将引发触发器中所包含的事件代码。 插入触发器:指定一个规则,每次向表中插入或追加记录时该规则被触发,据此检查插入的记录是否满足规则。 更新触发器:指定一个规则,每次更新记录时触发该规则。 删除触发器:指定一个规则,每次向表中删除记录(打上删除标记)时触发该规则。 例如,设置“删除触发器”的表达式为“EMPTY(姓名)”,表示只有当相应记录的“姓名”字段为空时才能删除该记录,这个触发器用于保证不误删除记录。
42
4.3 数据库的建立与操作 4.主索引与永久关系 (1)主索引 打开的自由表的索引选项卡有普通索引、唯一索引、候选索引3种索引类型。
4.3 数据库的建立与操作 4.主索引与永久关系 (1)主索引 打开的自由表的索引选项卡有普通索引、唯一索引、候选索引3种索引类型。 打开的数据库表的组合框中将列出包括主索引在内的4种索引类型。 主索引的作用有两个:一是主索引不允许出现重复值,发现重复值会禁止存盘,故可用作主关键字。二是主索引可用于建立永久关系,从而建立参照完整性。 主索引的建立或删除: 格式:ALTER TABLE <表名> ADD|DROP PRIMARY KEY< 索引关键字> [TAG <索引标识名> ] 说明:命令中的ADD用于添加主索引,缺省TAG子句表示索引关键字同字段名。DROP用于删除主索引。 例:为人事表添加以编号字段为索引关键字的主索引: ALTER TABLE 人事表 ADD PRIMARY KEY编号TAG BH 删除主索引: ALTER TABLE 人事表 DROP PRIMARY KEY
43
4.3 数据库的建立与操作 (2)建立永久关系 在VFP中,可使用索引在数据库中建立表间的永久关系,是因为这样可以根据简单的索引表达式或复杂的索引表达式联系表。与永久关系相区别,以前建立的关系可称为临时关系(仅用于关联,即控制关联表的记录指针有序移动);永久关系在查询和视图中则起联接作用,能自动成为联接条件,能作为表单和报表的默认关系,并显示在数据环境设计器中,允许建立参照完整性。建立表之间的关系:在“数据库设计器”中,选择主表中想要关联的索引名,然后把它拖到相关表匹配的索引名上即可。 例4-14 为数据库中的人事表与工资表建立永久关系。 1)“文件”菜单→“打开”命令→选定数据库人事库.DBC→“确定”,返回数据库设计器。 2)选定人事表→“数据库”菜单→“修改”→在工资表的表设计器中以岗位津贴为关键字建立普通索引,在人事表的表设计器中以编号为关键字建立主索引。 3)画出连线:从人事表窗口索引部分的bh拖到工资表窗口索引部分的gwjt,其间即产生一条连线。 (在最底部) 注意:建立关系时,父表的索引一定是主索引,在“数据库设计器”中,各表的主索引标识前有一把钥匙。 在数据库的两个表间建立永久关系时,要求两个表的索引中至少有一个是主索引。必须先选择主表的主索引,而子表的索引类型决定了要创建的永久关系类型: 子表中的索引为主索引或候选索引→一对一关系; 子表中的索引类型为普通索引或唯一索引→一对多关系。
44
4.3 数据库的建立与操作 (3)编辑关系 单击关系线(关系线将变成粗黑线)→右击该关系线→选择“删除关系”或“编辑关系”命令即可删除或修改指定关系。 例如,在快捷菜单中选择“编辑关系”或双击表间的关系线,可打开 “编辑关系”对话框。对话框中各选项的功能如下: “表”:显示当前父表名称,并允许选用一个不同的索引标识。 “相关表”:显示当前子表名称,并允许选用一个不同的索引标识。 “关系类型”:显示父表与子表之间关系的类型。 “参照完整性”:显示“参照完整性生成器”,可以设置规则控制相关表中记录的插入、更新和删除。 图4-17 “编辑关系”对话框
45
4.3 数据库的建立与操作 5.参照完整性 (1)参照完整性概念 在永久关系的基础上可设置参照完整性规则,参照完整性属于表间规则。
4.3 数据库的建立与操作 5.参照完整性 (1)参照完整性概念 在永久关系的基础上可设置参照完整性规则,参照完整性属于表间规则。 参照完整性是指不允许在相关数据表中引用不存在的记录。对涉及表间数据的完整性,统称为参照完整性(RI)。 (2)设置参照完整性 打开数据库设计器,然后选用3种方法打开参照完整性生成器窗口: 1)从数据库设计器快捷菜单选择编辑参照完整性命令。 2)选择“数据库”菜单中的编辑参照完整性命令。 3)在数据库设计器中双击两个表之间的连线,并在编辑关系对话框中选定参照完整性按钮。
46
4.3 数据库的建立与操作 参照完整性设置:①选定某一规则选项卡②选定某一选项按钮③在表格中选定某行并设置两表的联接④浏览有关表的内容、检验设置的正确性。 在“参照完整性生成器”中,用户可以对更新、删除或插入父表与子表记录时所遵循的规则进行如下设置: ·更新规则 级联:当修改父表中的某一记录时,子表中相应的记录也会改变。 限制:当修改父表中的某一记录时,若子表中有相应的记录,则禁止该操作。 忽略:两表更新操作将互不影响。 ·删除规则 级联:当删除父表中的某一记录时,将删除子表中相应的记录。 限制:当删除父表中的某一记录时,若子表中有相应的记录,则禁止该操作。 忽略:两表删除操作将互不影响。 ·插入规则 限制:当在子表插入某一记录时,若父表中没有相应的记录,则禁止该操作。 忽略:两表插入操作将互不影响。
47
习 题 1.VFP 6.0的表分为哪两类?它们有什么不同? 2.索引有哪几种类型?索引文件又有哪几种类型?
习 题 1.VFP 6.0的表分为哪两类?它们有什么不同? 2.索引有哪几种类型?索引文件又有哪几种类型? 3.什么是工作区?工作区与表有什么关系?选择工作区的方法是什么? 4.显示记录时,范围有几种选择?结果有何区别? 5.触发器有哪几种?各有什么作用? 6.举例说明字段级规则、记录级规则的区别,以及如何设置它们? 7.举例说明数据库的表间关系有哪几种,它们有什么区别? 8.自由表间能否建立永久关系? 9.举例说明什么是父表,什么是子表。 10.主索引和索引的区别是什么?主标识和标识的区别是什么?
Similar presentations