第四章排序查询多表操作

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第五章排序、查询和多表操作5.1排序1、表的排序基本格式:Sorton…To…命令格式:Sorton字段名1[/a][/d][/c],字段名2[/a][/d][/c],字段名3[/a][/d/][/c],...[fields字段名表][范围][for/while条件]TO新文件名功能:对当前表中指定范围内,满足条件的记录,按指定字段升序或降序重新排列,并将排序结果存入新文件中。说明:①排序会产生新表文件,文件名由用户自己定义。原表记录不发生变化。②关键字段可以为N、C、D型,但不能为L、M、G型。排序时如没指定升序还是降序,默认为升序排列③使用多个字段排列时,先按第一个关键字排列,当第一个关键字段相同时再按第二个关键字段排列。以次类推例如1:将入校成绩大于560的男生按照姓名进行排序use学生sorton姓名tosxmfor性别='男'and入校总分560&&单重排序usesxmList例如2:将学生表按照性别排序,如果性别相同的记录按照入校总分来排序use学生sorton性别,入校总分/dtoxbzf&&多重排序,产生文件xbzf.dbfusexbzflist5.2索引(重点)逻辑顺序:主控索引生效时的顺序(排列顺序)物理顺序:表的实际顺序(以记录号为准)(1)索引的分类①单索引文件和复合索引文件单索引文件:包含一个索引项。文件扩展名为.IDX复合索引文件:包含多个索引项。文件扩展名为.CDX②复合索引的分类主索引:不能对自由表建立,只能对数据库中的表建立要求:只能对关键字段建立,一张表只能建一个主索引.关键字段不能为NULL或空值候选索引:加Candidate参数,只能对关键字段建立索引,不包含空字段和NULL字段普通索引:默认唯一索引:加参数Unique,相同的字段值只取第一个。注:①索引在建立时就被打开并且生效。②建立索引的类型可以为N、C、D、L型(2)单索引文件的建立单索引:indexon索引表达式to索引文件名注意:①默认为升序,只有数值型才能降序,前面加-号②单索引文件扩展名为.IDX例如:useXSDAlistindexonyear(出生年月)toNY&&建立非压缩型的单索引文件listINDEXON学号+姓名TOAALIST说明:A、建立非压缩型的单索引文件NY.idxB、建立时NY.idx就打开并生效了C、默认是按照升序进行的,要降序只有N型字段才可以,其它类型要降序的话就只能用复合索引的方法了例:indexon–入校总分torxzf单索引不能使用ascending和descending参数复合索引才能使用ascending和descending参数例2:useXSDAindexon姓名toxmcompact说明:建立压缩的单索引文件xm.idx,文件名自己任取,扩展名默认为IDX(2)复合索引的建立A、结构复合索引命令格式:indexon索引表达式tag索引标识名(索引标识名即是子索引名)useXSDAListindexon姓名tagxmDescListindexon性别+str(入校总分,3)tagxbzfList说明:①产生的CDX文件名与表文件文件名相同(例如:本例产生文件xsda.cdx)②结构复合索引文件可以包含若干个子索引(本例中,xsda.cdx含有两个子索引xm和xbzf)③子索引不以独立文件形式存在④结构复合索引文件随着表的打开而自动打开,但是不确定哪个子索引起作用。B、非结构复合索引的建立命令格式:indexon索引表达式tag索引标识名of文件名use学生Listindexon入校总分tagzfofstu1Listindexon性别+str(year(出生年月))tagxbyearofstu1List说明:产生的CDX文件名由of指定索引文件可以包含若干个子索引索引文件不能随表的打开而自动打开。注意逻辑顺序和物理顺序的使用区别:例如:use学生go3displistnext3indexon姓名toxmgo3listnext3gotopdispgo1disp结构复合索引和非结构复合索引的区别·结构复合索引不需要自己取复合索引文件名,而后者必须取··当打开一个表文件时,结构复合索引自动打开,而后者必须手工打开另外,复合索引可以加ascending表示升序,descending表示降序3、索引文件的使用和删除(1)打开索引文件索引三种状态:未打开、打开未起效、打开并起效①随表打开而打开:例如:use学生indexzf,stu1(打开了三个文件,还有学生.dbf)use学生indexstu1,zf(现在没有索引起效)use学生indexstu1ordertagxbyearofstu1②表打开后再打开索引文件命令:SETINDEXTO索引文件名表[ADDITIVE]例如use学生setindextozf③在建立索引文件的同时,就打开了索引文件(2)设置主控索引setorderto数值….下面看看order的用法:首先按照打开索引文件时单索引文件名称的排列顺序进行编号,再按照结构复合索引文件中索引标记建立的顺序编号,最后再按照非结构复合索引文件中的索引标记建立的顺序编号。例如:use学生indexstu1,xsyear,zfsetorderto1(顺序为:xsyear、zf、学生.cdx中的xm、学生.cdx中的xbjk、stu1.cdx中的zf、stu1.cdx中的xbyear)setordertotagzfofstu13、更新索引命令:REINDEX说明:在更新索引只前,应打开表文件和相应的索引文件。4、关闭索引文件(1)关闭当前索引文件:SETINDEXTO(2)关闭所有索引文件:CLOSEINDEX(3)关闭表文件的同时,关闭索引文件:USE5、删除索引标识DELETETAGALLDELETETAG[索引标识]逻辑顺序和物理顺序的理解:逻辑顺序:主控索引生效时的顺序(排列顺序)物理顺序:表的实际顺序(以记录号为准)注意:范围参数中,recordn是物理顺序,rest和nextn是逻辑顺序条件参数是逻辑顺序gotop和gobottom:逻辑顺序go数字:物理顺序skip数字:逻辑顺序例如:use学生indexon姓名toxmgo4listrestgo2skip2dispgotopdisp5.3查询查询分为两类:顺序查询(条件查询)和索引查询顺序查询:就是从第一条开始找,顺着记录从上到下的顺序一条一条的寻找,找到就停止命令:Locate(continue为继续查询)注意:如果事先打开并确立了主控索引,那么locate也可以使用,不过是按照逻辑顺序进行索引查询:是在索引文件建立并且打开成为主控索引的前提下的查询,找到就停止命令:seek或find注意:查询的作用是定位在满足条件的记录上,然后可以对该记录进行诸如显示\替换\编辑修改\删除等操作。而我们前面学习的LIST和DISP命令就只能显示满足条件的记录。涉及函数:found(),EOF(),recno()1、条件查询(可以使用索引,也可不用)(1)查询命令:LOCATE[范围][FOR条件]|[WHILE条件]功能:从指定范围内查找满足条件的第一条记录,并将记录指针定位在该条记录上。说明:此命令只将记录指针定位在符合条件的第一条记录上,不会显示查找到的记录内容。特别:如果使用索引,那么也是从第一条(逻辑第一条)开始向下查找,而不是物理记录号为1的开始查找。例1:查找非三好生女生的记录USE学生LIST&&list执行后,记录指针是指向文件尾?eof()&&结果为:.t.LOCATEFOR性别=“女”ANDNOT三好生?found(),eof(),reccno()说明:如果找到了:EOF()就会为.F.,Found()就会为.T.Recno()为当前找到的记录号,disp就会显示出找到的记录如果没找到:EOF()就会为.T.,Found()就会为.F.Recno()为最后一条记录号+1,disp就不会显示任何信息例2:查找20号出生的同学的记录USE学生LOCATEFORDAY(出生年月)=20&&查找第一个20号出生的同学(2)继续查询命令:CONTINUE功能:与LOCATE命令连用,继续查找LOCATE命令指定条件的记录。说明:此命令必须用在LOCATE命令之后。每执行一次CONTINUE命令,将继续查找下一个符合条件的记录。例3:查找所有姓李的同学UsexsdaLocateforleft(姓名,2)=“李”DISPCONTINUEDISP……思考:例4:查找入校总分大于570分的所有男生:use学生locatefor性别=’男’and入校总分570dowhilenoteof()iffound()dispcontinueendifenddo2、索引查询要点:必须先打开索引并确认相应的主控索引后才能使用seek和find从逻辑的第一条记录开始查询,只能找到一条满足条件的记录,然后可以通过skip找到下一条(1)FIND命令命令:FIND字符常量|数值型常量功能:在打开的索引文件中查找索引关键字与所要查找的值相匹配的第一个记录,并将记录指针定位在该记录上。说明:FIND命令只能对已建立并打开的索引文件进行查询。与SKIP命令搭配继续查找。例1:查找入学成绩为579的同学USE学生indexon入学成绩tagcjfind579?found()DISP例2:查找所有的女生USEUSE学生indexon性别tagxbFind女?found()DISPSKIPDISP……(2)SEEK命令命令:SEEK表达式说明:SEEK命令可以查找的类型有C、N、D、L。在书写时必须严格按照各类型的书写格式书写例1:查找入学成绩为579的同学USE学生indexon入学成绩tagcjSEEK579&&和FIND用法相同?found()DISP例2:查找三好生USE学生indexon三好生TAGSHSSEEK.T.&&该命令不能用FIND替换,FIND不能查找逻辑型DISP例3:查找1984年8月12日出生的学生use学生indexon出生年月tagcsnyseek{^1984/08/12}此例不能用find,如果想使用的话要修改成:use学生indexondtoc(出生年月)tagcsfind08/12/84使用seek:seek“08/12/84”如果使用Locate查询:use学生locatefor出生年月={^1984/08/12}例4:查询叫汪海的人。如果已经对姓名建立了索引xm.idx,就直接使用:useXSDAindexxmseek‘汪海’&&此句也可以改成find汪海?found()disp如果事先没有对姓名建立索引,可以先建立再使用usexsdaindexon姓名toxmseek“汪海”?found()disp或者usexsdaindexxmname=“汪海”seekname?found()disp例5:查找1983年出生的人:usexsdaindexonyear(出生年月)tocsseek1983?found()disp例6:SEEK多条件查询:(非重点,了解)使用多重索引完成例如:查询叫汪海的男生use学生indexon姓名+性别toNBseek‘汪海’+‘男’&&注意:姓名字段宽度为8,汪海只有4个字节,不足要加空格?found()disp5.4统计与汇总1、计数命令COUNT格式:COUNT[范围][FOR条件][WHILE条件][TO内存变量]功能:统计当前表中指定范围内满足条件的记录个数,并存于内存变量中。说明:默认的范围是ALL。若使用任选项TO内存变量可选项,可将统计的结果送到内存变量中保存,否则将统计结果显示在屏幕上(SETTALKON)。例1:统计三好生的人数USE学生COUNTFOR三好生TOA?A思考:统计入校总分在580以上的人数例2:统计全班82的女同学人数counttoxforyear(出生年月)and性别=’女’2、求和命令SUM格式:

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功