第3章查询与统计排序与索引的基本概念索引的建立与查询多工作区及表的关联查询常用统计命令SQL查询命令查询设计器的使用数据库及数据字典视图的概念本章重点第3章查询与统计3.1排序与索引一、排序二、索引三、索引和排序的异同思考题3.2查询命令一、顺序查询二、索引查询3.3数据工作期一、多工作区查询二、数据工作期与视图三、表的关联3.4常用统计命令一、计数命令COUNT二、求和命令SUM三、求平均值命令AVERAGE四、计算命令CALCULATE五、汇总命令TOTAL3.5SQL查询一、SQL命令查询二、JOIN命令三、查询设计器查询3.6数据库与视图一、数据库与数据字典二、视图及其操作本章小结3.1排序与索引一、排序根据表的某些字段重排记录,排序后产生一个新表,其记录按新的顺序排序,原文件不变。命令格式:SORTTO新文件名ON字段名1[/A/D/C][,字段名2[/A/D/C][…]][范围][条件][fields子句]注:不可选用备注型或通用型字段来排序。示例1:SORTTOabcON日期/DFIELDS编号,名称FORNOT主要设备示例2:SORTTOrqxON价格/DFIELDS编号,名称,启用日期SORTTObmxON部门/D,价格FOR主要设备二、索引1、索引的概念1)记录的物理顺序与逻辑顺序2)索引的种类2、索引的建立3、索引的使用1)打开和关闭索引文件2)确定主控索引3)删除索引4)索引的更新二、索引1、索引的概念1)记录的物理顺序与逻辑顺序文件中记录的磁盘存储顺序称为物理顺序。索引不改变文件中记录的物理顺序,而是按某个索引关键字来建立记录的逻辑顺序。在索引文件中,所有关键字值按升序或降序排列,每个值对应原文件中相应的记录的记录号。示例:依据学生姓名对下表排序及索引Record学生姓名指导老师电话1刘小景钱志国56660432蔡娟杨一如56661203马方新吴萌41082194屈达钱志国56660435王成义吴萌4108219原表Record学生姓名指导老师电话1蔡娟杨一如56661202刘小景钱志国56660433马方新吴萌41082194屈达钱志国56660435王成义吴萌4108219排序表Record学生姓名2蔡娟1刘小景3马方新4屈达5王成义索引表可见:虽然排序与索引都以增加一个文件为代价,但索引文件只包括关键字和记录号两个字段,比被索引的表小得多;索引起作用后,增删或修改表的记录时索引文件会自动更新。2)索引的种类a.按扩展名分类:复合索引和单索引两类,扩展名为CDX和IDX。单索引文件只包含一个索引,复合索引文件允许包含多个索引,每个索引都有一个索引标识,代表一种记录逻辑顺序。结构复合索引文件:定义复合索引文件时用户不指定文件名,其主名与表的主名相同,并随表的打开而打开,记录变化时还会自动维护。非结构复合索引文件:定义复合索引文件时用户指定文件名,需使用命令打开。结构复合索引文件的主名与表的主名相同。2)索引的种类b.按功能来分类:索引又分为普通索引、唯一索引、候选索引和主索引四种。A)普通索引:允许关键字重复值;允许有多个B)唯一索引:允许关键字重复值,但输出无重复值;允许有多个C)候选索引:不允许关键字重复值;允许多个D)主索引:不允许关键字重复值;仅1个2、索引的建立命令格式:INDEXON索引关键字TO单索引文件名|TAG索引标识名[FOR条件][ASCENDING|DESCENDING][UNIQUE|CANDIDATE][ADDITIVE]功能:建立索引文件或增加索引标识。示例1:USEsbINDEXON名称TOmcidx&&建立名称升序排列的普通索引型单索引文件INDEXON-价格TOjgidxUNIQUE&&建立价格降序排列的唯一索引型单索引文件思考题:为SB.DBF建立一个结构复合索引文件,其中包括3个索引:(1)记录以价格降序排列,索引标识为普通索引型;(2)记录以部门升序排列,部门相同时则按价格升序排列,索引标识为普通索引型;(3)记录以部门升序排列,部门相同时则按价格降序排列,索引标识为候选索引型。3、索引的使用任何时候只有一个索引文件或一个索引标识起作用主控索引文件:当前起作用的索引文件主控索引:当前起作用的索引标识使用索引:打开表、打开索引文件、确定主控索引文件或主控索引。1)打开和关闭索引文件a.若当前仅有一个索引文件被打开,它就成为主控索引文件。索引文件刚建立时,索引文件呈打开状态且成为主控索引文件。若当前已打开多个索引文件,用命令确定主控索引文件。b.除结构复合索引能随着表的打开而打开外,其它索引文件必须用命令显式打开。c.表关闭时索引文件就随之关闭。打开索引文件命令格式:SETINDEXTO[索引文件表][ADDITIVE]功能:打开当前表的一个或多个索引文件并确定主控索引文件。例如:SETINDEXTOjgidx,mcidx关闭索引文件命令格式:SETINDEXTO(缺省所有选项)功能:关闭当前工作区所有索引文件,并取消主控索引(结构复合索引除外)注:表重新打开时尽管复合索引文件已自动打开,还须确定主控索引2)确定主控索引复合索引文件中当前建立的索引标识自动成为主控索引。命令格式:SETORDERTO[数值表达式|单索引文件|[TAG]索引标识[ASCENDING|DESCENDING]]示例:USEsbINDEXmcidx,jgidxLIST&&记录按名称升序排列SETORDERTOTAGjg&&指定SB.CDX的索引标识JG为主控索引,JG索引序号为3LIST&&记录价格降序排列SETORDERTO1&&指定MCIDX.IDX为主控索引LIST&&记录按名称升序排列SETORDERTO&&取消主控索引文件及主控索引LIST&&记录按物理顺序显示SETORDERTO3&&指定SB.CDX的索引标识JG为主控索引LIST&&记录价格降序排列SETINDEXTO&&关闭所有.IDX文件,取消主控索引3)删除索引命令格式:DELETETAGALL/索引标识…..功能:删除打开的结构复合索引文件的全部索引标识。如:USEsbDELETETAGbmjg14)索引的更新自动更新重新索引命令格式:REINDEX[COMPACT]三、索引和排序的异同1.当排序的关键字只有单个字段名时,两条命令的关键字部分写法完全相同,但若排序的关键字为多个字段名时,在SORT命令中只须将这多个字中依次列出,而在INDEX命令中,则要把它们组合成一个字符表达式。例如:SORTON启用日期TOJ1INDEXON启用日期TOJ11SORTON使用年限/D,价格TOJ2INDEXONSTR(使用年限,2)+STR(价格,9,2)TOJ222.索引排序只能升序排列,如果降序要自行设计表达式,而SORT命令则能方便地对排列的升、降序进行选择。例如:INDEON(-价格)TOJ13.SORT命令中的FIELDS和FOR等可选项可以在排列的同时实现选择与投影操作。而INDEX命令不具备这些功能。4.执行SORT命令后将产生一个新的排序的库文件,而INDEX命令只产生一个索引文件,不改变原来库文件的记录顺序。5.尽管SORT命令排序存在一些方便之处,但执行SORT命令时要求有较大的内存。因此凡索引能解决的问题一般都不用SORT命令解决。思考题:打开表C:\GZML\CZT.DBF,完成以下8条操作:CZT库结构为:BH(C,5),XM(C,6),DW(C,10),JBGZ(N,7,2),JJ(N,6,2),SDF(N,6,2),SFGZ(N,7,2)BZ(M)1、将“DW”为“农学系”的记录复制到“C:\GZML\BF.DBF”2、填写字段“SFGZ”(SFGZ=JBGZ+JJ-SDF);3、将“李丽”的记录删除;4、根据“SDF”按升序排列,保存为“C:\GZML\PX.DBF”;5、在“马玲”的“BZ”字段中填“2000年教育先进工作者”6、根据“DW”建立单索引文件“C:\GZML\SY.IDX”;7、追加新记录,XM=“合计”。3.2查询命令一、顺序查询命令命令格式:LOCATEFOR条件[范围][WHILE条件]CONTINUE功能:搜索满足条件的第一条记录,若找到记录指针指向该记录,否则指向文件结束处。查到记录后,要继续查找必须使CONTINUE命令。示例:CLEARUSEsbLOCATEFOR价格15000ANDNOT主要设备DISPLAYCONTINUE?RECNO(),名称,价格,主要设备CONTINUE&&状态条显示:已到定位范围末尾USE二、索引查询命令依赖二分法算法实现。命令格式:SEEK表达式FIND字符串功能:在已确定主控索引的表中按索引关键字搜索满足表达式值或字符串的第一个记录。若找到则记录指针将指向该记录,否则在主屏幕的状态条中显示“没有找到”。说明:(1)这两条命令都只能对已确定的主控索引的索引关键字进行查询。(2)FIND命令是从形式上检查是否匹配,因此可用于查询字符型与数值型的常量。如果查询对象是一个字符型内存变量X的值,则需对X进行宏代换后,现写入FIND命令中,一般情况下,FIND命令中的字符型常量不需要定界符,除非该字符型常量有前置空格。如,FIND“XYZ”。SEEK命令则是检查表达式的值是否相等,因此在其后出现的形式除常量外,也可以是变量或函数,但在字符型常量上必须加定界符。(3)在使用LOCATE,CONTINUE,SEEK,FIND查询数据时,若查到,FOUND函数就返回.T.,否则返回.F.。(4)对于字符表达式,系统允许模糊查询,即只要字符表达式值与索引关键字值左子串相同,就认为找到。命令“SETEXACTON|OFF”用于设置匹配环境,ON表示完全匹配,用于精确查询;OFF表示模糊匹配,系统默认OFF。运算符==和=有类似的功能,前者表示完全匹配,后者表示模糊匹配。示例1:CLEARUSEsbINDEXON编号TAGbhSEEK038-1&&不可写为:SEEK编号=038-1?RECNO()&&显示:4INDEXON启用日期TAGqyrqsetstrito0SEEK{03/05/90}?FOUND()&&显示.T.,表示找到该日期INDEXON价格TAGjgSEEK1000.00?RECNO(),FOUND()&&除在状态条显示“没有找到示例2:CLEARUSEsbINDEXON编号TAGbhx=038-1FINDx&&执行命令将查找索引关键字值中与x相匹配的记录?FOUND()&&显示:.F.FIND&x&&宏代换出字符型变量的值,执行命令将查找索引关键字值中与038-1相匹配的记录DISPLAY&&显示查到的第一条记录USE示例3:CLEARUSEsbSETORDERTOTAGbhSEEK03&&按编号前两个字符查找?RECNO(),FOUND()&&显示:3.T.SETEXACTON&&设置完全匹配环境SEEK03?FOUND()&&返回.F.SETEXACTOFF&&恢复成模糊匹配环境USE3.3数据工作期数据工作期:用来设置数据工作环境的交互操作窗口。所设置的环境可以包括打开的表及其索引,多个表之间的关联等状态。利用数据工作期来建立环境的优点:(1)直接发命令来建立环境需有一定的经验,而数据工作期窗口对操作有向导作用,显得比较方便。(2)在数据工作期设置的环境可以作为视图文件保存起来,需要时将视图文件打开就能恢复它所保存的环境。一、多工作区查询设备管理使用的4个表:设备表:SB.DBF;增值表:ZZ.DBF设备大修表:DX.DBF;部门代码表:BMDM.DBF;1、工作区:内存中被分配的区域1)工作区号VFP提供了32767个工作区,编号从1到32767。每个工作区只允许打开一个表。反之,一个表只能在一个工作区打开。2)别名:以代号表示工作区前十个工作区可使用1-10或用A、B、...、J十个字母来表示。后者称为工作区的别名。表也