480 likes | 668 Views
第 3 章 数据表的创建及操作. 3.1 数据表的创建. 3.2 数据表的维护. 3.3 数据表的排序、索引与查询. 3.4 数据表的统计与汇总. 3.5 多个数据表的使用. 退出. 3.1 数据表的创建. 3.1.1 创建数据表. 3.1.2 表数据的输入. 3.1.3 数据表文件的打开、关闭、显示和定位. 退出. 3.1.1 创建数据表. 1. 数据表结构的定义. ( 1 )文件名:表文件的主要标识 ( 2 )结构:字段名、类型、宽度 ( 3 )记录:标文件的基本数据. 2. 数据表的创建.
E N D
第3章 数据表的创建及操作 3.1 数据表的创建 3.2 数据表的维护 3.3 数据表的排序、索引与查询 3.4 数据表的统计与汇总 3.5 多个数据表的使用 退出
3.1 数据表的创建 3.1.1 创建数据表 3.1.2 表数据的输入 3.1.3 数据表文件的打开、关闭、显示和定位 退出
3.1.1 创建数据表 1.数据表结构的定义 (1)文件名:表文件的主要标识 (2)结构:字段名、类型、宽度 (3)记录:标文件的基本数据 2.数据表的创建 (1)命令方式:CREATE [<文件名>/?] (2)表向导 (3)表设计器
3.1.1 创建数据表 3.字段类型及命名 (1)字段名:必须以字母或汉字开头,可以包括字母、汉字、数字和下划线,不要超过10个字符。 示例:姓名、XB、班级BJ、班级2、班级_2 _XM、2班、“成绩”、班级:姓名 (2)字段类型:共13种。 (3)字段宽度:不同类型的字段具有不同的宽度。 (4)小数位:数值型数据需要规定小数位数。 (5)使用NULL值:可以指定字段是否接受NULL值,它是一个不存在的值。
3.1.2 表数据的输入 1.创建数据表时输入数据 备注型字段与通用型字段内容的输入:双击鼠标左键,进入相应的编辑窗口进行输入。 2.使用浏览窗口追加数据 命令格式:BROWSE 3.添加记录 命令格式:APPEND [BLANK] 4.插入记录 命令格式:INSERT [BEFORE] [BLANK]
3.1.3 数据表文件的打开、关闭、显示和定位 1.数据表文件的打开与关闭 命令格式:USE [<数据表文件名>] 示例:USE 学生表.DBF USE 2.数据表文件的显示 (1)结构的显示 格式:LIST STRUCTURE 或 DISPLAY STRUCTURE 示例:USE 学生表 LIST STRU
(2)记录的显示 格式:LIST/DISPLAY [OFF] [<范围>] [[FIELDS] <表达式表>] [WHILE <条件>] [FOR <条件>] 说明:<范围>的可选值包括: RECORD n:第n条记录。 NEXT n:从当前记录开始以下的N条记录。 REST:从当前记录开始到文件末尾的所有记录。 ALL:全部记录。 示例:USE 学生表 LIST OFF FOR 班级=“注会” LIST FIELDS 学号,姓名,班级 DISP ALL
3.记录指针的定位 记录指针:用来指示表文件中记录位置的指针。 当前记录:指针当前所指向的记录。 (1)指针的绝对移动命令 格式:GO/GOTO [RECORD] <记录号> GO/GOTO TOP/BOTTOM 示例:USE 学生表 GO 3 DISP GOTO RECN 5 DISP GO TOP DISP
(2)指针的相对移动命令 格式:SKIP [+/-] [<算术表达式>] 示例:USE 学生表 DISP SKIP DISP SKIP 3 DISP SKIP -2 DISP SKIP 6 DISP
3.2 数据表的维护 3.2.1 数据表结构的修改 3.2.2 显示和编辑数据表中的数据 3.2.3 删除数据表中的记录 3.2.4 文件的显示、复制、删除与更名 3.2.5 数组与数据表之间的数据交换 退出
3.2.1 数据表结构的修改 格式:MODIFY STRUCTURE 示例:USE 学生表 MODI STRU 3.2.2 显示和编辑数据表中的数据 1. 浏览修改命令BROWSE 格式:BROWSE [FIELDS <字段名表>] [LOCK <数值表达式>] [FREEZE <字段名>] [NOAPPEND] [NOMODIFY] [WIDTH <数值表达式>] [FOR <逻辑表达式>] [LEDIT] [REDIT]
1. 浏览修改命令BROWSE 示例:USE 学生表 BROWSE FIELDS 学号,姓名,性别,班级 BROWSE FREEZE 班级 BROWSE PARTITION 12 LEDIT BROWSE WIDTH 4 BROWSE NOAPPEND BROWSE NOMENU BROWSE LOCK 2 BROWSE FOR 班级=“注会” BROWSE NOMODIFY
2. CHANGE/EDIT命令 格式:CHANGE/EDIT [<范围>] [FIELDS <字段名表>] [WHILE <逻辑表达式>] [FOR <逻辑表达式>] 示例: USE 学生表.DBF CHANGE FIELDS 姓名,班级,家庭住址,电话 3. REPLACE命令 格式:REPLACE [<范围>] <字段1> WITH <表达式1> [ADDITIVE] [,<字段2> WITH <表达式2> [ADDITIVE] …] [FOR <条件>] [WHILE <条件>] 示例:USE 学生表.DBF GO 6 DISP REPLACE 姓名 WITH "李 青",性别 WITH "男" DISP
4. 修改通用型字段 格式:MODIFY GENERAL <通用型字段名表> [NOMODIFY] [NOWAIT] [IN SCREEN] 3.2.3 删除数据表中的记录 1. 逻辑删除数据表中的数据 格式:DELETE [<范围>] [WHILE<条件>] [FOR<条件>] 说明:SET DELETED ON/OFF 示例:USE 学生表.DBF GO 6 DELETE LIST SET DELETE ON LIST
2.恢复数据表中逻辑删除的数据 格式:RECALL [<范围>] [FOR <条件>] [WHILE <条件>] 示例:USE 学生表.DBF GO 6 DELETE DISP GO 6 RECALL DISP 3. 物理删除数据表中的数据 格式:PACK
4. 删除数据表中的所有记录 格式:ZAP 说明:SET SAFETY ON/OFF 3.2.4文件的显示、复制、删除与更名 1.文件目录的显示命令 格式:DIR/DIRECTORY [<盘符>] [<路径>] [<文件名描述>] 或 DISPLAY FILES [<盘符>] [<路径>] [<文件名描述>] 或 LIST FILES [<盘符>] [<路径>] [<文件名描述>] 示例:DIR DIR *.PRG DIR C:\*.*
2. 显示文件内容的命令 格式:TYPE <文件名> 3.文件的复制 (1)任意类型文件的复制 格式:COPY FILE <源文件名> TO <目标文件名> 示例:COPY FILE 学生表.DBF TO 学生表1.DBF COPY FILE 学生表.FPT TO 学生表1.FPT (2)数据表文件的复制 格式:COPY TO <新表文件名> [<范围>] [FIELDS <字段名表>] [FOR <逻辑表达式>] [WHILE <逻辑表达式>] 示例:USE 学生表.DBF COPY TO 学生表2 FOR 班级=“金融二”
(3)数据表结构的复制 格式:COPY STRUCTURE TO <文件名> [FIELDS <字段名表>] 示例:USE 学生表.DBF COPY STRUCTURE TO 学生表3 FIELDS 班级,姓名,家庭住址,电话 USE 学生表3 LIST STRUCTURE 4.文件的更名 格式:RENAME <源文件名> TO <新文件名> 示例:RENAME E:\VFP\例题\学生表.DBF TO 学生名单.DBF RENAME E:\VFP\例题\学生表.DBF TO 学生名单.FPT
5.文件的删除 格式:ERASE <文件名>/? 或 DELETE FILE [<文件名>/?] 示例:ERASE 学生表3.DBF DELETE FILE 学生名单.DBF 6.从另外的数据表中向当前表文件添加记录 格式:APPEND FROM <文件名> [FIELDS <字段名表>] [WHILE <条件>] [FOR <条件>] 示例:USE 学生表 COPY STRU TO 学生表3 USE 学生表3 APPEND FROM 学生表
3.3 数据表的排序、索引与查询 3.3.1 数据表的排序 3.3.2 数据表的索引 3.3.3 数据表的查询 退出
3.3.1 数据表的排序 1. 概念 (1)数据表的排序:把数据表文件中的记录按照某个字段值的大小顺序重新排列。 (2)关键字:作为排序依据的字段。 (3)升序:按照关键字值从小到大的顺序进行排序。 (4)降序:按照关键字值由大到小的顺序进行排序。 (5)数据大小的比较规则: 如果是数值型、日期型的数据进行比较,则由其本身的大小决定;字符型数据由其ASCII码值确定,汉字由机内码确定大小。
2.命令格式 格式:SORT TO <文件名> ON <字段名1> [/A][/D][/C][,<字段名2> [/A][/D][/C]…][ASCENDING/DESCENDING][<范围>] [FOR <条件>] [WHILE <条件>] [FIELDS <字段名表>] 示例:USE 学生表 SORT TO STUDENT1 ON 班级,姓名/D USE STUDENT1 LIST USE 学生表 SORT TO 学生表_金融 ON 学号 FOR 班级=“金融二” USE 学生表_金融 LIST
3.3.2 数据表的索引 为什么使用索引? 1)排序造成了数据冗余,浪费存储空间 2)如果对数据表文件进行增、删、改操作时,需要重新进行排序 什么是索引文件? 1)索引文件是由指针构成的,这些指针逻辑上按照索引关键字进行排序。 2)索引文件和表文件分别进行存储,并不改变表中记录的物理位置。
3.3.2 数据表的索引 1.索引文件的类型 (1)独立索引文件:扩展名为.IDX,其各个索引文件只能包含一个单一的关键字或者组合关键字。 独立索引文件可分为:压缩索引文件和非压缩索引文件。 (2)复合索引文件:扩展名为.CDX,在一个复合索引文件中可以包含多个索引选项,每个索引选项叫做索引标识(Index Tag)。 复合索引文件有两种类型:结构复合索引文件(Structural Compound Index)和独立复合索引文件(Independent Compound Index)。
2.索引文件的建立 格式1(建立.IDX索引文件): INDEX ON <关键字表达式> TO <独立索引文件名> [FOR <条件>][UNIQUE] [COMPACT] [ADDITIVE] 示例:USE 学生表 INDEX ON 班级 TO 学生表_班级 LIST INDEX ON 班级+姓名 TO 学生表_班级_姓名 LIST INDEX ON 姓名 TO 学生表_姓名 FOR 班级=“注会” LIST
2.索引文件的建立 格式2(建立.CDX索引文件) INDEX ON <关键字表达式> TAG <标记名> [OF <复合索引文件名>][UNIQUE/CANDIDATE] [ASCENDING/DESCENDING] [ADDITIVE] [FOR <条件>] 示例:USE 学生表 INDEX ON 姓名 TAG 姓名 LIST USE 学生表 INDEX ON 班级+性别 TAG 班级_性别 OF 学生表_班级性别 LIST INDEX ON 班级TAG 班级 OF 学生表_班级性别 LIST
3.索引文件的打开与关闭 (1)有关概念 主控索引文件:在打开的索引文件中,排在最前面的索引文件 说明:1)索引文件不能脱离所依赖的数据表文件而单独使用 2)结构化复合索引文件将随着数据表文件的打开而自动打开,其它索引文件则需要使用索引文件的打开命令进行打开 3)数据表文件只按主控索引文件的顺序显示各记录 4)若主控索引文件为复合索引文件,则记录显示与存取的次序仍按各记录实际存放的顺序,只有用ORDER指定主标记后,才按主标记的次序显示与存取记录 5)对数据表文件进行增、删、改操作时,系统会自动修改所有打开的索引文件。
(2)打开数据表文件的同时打开索引文件 格式:USE <表文件名>/? [INDEX <索引文件名表>/? [ORDER [<算术表达式>/<IDX索引文件名>/[TAG] <标记名> [OF <复合索引文件名>] [ASCENDING/DESENDING]]]] 说明:<算术表达式>的值表示该索引文件在<索引文件名表>中的顺序号,其规则为: 1)先对.IDX进行编号,然后是结构化.CDX中的索引标记,最后是独立.CDX文件中的索引标记 2)如果<算术表达式>的值为零,则记录将按记录号的顺序访问和显示。 示例:USE 学生表 INDEX 学生表_班级 USE 学生表 INDEX 学生表_班级, 学生表_班级_姓名,学生表_班级性别 ORDER TAG 班级_性别 OF 学生表_班级性别
(3)在数据表文件己经打开的情况下打开索引文件(3)在数据表文件己经打开的情况下打开索引文件 格式:SET INDEX TO[<索引文件名表>/?] [ORDER<算术表达式>/<IDX索引文件名>/[TAG]<标记名> [OF <复合索引文件>] [ASCENDING/DESCENDING]] [ADDITIVE] 示例: USE 学生表 SET INDEX TO 学生表_班级, 学生表_班级_姓名 SET INDEX TO 学生表_班级性别 ORDER TAG 班级_性别 OF 学生表_班级性别 ADDITIVE (4)在打开的索引文件中设置主控索引 格式:SET ORDER TO [<算术表达式>/<IDX索引文件名>/[TAG] <索引标记名> [OF <复合索引文件名> [ ASCENDING / DESCENDING]]
(4)在打开的索引文件中设置主控索引 示例:USE 学生表 SET INDEX TO 学生表_班级, 学生表_班级_姓名, 学生表_班级性别 SET ORDER TO 2 OF 学生表_班级性别 LIST SET ORDER TO 0 LIST SET ORDER TO TAG 班级_性别 OF 学生表_班级性别 LIST (5)关闭索引文件 格式:CLOSE ALL 或 CLOSE INDEXES
4. 重新索引 格式:REINDEX 5. 删除复合索引文件中的索引标记 格式:1)DELETE TAG <标记名1> [OF <复合索引文件名1>] [,<标记名2> [OF <复合索引文件名2>]] … 2)DELETE ALL [OF <复合索引文件名>] 3.3.3 数据表的查询 与数据表有关的几个函数 (1)表文件开始测试函数 格式:BOF([<工作区号或别名>]) 示例:USE 学生表 ?BOF() SKIP -1 ?BOF()
(2)表文件结束测试函数 格式:EOF([<工作区号或别名>]) 示例:USE 学生表 GO BOTTOM ?EOF() SKIP ?EOF (3)记录号测试函数 格式:RECNO([<工作区号或别名>]) 示例:USE 学生表 ?RECNO() GO 4 ?RECNO()
(4)测试查询结果函数 格式:FOUND([<工作区号或别名>]) 1. FIND命令 格式:FIND <字符串或数值> 示例:USE 学生表 INDEX ON 姓名 TO 学生表_姓名 FIND 于小丽 ?RECNO() DISP XM=“王 平” FIND &XM ?FOUND() DISP
2. SEEK命令 格式:SEEK <表达式> [ORDER <索引号>/IDX <索引文件名>/[TAG] <标识名> [OF <CDX文件名>] [ASCENDING/DESCENDING]] 示例:USE 学生表 INDEX 学生表_班级_学号 seek “金融二 ”+“99020202” DISP SET INDEX TO 学生表_姓名 SEEK “章闻天” DISP XM=“王 平” SEEK XM DISP
3. LOCATE和CONTINUE命令 格式:LOCATE [<范围>] FOR <条件> [WHILE<条件>] 示例:USE 学生表 LOCATE FOR 班级=“注会” DISP CONTINUE DISP
3.4 数据表的统计与汇总 3.4.1 数据表的统计 3.4.2 数据表的汇总 退出
3.4.1 数据表的统计 1. 计数命令 格式:COUNT [<范围>] [FOR <条件>] [WHILE <条件>] [TO <内存变量名>] 示例:USE 学生表 COUNT FOR 班级=“注会” TO AA ?AA COUNT TO BB ?BB 2. 求和命令 格式:SUM [<字段表达式表>] [<范围>] [TO <内存变量名表>/TO ARRAY <数组名>] [FOR <条件>] [WHILE <条件>]
2. 求和命令 示例:USE 分数 LIST SUM 成绩 FOR 学号=“99010301” TO CJ ?CJ 3. 求平均值命令 格式:AVERAGE [<表达式表>] [<范围>] [TO <内存变量名表>/TO ARRAY <数组名>] [FOR <条件>] [WHILE <条件>] 示例:USE 分数 LIST AVERAGE 成绩 FOR 学号=“99010301” TO CJPJ ?CJPJ
3.4.2 数据表的汇总 格式:TOTAL TO <新表文件名> ON <关键字> [FIELDS <字段名表>] [<范围>] [FOR <条件>] [WHILE <条件>] 说明:当前表必须按<关键字>进行过排序或索引 示例:USE 分数 LIST INDEX ON 学号 TO 分数表_学号 TOTAL TO 学号成绩 ON 学号 USE 学号成绩 COPY TO 成绩汇总 FIELDS 学号,成绩 USE 成绩汇总 LIST
3.5 多个数据表的使用 3.5.1 选择工作区的命令 3.5.2 数据表之间的关联 3.5.3 数据表之间的连接 3.5.4 数据表文件的更新 退出
3.5.1 选择工作区的命令 格式:SELECT <工作区号/别名> 说明:1)定义别名的命令格式:USE <数据表文件名> ALIAS <数据表文件的别名> 示例:USE 学生表 ALIAS XSB 2)工作区的区号可以用正整数表示,其中1到10号工作区也可以用英文字母A到J来表示 示例:SELECT A SELECT 1 SELECT XSB 3)当前工作区:最后被选择的工作区。使用其它工作区中字段的命令格式:<别名>.<字段名>或<别名>—><字段名> 示例:DISP 学号,姓名,班级,B.课程号,B.成绩 4)SELECT 0
3.5.2 数据表之间的关联 格式:SET RELATION TO [<关键字表达式1>/<数值表达式1> INTO <工作区号>/<别名>[,<关键字表达式2>/<数值表达式2> INTO <工作区号>/<别名>…][ADDITIVE]] 说明:1)<关键字表达式>的值必须是相关联的两个表文件共同具有的字段,<别名>表文件必须已经按关键字表达式建立了索引文件并处于打开状态。 2)当两个表文件建立关联后,当前表文件的记录指针移到某一记录时,被关联的表文件的记录指针也自动指向关键字值相同的记录上。如果被关联的表文件具有多个关键字值相同的记录,则指针只指向关键字值相同的第一条记录。如果被关联的表文件中没有找到匹配的记录,指针指向文件尾,即函数EOF()的值为.T.。 3)ADDITIVE与SET RELATION TO
3.5.2 数据表之间的关联 格式:SET RELATION TO [<关键字表达式1>/<数值表达式1> INTO <工作区号>/<别名>[,<关键字表达式2>/<数值表达式2> INTO <工作区号>/<别名>…][ADDITIVE]] 说明:3)如果命令中使用了<数值表达式>,则两个表文件按照记录号进行关联,这时<别名>表文件可以不用建立相关的索引文件。 4)当<别名>表文件中有多个关键字值相同的记录时,<别名>表文件的指针只能指向关键字值相同的第一条记录上,如果需要找到关键字值相同的多个记录,可以使用下面的命令: SET SKIP TO [<别名1> [,<别名2>]…] 5)如果需要切断当前数据表与特定数据表之间的关联,可以使用命令:SET RELATION OFF INTO <工作区号>/<别名>
3.5.2 数据表之间的关联 示例1:将数据表“分数”与“学生表”建立关联后,显示学生的学号、姓名、性别、班级、成绩等字段的内容。 SELECT 2 USE 学生表 INDEX ON 学号 TO 学生表_学号 SELECT 1 USE 分数 SET RELATION TO 学号 INTO B LIST 学号,B.姓名,B.性别,B.班级,课程号,成绩
3.5.2 数据表之间的关联 示例2:将“学生表”与“分数”仍按“学号”建立关联。 SELE B USE 分数 INDEX ON 学号 TO 分数_学号 SELE A USE 学生表 SET RELATION TO 学号 INTO B LIST 学号,姓名,班级,B.课程号,B.成绩 SET SKIP TO B LIST 学号,姓名,班级,B.课程号,B.成绩
3.5.3 数据表之间的连接 格式:JOIN WITH <工作区号>/<别名> TO <新表文件名> [FIELDS <字段名表>] FOR <连接条件> 示例:把已存在的数据表“分数”和“学生表”通过“学号”联接起来,生成新的数据表文件“学生分数”,新表文件中包含如下字段:学号、姓名、班级、课程号、成绩。 SELE A USE 学生表 SELE B USE 分数 JOIN WITH A FOR 学号=A.学号 TO 学生成绩 FIELDS 学号,A.姓名,A.班级,课程号,成绩 USE 学生成绩 LIST
3.5.4 数据表文件的更新 格式:UPDATE ON <关键字段名> FROM <工作区号>/<别名> REPLACE <字段名1> WITH <表达式1> [,<字段名2> WITH <表达式2> …] [RANDOM] 示例:假如在数据表“学生表”中增加了“总成绩”的字段,然后用数据表“分数”来计算学生的总成绩。 SELECT A USE 学生表 INDEX ON 学号 TO 学生表_学号 SELE B USE 分数 INDEX ON 学号 TO 分数_学号 SELE A UPDATE ON 学号 FROM B REPLACE 总成绩 WITH 总成绩+B.成绩