第 3章 数据表的创建及操作
3.1 数据表的创建
3.2 数据表的维护
3.4 数据表的统计与汇总
3.3 数据表的排序、索引与查询
3.5 多个数据表的使用退出
3.1 数据表的创建
3.1.3 数据表文件的打开、关闭、显示和定位退出
3.1.2 表数据的输入
3.1.1 创建数据表
3.1.1 创建数据表
1.数据表结构的定义
( 1)文件名:表文件的主要标识
( 2)结构:字段名、类型、宽度
( 3)记录:标文件的基本数据
2.数据表的创建
( 1)命令方式,CREATE [<文件名 >/?]
( 2)表向导
( 3)表设计器学号 姓名 班级 性别 电话 1 电话 2
99010301 刘 雨 电信 女 13000123 6123456
99010302 林 冲 电信 男 13100123 6234567
99010303 王 平 电子 男 13300123 6345678
99010304 张闻天 电子 男 13500123 6456789
99020201 赵 敏 电信 女 13600123 6567890
99020202 于小丽 电子 女 13700123 6678901
3.字段类型及命名
3.1.1 创建数据表
( 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.数据表文件的显示格式,LIST STRUCTURE
或 DISPLAY STRUCTURE
示例,USE 学生表
LIST STRU
( 1)结构的显示格式,LIST/DISPLAY [OFF] [<范围 >] [[FIELDS] <表达式表 >]
[WHILE <条件 >] [FOR <条件 >]
说明,<范围 >的可选值包括:
RECORD n:第 n条记录。
NEXT n:从当前记录开始以下的 N条记录。
REST:从当前记录开始到文件末尾的所有记录。
ALL:全部记录。
示例,USE 学生表
LIST OFF FOR 班级 =“注会”
LIST FIELDS 学号,姓名,班级
DISP ALL
( 2)记录的显示记录指针:用来指示表文件中记录位置的指针。
当前记录:指针当前所指向的记录。
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 显示和编辑数据表中的数据格式,BROWSE [FIELDS <字段名表 >] [LOCK <数值表达式 >]
[FREEZE <字段名 >] [NOMENU] [NOAPPEND] [NOMODIFY]
[WIDTH <数值表达式 >] [FOR <逻辑表达式 >] [PARTITION <数值表达式 >] [LEDIT] [REDIT] [NOLINK]
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
1,浏览修改命令 BROWSE
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)数据表的排序:把数据表文件中的记录按照某个字段值的大小顺序重新排列。
( 2)关键字:作为排序依据的字段。
( 3)升序:按照关键字值从小到大的顺序进行排序。
( 4)降序:按照关键字值由大到小的顺序进行排序。
( 5) 数据大小的比较规则:
如果是数值型,日期型的数据进行比较,则由其本身的大小决定;字符型数据由其 ASCII码值确定,汉字由机内码确定大小 。
1,概念
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(建立,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
2.索引文件的建立
3.索引文件的打开与关闭主控索引文件:在打开的索引文件中,排在最前面的索引文件说明,1)索引文件不能脱离所依赖的数据表文件而单独使用
2)结构化复合索引文件将随着数据表文件的打开而自动打开,
其它索引文件则需要使用索引文件的打开命令进行打开
3)数据表文件只按主控索引文件的顺序显示各记录
4)若主控索引文件为复合索引文件,则记录显示与存取的次序仍按各记录实际存放的顺序,只有用 ORDER指定主标记后,才按主标记的次序显示与存取记录
5)对数据表文件进行增、删、改操作时,系统会自动修改所有打开的索引文件。
( 1)有关概念
( 2)打开数据表文件的同时打开索引文件格式,USE <表文件名 >/? [INDEX <索引文件名表 >/? [ORDER
[<算术表达式 >/<IDX索引文件名 >/[TAG] <标记名 > [OF <复合索引文件名 >] [ASCENDING/DESENDING]]]]
说明,<算术表达式 >的值表示该索引文件在 <索引文件名表 >中的顺序号,其规则为:
1)先对,IDX进行编号,然后是结构化,CDX中的索引标记,最后是独立,CDX文件中的索引标记
2)如果 <算术表达式 >的值为零,则记录将按记录号的顺序访问和显示。
示例,USE 学生表 INDEX 学生表 _班级
USE 学生表 INDEX 学生表 _班级,学生表 _班级 _姓名,学生表 _班级性别 ORDER TAG 班级 _性别 OF 学生表 _班级性别
( 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.1 数据表的统计
1,计数命令格式,COUNT [<范围 >] [FOR <条件 >] [WHILE <条件 >] [TO <
内存变量名 >]
示例,USE 学生表
COUNT FOR 班级 =“注会,TO AA
AA
COUNT TO BB
BB
2,求和命令格式,SUM [<字段表达式表 >] [<范围 >] [TO <内存变量名表 >/TO
ARRAY <数组名 >] [FOR <条件 >] [WHILE <条件 >]
示例,USE 分数
LIST
SUM 成绩 FOR 学号 =“99010301” TO CJ
? CJ
2,求和命令
3,求平均值命令格式,AVERAGE [<表达式表 >] [<范围 >] [TO <内存变量名表
>/TO ARRAY <数组名 >] [FOR <条件 >] [WHILE <条件 >]
示例,USE 分数
LIST
AVERAGE 成绩 FOR 学号 =“99010301” TO CJPJ
CJPJ
3.5 多个 数据表的使用
3.5.1 选择工作区的命令
3.5.2 数据表之间的关联
3.5.3 数据表之间的连接退出
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
格式,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 数据表之间的关联
3.5.2 数据表之间的关联示例 1:将数据表“分数”与“学生表”建立关联后,显示学生的学号、姓名、性别、班级、成绩等字段的内容。
SELECT 2
USE 学生表
INDEX ON 学号 TO 学生表 _学号
SELECT 1
USE 分数
SET RELATION TO 学号 INTO B
LIST 学号,B.姓名,B.性别,B.班级,课程号,成绩示例 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.2 数据表之间的关联
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