1、第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)表设计器,3.字段类型及命名,3.1.1 创建数据表,(1)字段名:必须以字母或汉字开头,可以
2、包括字母、汉字、数字和下划线,不要超过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 BEF
3、ORE BLANK,3.1.3 数据表文件的打开、关闭、显示和定位,1.数据表文件的打开与关闭,命令格式:USE 示例:USE 学生表.DBFUSE,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 班级=“注会”L
4、IST FIELDS 学号,姓名,班级DISP ALL,(2)记录的显示,记录指针:用来指示表文件中记录位置的指针。 当前记录:指针当前所指向的记录。,3.记录指针的定位,(1)指针的绝对移动命令,格式:GO/GOTO RECORD GO/GOTO TOP/BOTTOM 示例:USE 学生表GO 3DISPGOTO RECN 5DISPGO TOPDISP,(2)指针的相对移动命令,格式:SKIP +/- 示例:USE 学生表DISPSKIP DISPSKIP 3DISPSKIP -2DISPSKIP 6DISP,3.2 数据表的维护,3.2.1 数据表结构的修改,3.2.2 显示和编辑数据表
5、中的数据,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 班级B
6、ROWSE PARTITION 12 LEDITBROWSE WIDTH 4BROWSE NOAPPENDBROWSE NOMENUBROWSE LOCK 2BROWSE FOR 班级=“注会”BROWSE NOMODIFY,1. 浏览修改命令BROWSE,2. CHANGE/EDIT命令,格式:CHANGE/EDIT FIELDS WHILE FOR 示例: USE 学生表.DBFCHANGE FIELDS 姓名,班级,家庭住址,电话,3. REPLACE命令,格式:REPLACE WITH ADDITIVE , WITH ADDITIVE FOR WHILE 示例:USE 学生表.DBFG
7、O 6DISPREPLACE 姓名 WITH “李 青“,性别 WITH “男“DISP,4. 修改通用型字段,格式:MODIFY GENERAL NOMODIFY NOWAIT IN SCREEN,3.2.3 删除数据表中的记录,1. 逻辑删除数据表中的数据,格式:DELETE WHILE条件 FOR条件 说明:SET DELETED ON/OFF 示例:USE 学生表.DBFGO 6DELETELISTSET DELETE ONLIST,2.恢复数据表中逻辑删除的数据,格式:RECALL FOR WHILE 示例:USE 学生表.DBFGO 6DELETEDISPGO 6RECALLDIS
8、P,3. 物理删除数据表中的数据,格式:PACK,4. 删除数据表中的所有记录,格式:ZAP 说明:SET SAFETY ON/OFF,3.2.4文件的显示、复制、删除与更名,1.文件目录的显示命令,格式:DIR/DIRECTORY 或 DISPLAY FILES 或 LIST FILES 示例:DIRDIR *.PRGDIR C:*.*,2. 显示文件内容的命令,格式:TYPE ,3.文件的复制,(1)任意类型文件的复制,格式:COPY FILE TO 示例:COPY FILE 学生表.DBF TO 学生表1.DBFCOPY FILE 学生表.FPT TO 学生表1.FPT,(2)数据表文件
9、的复制,格式:COPY TO FIELDS FOR WHILE 示例:USE 学生表.DBFCOPY TO 学生表2 FOR 班级=“金融二”,(3)数据表结构的复制,格式:COPY STRUCTURE TO FIELDS 示例:USE 学生表.DBFCOPY STRUCTURE TO 学生表3 FIELDS 班级,姓名,家庭住址,电话USE 学生表3LIST STRUCTURE,4.文件的更名,格式:RENAME TO 示例:RENAME E:VFP例题学生表.DBF TO 学生名单.DBFRENAME E:VFP例题学生表.DBF TO 学生名单.FPT,5.文件的删除,格式:ERASE
10、/?或 DELETE FILE /? 示例:ERASE 学生表3.DBFDELETE FILE 学生名单.DBF,6.从另外的数据表中向当前表文件添加记录,格式:APPEND FROM FIELDS WHILE FOR 示例:USE 学生表COPY STRU TO 学生表3USE 学生表3APPEND FROM 学生表,3.3 数据表的排序、索引与查询,3.3.1 数据表的排序,3.3.2 数据表的索引,3.3.3 数据表的查询,退出,3.3.1 数据表的排序,(1)数据表的排序:把数据表文件中的记录按照某个字段值的大小顺序重新排列。 (2)关键字:作为排序依据的字段。 (3)升序:按照关键字
11、值从小到大的顺序进行排序。 (4)降序:按照关键字值由大到小的顺序进行排序。 (5)数据大小的比较规则:如果是数值型、日期型的数据进行比较,则由其本身的大小决定;字符型数据由其ASCII码值确定,汉字由机内码确定大小。,1. 概念,2.命令格式,格式:SORT TO ON /A/D/C, /A/D/CASCENDING/DESCENDING FOR WHILE FIELDS 示例:USE 学生表SORT TO STUDENT1 ON 班级,姓名/DUSE STUDENT1LISTUSE 学生表SORT TO 学生表_金融 ON 学号 FOR 班级=“金融二”USE 学生表_金融LIST,3.3
12、.2 数据表的索引,为什么使用索引? 1)排序造成了数据冗余,浪费存储空间 2)如果对数据表文件进行增、删、改操作时,需要重新进行排序 什么是索引文件? 1)索引文件是由指针构成的,这些指针逻辑上按照索引关键字进行排序。 2)索引文件和表文件分别进行存储,并不改变表中记录的物理位置。,3.3.2 数据表的索引,1.索引文件的类型,(1)独立索引文件:扩展名为.IDX,其各个索引文件只能包含一个单一的关键字或者组合关键字。 独立索引文件可分为:压缩索引文件和非压缩索引文件。 (2)复合索引文件:扩展名为.CDX,在一个复合索引文件中可以包含多个索引选项,每个索引选项叫做索引标识(Index Ta
13、g)。 复合索引文件有两种类型:结构复合索引文件(Structural Compound Index)和独立复合索引文件(Independent Compound Index)。,2.索引文件的建立,格式1(建立.IDX索引文件): INDEX ON TO FOR UNIQUE COMPACT ADDITIVE 示例:USE 学生表INDEX ON 班级 TO 学生表_班级LIST INDEX ON 班级+姓名 TO 学生表_班级_姓名LISTINDEX ON 姓名 TO 学生表_姓名 FOR 班级=“注会”LIST,格式2(建立.CDX索引文件) INDEX ON TAG OF UNIQUE
14、/CANDIDATE ASCENDING/DESCENDING ADDITIVE FOR 示例:USE 学生表INDEX ON 姓名 TAG 姓名LISTUSE 学生表INDEX ON 班级+性别 TAG 班级_性别 OF 学生表_班级性别LISTINDEX ON 班级TAG 班级 OF 学生表_班级性别LIST,2.索引文件的建立,3.索引文件的打开与关闭,主控索引文件:在打开的索引文件中,排在最前面的索引文件 说明:1)索引文件不能脱离所依赖的数据表文件而单独使用2)结构化复合索引文件将随着数据表文件的打开而自动打开,其它索引文件则需要使用索引文件的打开命令进行打开3)数据表文件只按主控索
15、引文件的顺序显示各记录4)若主控索引文件为复合索引文件,则记录显示与存取的次序仍按各记录实际存放的顺序,只有用ORDER指定主标记后,才按主标记的次序显示与存取记录5)对数据表文件进行增、删、改操作时,系统会自动修改所有打开的索引文件。,(1)有关概念,(2)打开数据表文件的同时打开索引文件,格式:USE /? INDEX /? ORDER /TAG OF ASCENDING/DESENDING 说明:的值表示该索引文件在中的顺序号,其规则为:1)先对.IDX进行编号,然后是结构化.CDX中的索引标记,最后是独立.CDX文件中的索引标记2)如果的值为零,则记录将按记录号的顺序访问和显示。 示例
16、:USE 学生表 INDEX 学生表_班级 USE 学生表 INDEX 学生表_班级, 学生表_班级_姓名,学生表_班级性别 ORDER TAG 班级_性别 OF 学生表_班级性别,(3)在数据表文件己经打开的情况下打开索引文件,格式:SET INDEX TO/? ORDER/TAG OF ASCENDING/DESCENDING ADDITIVE 示例: USE 学生表 SET INDEX TO 学生表_班级, 学生表_班级_姓名 SET INDEX TO 学生表_班级性别 ORDER TAG 班级_性别 OF 学生表_班级性别 ADDITIVE,(4)在打开的索引文件中设置主控索引,格式:
17、SET ORDER TO /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 O
18、F , OF 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(
19、) DISPXM=“王 平”FIND &XM?FOUND() DISP,2. SEEK命令,格式:SEEK ORDER /IDX /TAG OF ASCENDING/DESCENDING 示例:USE 学生表 INDEX 学生表_班级_学号seek “金融二 ”+“99020202”DISPSET INDEX TO 学生表_姓名SEEK “章闻天”DISPXM=“王 平”SEEK XMDISP,3. LOCATE和CONTINUE命令,格式:LOCATE FOR WHILE 示例:USE 学生表LOCATE FOR 班级=“注会”DISPCONTINUEDISP,3.4 数据表的统计与汇总,3
20、.4.1 数据表的统计,3.4.2 数据表的汇总,退出,3.4.1 数据表的统计,1. 计数命令,格式:COUNT FOR WHILE TO 示例:USE 学生表COUNT FOR 班级=“注会” TO AA?AACOUNT TO BB?BB,2. 求和命令,格式:SUM TO /TO ARRAY FOR WHILE ,示例:USE 分数LISTSUM 成绩 FOR 学号=“99010301” TO CJ?CJ,2. 求和命令,3. 求平均值命令,格式:AVERAGE TO /TO ARRAY FOR WHILE 示例:USE 分数LISTAVERAGE 成绩 FOR 学号=“99010301
21、” TO CJPJ?CJPJ,3.4.2 数据表的汇总,格式:TOTAL TO ON FIELDS FOR WHILE 说明:当前表必须按进行过排序或索引 示例:USE 分数 LISTINDEX 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 A
22、LIAS 示例:USE 学生表 ALIAS XSB2)工作区的区号可以用正整数表示,其中1到10号工作区也可以用英文字母A到J来表示 示例:SELECT A SELECT 1 SELECT XSB 3)当前工作区:最后被选择的工作区。使用其它工作区中字段的命令格式:.或 示例:DISP 学号,姓名,班级,B.课程号,B.成绩 4)SELECT 0,3.5.2 数据表之间的关联,格式:SET RELATION TO / INTO /,/ INTO /ADDITIVE 说明:1)的值必须是相关联的两个表文件共同具有的字段,表文件必须已经按关键字表达式建立了索引文件并处于打开状态。 2)当两个表文件
23、建立关联后,当前表文件的记录指针移到某一记录时,被关联的表文件的记录指针也自动指向关键字值相同的记录上。如果被关联的表文件具有多个关键字值相同的记录,则指针只指向关键字值相同的第一条记录。如果被关联的表文件中没有找到匹配的记录,指针指向文件尾,即函数EOF()的值为.T.。 3)ADDITIVE与SET RELATION TO,格式:SET RELATION TO / INTO /,/ INTO /ADDITIVE 说明:3)如果命令中使用了,则两个表文件按照记录号进行关联,这时表文件可以不用建立相关的索引文件。 4)当表文件中有多个关键字值相同的记录时,表文件的指针只能指向关键字值相同的第一
24、条记录上,如果需要找到关键字值相同的多个记录,可以使用下面的命令: SET SKIP TO , 5)如果需要切断当前数据表与特定数据表之间的关联,可以使用命令:SET RELATION OFF INTO /,3.5.2 数据表之间的关联,3.5.2 数据表之间的关联,示例1:将数据表“分数”与“学生表”建立关联后,显示学生的学号、姓名、性别、班级、成绩等字段的内容。SELECT 2USE 学生表INDEX ON 学号 TO 学生表_学号SELECT 1USE 分数SET RELATION TO 学号 INTO BLIST 学号,B.姓名,B.性别,B.班级,课程号,成绩,示例2:将“学生表”与
25、“分数”仍按“学号”建立关联。SELE BUSE 分数INDEX ON 学号 TO 分数_学号SELE AUSE 学生表SET RELATION TO 学号 INTO BLIST 学号,姓名,班级,B.课程号,B.成绩SET SKIP TO BLIST 学号,姓名,班级,B.课程号,B.成绩,3.5.2 数据表之间的关联,3.5.3 数据表之间的连接,格式:JOIN WITH / TO FIELDS FOR 示例:把已存在的数据表“分数”和“学生表”通过“学号”联接起来,生成新的数据表文件“学生分数”,新表文件中包含如下字段:学号、姓名、班级、课程号、成绩。SELE AUSE 学生表SELE
26、BUSE 分数JOIN WITH A FOR 学号=A.学号 TO 学生成绩 FIELDS 学号,A.姓名,A.班级,课程号,成绩USE 学生成绩LIST,3.5.4 数据表文件的更新,格式:UPDATE ON FROM / REPLACE WITH , WITH RANDOM 示例:假如在数据表“学生表”中增加了“总成绩”的字段,然后用数据表“分数”来计算学生的总成绩。 SELECT A USE 学生表 INDEX ON 学号 TO 学生表_学号 SELE B USE 分数 INDEX ON 学号 TO 分数_学号 SELE A UPDATE ON 学号 FROM B REPLACE 总成绩 WITH 总成绩+B.成绩,