大学程序设计-数据表基本操作.ppt
第4章 数据表基本操作,数据表的建立数据表操作命令数据表的排序与索引数据表的查询与统计数据表之间的操作,数据表分为自由表和数据库表两种。自由表是指单独存在的,未包含在任何数据库中的表;数据库表则是从属于某个数据库的数据表,并且通常还与该数据库中的其他数据表有一定的联系数据表的扩展名为.DBF,若数据表中备注型或通用型字段,则产生一个同名的.FPT文件,文件命名与其它文件命名相同数据表文件由表结构和记录(内容)组成,4.1 数据表的建立,4.1.1 表结构的建立与修改,问题 建表工具是什么?怎样打开工具?建表的步骤?如何修改表结构?如何打开表文件?,1.表结构的建立,建表工具 表设计器打开工具的方法,新建表时会打开该工具 菜单方法 命令方式,CREATE,表结构的建立过程“文件”“新建”选“表”,按“确定”在“表设计器”中输入(1)字段名(2)字段类型(3)字段宽度(4)NULL值建完之后,按”确定”,请先确认自己的工作目录字段名由英文字母、中文字、数字和下划线组成,不能含空格,且必须以汉字或字母开头,自由表的字段名至多10个字符,数据库表至多128个字符字段数最多255个,注意事项,类型13种类型:字符型、数值型、货币型、日期型、日期时间型、逻辑型、备注型、通用型、整型、浮点型、双精度型、二进制字符型与二进制备注型,注意事项,字段宽度除字符型、二进制字符型、数值型和浮点型外,其它9种字段宽度是固定不变的,小数点占一位,数值型与浮点型不得超过20,有效位为16位,小数位数不超过9位,注意事项,如果表结构中包含有“备注型”或“通用型”字段,则创建两个文件,扩展文件名为:dbf与fpt;否则,只创建一个dbf文件,方法一:“文件”打开”,或按”打开”按钮.选择文件类型(.dbf)文件名方法二:USE 表名建议用此方法打开表文件 注意:打开与显示不同,状态栏上显示表是否打开。,2.打开表文件,修改表结构的过程打开表文件“显示”“表设计器”(1)修改字段属性(2)插入字段(3)删除字段(4)调整字段位置,3.表结构的修改,问题手工追加多条记录的菜单命令是什么?手工追加多条记录的窗口命令是什么?追加一条记录的菜单命令是什么?如何输入备注型与通用型数据?,4.1.2 表记录数据的输入,输入多条数据菜单命令显示浏览显示追加方式窗口命令 Append追加单条记录显示浏览表追加新记录从其它文件中追加显示浏览表追加记录,如何输入数据一般字段的输入 日期型输入格式:mm/dd/yy,用set date to ymd,set century on备注字段的输入备注窗口打开:双击(或Ctrl+Pgdn)备注窗口关闭:关闭(或ctrl+W)保存,Esc(Ctrl+Q)放弃,Memo表示有数据,通用字段的输入通用窗口打开:双击(或Ctrl+Pgdn)“编辑”+“插入对象”(“选择性粘贴”)通用窗口关闭:关闭(或ctrl+W)保存,Esc(Ctrl+Q)放弃,Gen表示有数据,如何浏览数据?浏览方式如何切换?如何修改数据?,4.1.3 表数据的浏览与维护,浏览数据 打开表文件显示浏览 两种浏览方式切换 显示浏览 显示编辑 在浏览窗口修改记录 删除记录显示浏览表删除记录(彻底删除),4.2 数据表操作命令,4.2.1 表结构操作命令建表结构的命令?打开表的命令?关闭表的命令?显示表结构的命令?修改表结构的命令?复制表结构的优点与命令?如何复制表结构与记录?,创建表结构命令 格式:CREATE/?功能:新建一个Visual FoxPro数据表文件名可以包含盘符与路径CREATE=CREATE?,这时会弹出创建对话框如:CREATE XSCJ,打开数据表命令 格式:USE 功能:打开指定的数据表或关闭数据表表打开时,记录指针指向首记录表打开同时,自动打开相应备注文件(FPT)当缺省,关闭当前工作区中的表文件如:USE ZGDA,关闭数据表命令 格式1:CLOSE DATABASES 关闭数据库与表文件 格式2:CLOSE ALL 关闭所有文件 格式3:CLEAR ALL 关闭所有文件,清除内存 格式4:QUIT 关闭所有文件,退出VFP,显示表结构命令 格式1:LIST STRUCTURE 格式2:DISPLAY STRUCTURE注意:DISPLAY是分屏显示,如:USE ZGDA DISP STRU LIST STRU,修改表结构命令 格式:MODIFY STRUCTURE 功能:打开“表设计器”窗口,显示并修改当前数据表的结构注意:系统自动备份原数据表文件,其扩展文件名变化:.dbf.bak,.fpt.tbk 如:USE ZGDA MODI STRU,复制表结构命令 格式:COPY STRUCTURE TO FIELDS 功能:对当前数据表结构进行复制,形成一个指定名称的新表结构。,例1 创建新表zgbak.dbf,使其结构与zgda.dbf一样 use zgda copy stru to zgbak use zgbak list stru use,复制数据表命令 格式:COPY TO FOR WHILE FIELDS TYPE 功能:对当前数据表中指定范围内符合条件的记录进行复制,形成一个指定名称的新数据表。注意:(1)缺少所短语时,新文件是和原表文件完全相同的表文件(2)选择TYPE短语时,新文件的类型与TYPE所指定的文件类型一致,例2 由表zgda创建表nanzgfile保存男职工的记录,创建文本文件nvzgfile保存女职工的记录 USE ZGDA COPY TO NANZGFILE FOR 性别=男“COPY TO NVZGFILE FOR 性别=“女“TYPE SDF USE NANZGFILE LIST!NOTEPAD NVZGFILE USE,4.2.2 追加与插入记录命令 如何手工追加记录?如何从其它文件中追加记录到当前表文件?如何插入一条空记录?,追加记录命令 格式:APPEND BLANK 功能:在当前数据表的末尾增加新记录注意:缺省BLANK,弹出记录编辑窗口,这时等价菜单命令:“显示”“追加方式”。APPEND BLANK类似于菜单命令:“表”“追加新记录”,从其他表追加记录命令 格式:APPEND FROM FOR WHILE FIELDS TYPE 功能:将指定表文件中指定范围内符合条件的记录自动添加到当前数据表的末尾注意:若由TYPE指定类型,则从指定类型的文件添加,常见的有txt,xls等,否则为表文件。等价于菜单命令:“表”“追加记录”,例3 创建nanzg与nvzg表,并分别从nanzgfile.dbf与nvzgfile.txt追加数据 use zgda copy stru to nanzg use nanzg append from nanzgfile brow last,use zgda copy stru to nvzg use nvzg append from nvzgfile type sdf brow last use,注意:copy structure toappend from等价于copy to,3.插入记录命令 格式:INSERT BLANK BEFORE 功能:在当前数据表指定的位置上插入一条新记录。注意:选BLANK时,插入空记录,否则,弹出记录编辑窗口;选BEFORE时,在当前记录前插入,否则,在当前记录后插入。如:USE NANZG GO 3 INSERT BLANK,4.2.3 记录指针移动命令怎样移动记录指针?相对移动与绝对移动有什么不同?其它命令会移动记录指针吗?,记录指针的绝对移动 格式1:GOTO 功能:将记录指针移到第条记录。格式2:GOTO TOP 功能:将记录指针移到当前表的第一条记录。格式3:GOTO BOTTOM 功能:将记录指针移到当前表最后一条记录。,记录指针的相对移动 格式:SKIP 功能:相对于当前记录,记录指针向上或向下移动若干条记录。说明:当的值为正数时,向下移动条记录;当的值负数时,向上移动条记录;缺省时,默认向下移动一条记录。当expN有小数时,只取整数部分,go 1.9与go 1等价,skip 2.5与skip 2等价,关于记录指针的问题如果记录指针指向文件的开头,则bof()为.T.,否则为.F.如果记录指针指向文件的结尾,则eof()为.T.,否则为.F.Recno()返回记录号,即记录指针指向记录的序号,如recno()为3,表示第3条记录的开头,第2条记录的结尾.Reccount()计算表文件的记录个数.简写为recc()表文件刚打开时,recno()为1,但并不是表文件的开头,第一条记录不是表文件的开头,但在文件的开头时,记录号还是为1.换言之,recno()为1并不一定在文件开头,bof()可能为.t.,也可能为.f.,但bof()为.t.时,recno()一定为1当指向最后一条记录时,并不是文件的结尾.若文件总共有14条记录,当recno()为14时,表示指向第14记录的前面,若recno()为15时,表示在14条记录的后面,此时,eof()为.t.当go 1或go top后,再skip-1,记录不会减1,但bof()的值变为.t.,当go bottom 或go recc()后,再skip 或skip 1,记录号会加1,且eof()的值变为.t.,Use zgda?reccount()?recno()Go 5?recno()Go top?recno()?bof()Skip 5Recno(),Skip与go命令不能超过记录的范围.Use zgdaSkip-3?recno()Skip 6?recno()Go bottom?recno()?eof()Skip 1?recno()?eof(),4.2.4 显示记录命令 如何在主窗口中显示记录 显示记录与浏览记录有什么差别?,显示记录命令格式1:LIST FOR WHILE FIELDS OFF TO PRINT格式2:DISPLAY FOR WHILE FIELDS OFF TO PRINT 功能:输出指定范围内满足条件的各个记录的有关内容。注意:LIST的缺省范围为ALL,DISPLAY的缺省范围为当前记录,但有条件短语时,默认范围为ALL.选OFF,不输出记录号,例4(1)显示zgda中男职工记录的编号与姓名(2)第8条记录的编号与姓名 use zgda list 编号,姓名 for 性别=男或 disp 编号,姓名 for 性别=男或 list for 性别=男 fiel 编号,姓名 go 8 disp 编号,姓名或 list record 8或 disp record 8思考:list 8是什么意思?Disp 8呢?,4.2.5 删除记录命令怎样逻辑删除?即delete命令使用.物理删除(pack)与逻辑删除的不同.恢复逻辑删除数据的命令是什么?Recall的使用.Zap的意义?,1.逻辑删除记录命令 格式:DELETE FOR WHILE 功能:对指定范围内满足条件的记录打上删除标志(逻辑删除)。注意:(1)缺省范围与条件选项时,仅对当前记录删除;(2)SET DELETED ON 可以屏蔽删除记录,即不显示;(3)用测试函数deleted()可以显示当前记录是否有删除标志,例5 创建zgda表的备份文件zgbak,然后把zgbak中年龄大于等于45岁的记录打上删除标志,最后彻底删除 use zgda copy to zgbak use zgbak dele for 年龄=45 brow list set deleted on&屏蔽有删除标志的记录 brow list pack use,2.去除删除标志命令 格式:RECALL FOR WHILE 功能:去除指定范围内满足条件的记录已有的删除标志。注意:缺省范围和条件短语时,仅去当前记录的删除标志,Use zgdaCopy to tmpUse tmpGo 1Dele?deleted()Recall?Deleted()UseDele file tmp.dbf,3.物理删除记录命令 格式:PACK 功能:对当前数据表进行压缩,剔除带有删除标志的记录,永久删除。如:use zgda copy to zgbak use zgbak dele for 年龄=45?reccount()pack?reccount()use思考:相应的菜单命令是什么?Delete呢?,4.一次性删除全部记录命令 格式:ZAP 功能:删除当前数据表中的所有记录,使其成为只剩有表结构的空表文件。注意:zap=dele all+pack,但zap速度更快如:use zgda copy to tmp use tmp list zap list use,4.2.6 修改记录命令EditChangeBrowse如何成批替换记录?Replace命令的使用.,4.2.6 修改记录命令1.编辑修改命令 格式1:EDIT FOR WHILE FIELDS 格式2:CHANGE FOR WHILE FIELDS 功能:弹出编辑窗口对记录进行修改。如:use zgbak edit for 性别=“男”,2.浏览修改命令 格式:BROWSE FIELDS LOCK FREEZE NOAPPENDNOMODIFY 功能:以浏览窗口方式显示当前数据表数据并供用户进行修改。注意:(1)此命令等价“显示”“浏览”;(2)NOAPPEND:禁止追加,NOMODIFY:禁止修改(3)LOCK:锁定指定的字段,FREEZE:光标冻结在该字段上,如:use zgda copy to zgbak use zgbak brow lock 3 brow freeze 姓名 use,3.成批替换修改命令 格式:REPLACE FOR WHILE WITH,WITH.功能:对指定范围内符合条件的记录,用指定的值替换指定的内容。注意:(1)缺少范围与条件短语时,只改变当前记录(2)表达式类型与字段类型必须一致,例6(1)将zgbak中的年龄增加一岁,基本工资增加20%;(2)将zgbak第13条件记录的性别改为男;(3)将zgbak中的高工的工资加300。use zgda copy to zgbak use zgbak repl all 年龄 with 年龄+1,基本工资 with 基本工资*1.2,repl reco 13 性别 with“男”repl all 基本工资 with 基本工资+300 for 职称=高工 use zgbak,小结菜单命令:建表、修改表结构、显示、追加记录、修改记录窗口命令(建议使用窗口命令)表结构:创建、显示、修改、复制表基本操作:打开、关闭表的复制:复制命令(结构与数据一起复制)记录添加:追加、插入、从其它文件追加记录移动:相对、绝对记录显示:显示、浏览,记录删除:逻辑、物理、全部删除、恢复记录修改:手工修改、成批修改,思考 已知表文件zgda.dbf,创建zjgz.dbf,包含编号、姓名、基本工资,并相应字段的记录由zgda追加到zjgz中.添加新字段:增加额,类型为N(7,2).添加新字段:总工资,类型为N(8,2).70年前出生的职工的增加额置为200,70年以后(70年出生的)出生的职工为100,总工资为基本工资与增加额的和.最后删除60年以前出生的男职工.请写出命令序列.,4.3 数据表的排序与索引,要点物理排序:Sort on建立索引:Index on打开索引:Set index to主控索引:Set order to索引的三个要素:排序关键字表达式、索引名(标识)、文件名索引使用:建索引打开索引指定主控索引,排序方式:物理排序、逻辑排序物理排序会把排序的结果放到一个新文件中,即产生一个新数据表.逻辑排序方法是建立索引表,记载关键字或索引表达的值与记录号,其索引表是一个单独的文件,但相对于数据表来说所占空间小.逻辑排序速度快、效率高、数据冗余少,基本概念,4.3.1 物理排序 格式:SORT ON/A/C/D,/A/C/D.TO FOR WHILE FIELDS 功能:对指定范围内满足条件的记录按指定之值的大小重新排序后生成一个给定名称的新数据表文件,物理排序,注意:(1)缺省范围和条件短语时,范围为ALL(2)生成的文件放在TO短语所指定的文件中,其结构由FIELDS所指定,缺省是与原表的结构相同(3)/A、/D表示升序与降序,同时指定则以最后的为准,默认为升序,/C表示不区分大小写(4)ASCENDING表示所关键都按升序、DESCENDING表示所关键都按降序(5)不能对备注字段和通用字段排序,物理排序,例7 对zgda表中的基本工资按升序,若相同再按出生日期的降序进行排序,排序生成文件名为zggzb.dbf,且文件中只包含姓名、职称、基本工资、出生日期,并显示结果 use zgda sort on 基本工资/A,出生日期/D to zggzb fields姓名,职称,基本工资,出生日期 use zggzb list,物理排序,思考:对ZGDA表中性别与职称的降序排序生成文件xbzc.dbf,请写出命令。SORT ON 性别/D,职称/D to xbzc,物理排序,4.3.2 索引类型索引文件类型索引项的类型索引的三个要素是什么?文件名 索引名 关键字,索引类型,索引文件的类型单索引文件:扩展名为.IDX(index),只包含一个索引项复合索引文件:扩展名为.CDX(compound index),可以包含多个索引项并以压缩方式存储结构复合索引文件:与数据表同名的.CDX文件非结构复合索引文件:与数据表不同名的.CDX文件,索引类型,索引类型,Zg.dbf,用”姓名”建单索引文件xm,索引单索引文件,Xm.idx,关键字表达式,建单索引文件,标识Xm,1.用”工号”建复合索引zgsy,索引标识为gh2.用”姓名”建复合索引zgsy,索引标识为xm,索引复合索引文件,Zgsy.cdx,标识:gh,标识:xm,关键字,关键字,索引的类型(1)主索引:(2)候选索引(3)普通索引(4)唯一索引,索引类型,索引类型,可以用编号建立候选索引吗?用职称呢?,索引类型,4.3.3 索引文件的建立 建索引的方法 表设计器 命令方式 建索引的关键之处是什么?,索引文件的建立,在表设计器中建立索引 步骤 打开表 打开表设计器 索引列中指定,或索引选项卡中建立 注意:(1)应先打开表文件;(2)在索引列中指定索引,此时建立的是普通索引,索引项(表达式)为该字段变量,索引标识(名)与该字段变量同名,索引文件的建立,(3)索引选项卡进行定义复杂的索引(4)表设计器建立的索引为结构复合索引(5)索引名(标识)可任意定义,用来标识该索引(6)表达式可以由表达式生成器生成,也可以自己定义例8 用职称的前两个汉字与基本工资的升序建立一个索引标识为zcgz的普通索引,索引文件的建立,用命令建立索引格式1:INDEX ON TO FOR COMPACT UNIQUE ASCENDING ADDITIVE格式2:INDEX ON TAG OF FOR UNIQUE|CANDIDATE ASCENDING|DESCENDING ADDITIVE,索引文件的建立,功能:命令格式1是对当前数据表中记录按值的大小排列,建立一个单索引文件。命令格式2是对当前数据表中记录按值的大小排列,建立一个复合索引文件中的索引标识。注意:(1)tag 指定索引标识(2)additive 指明不关闭已打开的索引,索引文件的建立,例9 对zgda表建立单索引文件(1)按照出生日期的升序对所有的记录建立一个单索引文件csrqsy(2)按照性别,性别相同时再按姓名的升序排列对所有的记录建立单索引文件xbxmsy(3)按姓名的升序仅对性别为男的记录建立唯一索引的单索引压缩文件nanxmsy,索引文件的建立,(1)按照出生日期的升序对所有的记录建立一个单索引文件csrqsy use zgda index on 出生日期 to csrqsy disp all 编号,姓名&有什么不同?问题:索引文件名与索引标识是什么?,索引文件的建立,(2)按照性别,性别相同时再按姓名的升序排列对所有的记录建立单索引文件xbxmsy use zgda index on 性别+姓名 to xbxmsy disp all 编号,姓名&有什么不同?,索引文件的建立,(3)按姓名的升序仅对性别为男的记录建立唯一索引的单索引压缩文件nanxmsy use zgda index on 姓名 to nanxmsy for 性别=男;unique compact disp all 编号,姓名&有什么不同?use,索引文件的建立,例10(1)对zgda表中所记录按基本工资的升序建立一个索引标识名为jbgzsy,索引类型为普通索引的结构复合索引(2)对zgda表中所有记录按职称的前两个汉字的降序,若前两个汉字相同则按基本工资的降序建立一个索引标识为zcgzsy,索引类型为唯一索引的结构复合索引(3)对zgda表中所记录按性别与出生日期的升序建立一个索引标识名为xbcsrqsy,索引类型为候选索引的结构复合索引,索引文件的建立,(1)对zgda表中所记录按基本工资的升序建立一个索引标识名为jbgzsy,索引类型为普通索引的结构复合索引 use zgda index on 基本工资 tag jbgzsy ascending list 编号,姓名,索引文件的建立,(2)对zgda表中所有记录按职称的前两个汉字的降序,若前两个汉字相同则按基本工资的降序建立一个索引标识为zcgzsy,索引类型为唯一索引的结构复合索引 use zgda index on left(职称,4)+str(基本工资,7,2);tag zcgzsy unique descending list 编号,姓名&显示了多少条记录问题:索引文件名是什么?,索引文件的建立,(3)对zgda表中所记录按性别与出生日期的升序建立一个索引标识名为xbcsrqsy,索引类型为候选索引的结构复合索引 use zgda index on 性别+dtoc(出生日期,1)tag;xbcsrqsy candidate list 编号,姓名 use,索引文件的建立,例11(1)对zgda表中的所有性别为男的记录,用基本工资的降序序建立一个索引标识为nangzsy,索引类型为普通索引的复合索引,且索引文件名为gz.cdx(2)对zgda表中的所有记录按基本工资的升序,若基本工资相同再按出生日期的升序建立一个索引标识名为gzrqsy,索引类型为普通索引的复合索引,且文件名为gz.cdx,索引文件的建立,(1)对zgda表中的所有性别为男的记录,用基本工资的降序序建立一个索引标识为nangzsy,索引类型为普通索引的复合索引,且索引文件名为gz.cdx use zgda index on 基本工资 tag nangzsy of gz for 性别=男 descending list 编号,姓名问题:索引关键字、文件名、标识是什么?,索引文件的建立,(2)对zgda表中的所有记录按基本工资的升序,若基本工资相同再按出生日期的升序建立一个索引标识名为gzrqsy,索引类型为普通索引的复合索引,且文件名为gz.cdx use zgda index on str(基本工资,7,2)+dtoc(出生日期,1);tag gzrqsy of gz list 编号,姓名 use,索引文件的建立,4.3.4 索引文件的打开与关闭如何打开索引文件怎样指定索引哪些记录移动命令是针对于索引文件的如何使用索引文件打开索引文件指定索引,索引文件的打开与关闭,索引文件的打开格式1:USE INDEX 功能:在打开指定数据表的同时,打开与之相关的一系列索引文件。格式2:SET INDEX TO 功能:在数据表已打开的情况下,打开与之相关的一系列索引文件。,索引文件的打开与关闭,注意:(1)若中第一个单索引文件,则该单索引文件起作用;中有多个索引文件,但第一个不是单索引文件,则都不起作用(2)中有多个索引文件,则按下列顺序排列索引项:单索引文件结构复合索引文件非结构复合索引,索引文件的打开与关闭,例12(1)打开zgda时,打开单索引文件csrqsy、xbxmsy、非结构复合索引zg.cdx(2)先打开zgda,再打开单索引文件csrqsy、xbxmsy、非结构复合索引zg.cdx(3)如何打开结构复合索引zgda.cdx呢?,索引文件的打开与关闭,(1)打开zgda时,打开单索引文件csrqsy、xbxmsy、非结构复合索引zg.cdx use zgda index csrqsy,xbxmsy,gz list 姓名,出生日期,索引文件的打开与关闭,先打开zgda,再打开单索引文件csrqsy、xbxmsy、非结构复合索引zg.cdx use zgda set index to zg,csrqsy,xbxmsy list 性别,姓名问题:如果复合索引文件中有多个索引,那么哪个索引发生作用呢?如何指定哪个索引发生作用呢?,索引文件的打开与关闭,指定主控索引项格式1:SET ORDER TO ASCENDING|DECENDING格式2:SET ORDER TO ASCENDING|DECENDING格式3:SET ORDER TO TAG ASCENDING|DECENDING 功能:指定主控索引文件或主控标识,单索引文件的索引标识与文件名是相同的.,索引打开与关闭,(1)set order to 或set order to 0命令使当前的主控索引失效(2)不管原索引是升序还是降序,均可以用ASCENDING和DESCENDING对数据表进行重新处理(3)INDEX ON 姓名 TO xm INDEX ON 出生日期 TAG csrq OF zg,索引的建立与关闭,SET INDEX TO xm SET INDEX TO 姓名 SET INDEX TO csrq SET INDEX TO zg SET ORDER TO xm SET ORDER TO TAG xm SET ORDER TO 出生日期 SET ORDER TO TAG csrq SET ORDER TO csrq SET ORDER TO zg,索引建立与关闭,Inde on 姓名 to xmInde on 出生日期;tag csrq of zg并且zg、xm已经打开,例13 执行use zgda index csrqsy,xbxmsy,gz后,回答下面问题,其中gz包含索引nangzsy与gzrqsy,结构复合索引包含zcgzsy与xbcsrqsy两索引,csrqsy与xbxmsy是单索引文件(1)显示记录的姓名与编号,把主控索引指向第二项,显示记录的姓名与编号(2)取消主控索引(3)打开csrqsy.idx,然后显示数据(4)打开gz.cdx,并把主控索引指向gzrqsy,索引打开与关闭,(1)显示记录的姓名与编号,把主控索引指向第二项,显示记录的姓名与编号 List 编号,姓名 Set order to 2 List 编号,姓名,索引打开与关闭,(2)取消主控索引Set order to,索引打开与关闭,(3)打开csrqsy.idx,然后显示数据Set index to csrqsyDisp all 姓名,出生日期,索引打开与关闭,(4)打开gz.cdx,并把主控索引指向gzrqsySet index to gzList 编号,姓名Set order to gzrqsyList 姓名,基本工资,出生日期use,索引打开与关闭,索引项起作用时记录指针的移动 当某个索引项起作用时,记录指针实际上是在该索引项对应的索引表上进行移动,但当明确指定移动到某号记录时例外。如:go top 指向索引表的第一条记录 go bottom 指向索引表的最后一条记录 skip 指向索引表的下一条记录 go 3 指向表文件的第三条记录问题:go top=go 1?,索引打开与关闭S1,例14 打开表文件zgda.dbf,设置主控索引为zcgzsy,并移动记录指针观察结果 use zgda set order to zcgzsy desending go top?recn()skip 2?recn()go bottom?recn()go 5?recn(),索引文件的关闭格式1:CLOSE INDEXES格式2:SET INDEX TO 功能:关闭当前工作区内除了结构复合索引文件之外的所有索引文件。,索引打开与关闭,索引文件的更新 格式:REINDEX(1)打开了的索引文件,当记录更新时记录会自动更新(2)未打开的索引文件(单索引文件、非结构索引文件)不会自动更新,须用reindex更新,4.4 数据表的查询与统计,查找条件查找:Locate for常量查找:Find表达式查找:seek统计求和:sum 求平均:average 统计个数:count,数据表的查询与统计,一般计算:calculate 分类汇总:total on工作区选择工作区:select 表间更新:update onfromreplace 物理连接:join withtofor 逻辑连接:set relation tointo,数据表的查询,条件查询命令格式:LOCATE FOR 功能:查找符合指定条件的第一条记录,并将记录指针指向该记录。(1)找到时,指针定在第一条满足条件的记录处,且Found函数返回真值(2)指定范围时,只范围内查找,格式:CONTINUE 功能:按最近一次LOCATE命令的条件在后续记录中继续查找。注意:只有Locate之后才能用Continue命令,数据表的查询,例15 在zgda中查找职称为高工的男职工,并判断是否找到,若找到显示记录与记录号。use zgda loca for 职称=高工 and 性别=男?found()?recno()list 姓名,职称,性别,数据表的查询,例16 在zgda中找1972出生的职工,并显示其记录 use zgda loca for year(出生日期)=1972?found()list 姓名,出生日期,数据表的查询,常量查询命令格式:FIND/功能:快速查找索引关键字值和所指定的或相匹配的首记录。,数据表的查询,(1)必须建立索引文件,并且打开相应的索引文件,指定主控索引(2)只能字符串或常数进行查找,字串常量可不用定界符(3)用Found函数可以判断是否找到,skip命令可作继续查找(4)与Set exact on/off有关索引表达式只能为数值型或字符型?,数据表的查询,例17 在zgda中用find命令进行查找姓李的,姓张的以及张立功 use zgda copy to zgtmp use zgtmp index on 姓名 to xm set index to xm.idx find 李 set exact on,数据表的查询,find 张?found()find 张立功 disp xm=张立功 find xm&错误 find&xm close indexs use思考:用Find命令查找1972出生的职工.,数据表的查询,表达式查询命令格式:SEEK 功能:快速查找索引关键字值与指定值相符的记录。,数据表的查询,(1)必须建立并打开索引文件,使相应的索引项成为主控索引(2)表达式可以是常量、变量、表达式的值,字符串常量必须带定界符(3)备注型与通用型数据不能查找,(4)找到时,Found函数返回真值,skip继续查找(5)表达式的类型与索引表达式的类型一致,数据表的查询,例18 在Zgda中,用seek查找张立功,查找1971年出生的职工Use zgdaIndex on 姓名 tag xmIndex on year(出生日期)tag nfSet order to tag xm,数据表的查询,Seek“张立功”?found()?recno()dispCsn=1971Set order to nfSeek csnDisp,数据表的查询,多记录求和命令格式:SUM FORWHILE TO 功能:对指定范围内满足条件的记录计算其指定的各个表达式值的和。,数据表的统计,(1)表达式的值应该是数值型的,可以是字段变量、内存变量、常数、函数及其组合;缺省表达式时,为所有数值型字段求和(2)默认的范围是ALL,,数据表的统计,例19 对zgda中所数值型字段求和,并显示出来 use zgda sum to nl,jbgz?”年龄总和为:”,nl?”基本工资总和是:”,jbgz use,数据表的统计,例20 计算zgda中的女性职工的基本工资的总和、女性职工的人数、基本工资的平均值 use zgda sum 基本工资,1 for 性别=“女”to gzzh,rs?”女职工的基本工资总和:”,gzzh?”女职工的人数:”,rs?”妇职工的平均基本工资:”,gzzh/rs use,数据表的统计,2多记录求平均命令格式:AVERAGE FOR WHILE TO 功能:对指定范围内满足条件的记录计算其指定的各个表达式值的平均值。(1)表达式是数值型,缺省时对所有数值型字段求平均(2)默认范围为ALL变量表个数与表达式表个数要匹配,数据表的统计,例21 计算zgda中年龄大于等于35岁的男职工的平均工资,并显示出来 use zgda average 基本工资 for 年龄=35 and 性别=男 to pjgz?”年龄大于等于35岁的男职工的平均工资:”;+str(pjgz,7,2)例22 统计zgda中的年龄平均值,并显示之,数据表的统计,3记录个数统计命令格式:COUNT FOR WHILE TO 功能:统计指定范围内满足条件的记录个数。缺少范围和条件子句时,为所有记录个数(ALL),其计算值等于reccount()的值,数据表的统计,例23 统计zgda中的记录个数 use zgda count to jls?jls?jls=reccount(),数据表的统计,例24 统计zgda中的基本工资超过1000的人数及所占比例 use zgda count to for 基本工资1000 to jbgz?”基本工资超过1000元的人数”+str(jbgz,2,0)?”所占比例:”;+str(100*jbgz/reccount(),5,2)+”%”,数据表的统计,4专用计算命令格式:CALCULATE FOR WHILE TO 功能:对指定范围内满足条件的记录分别计算指定的各个表达式的值。注意:(1)表达式为:sum()、avg()、cnt()、max()、min()、npv()、std()、var()(2)默认范围为ALL,数据表的统计,例25 计算zgda中男职工的平均年龄、总基本工资、平均基本工资 use zgda calculate avg(年龄),avg(基本工资),sum(基本工资)for 性别=男 to pjnl,pjgz,gzzh?”平均年龄:”+str(pjnl,5,2)?”平均基本工资:”+str(pjgz,7,2)?”基本工资总和:”+str(gzzh,8,2),数据表的统计,5记录分类求和命令格式:TOTAL ON TO FORWHILE FIELDS 功能:对当前数据表中指定的数值型字段进行分类求和,并形成汇总数据表。(1)应按关键字排序或索引,关键字是分类的标准(2)Fields 指定求和的数值型字段,否则对全部数值型字段(3)非数值型字段不参与求和,但同类关键字的首记录的值写入分类汇总产生的数据表中,数据表的统计,例26 在zgda表中,分按职称与性别进行分类汇总,产生分类汇总表分别为zchz,xbhz use zgda index on 职称 tag zc index on 性别 tag xb set order to zc total on 职称 to zchz fields 基本工资,数据表的统计,set order to sb total on 性别 to xbhz fields 基本工资 u