1.24k likes | 1.39k Views
第三章. 查询与统计. 本章要点. 表记录的排序与索引. 表记录的查询. 统计与汇总. SELECT-SQL 查询. 表的关联. 数据库与视图. ⑴ 排序. 新表文件 (.DBF). 单索引 (.IDX). ⑵ 索引. 复合索引 (.CDX). 3.1 排序与索引. 要 点. 3 . 1 . 1 几个基本概念. ☆ 物理顺序:记录在表文件中的实际排列次序。此顺序在输入记录时已确定,即等于记录号。. ☆ 逻辑顺序:对于一打开表文件,若有主控索引存在,则表文件中的记录将按主控索引中的顺序展现,供用户使用。记录在主控索引中的顺序称为记录的逻辑顺序。.
E N D
第三章 查询与统计
本章要点 表记录的排序与索引 表记录的查询 统计与汇总 SELECT-SQL查询 表的关联 数据库与视图
⑴排序 新表文件(.DBF) 单索引(.IDX) ⑵索引 复合索引(.CDX) 3.1 排序与索引 要 点
3.1.1 几个基本概念 ☆物理顺序:记录在表文件中的实际排列次序。此顺序在输入记录时已确定,即等于记录号。 ☆逻辑顺序:对于一打开表文件,若有主控索引存在,则表文件中的记录将按主控索引中的顺序展现,供用户使用。记录在主控索引中的顺序称为记录的逻辑顺序。 ☆使用顺序:实际展现给用户,供用户使用的记录称为记录的使用顺序。有主控索引存在时,记录的使用顺序等于其逻辑顺序;否则,等于其物理顺序。
3.1.1 几个基本概念 ☆首记录和末记录 在使用顺序中处于第一位的记录称为首记录,处于最后一位的记录称为末记录。 ☆记录指针的自动移动及范围项 在执行一些命令时,指针会自动地移动,这种移动是按记录的使用顺序进行的。因而,命令中的范围项也是以使用顺序为基础的。
3.1.2排序 排序: 根据表的某些字段重排记录。排序后将产生一个新表(.dbf),其记录按新的顺序排序,但原表文件不变。 [格式]:SORT TO <新表> ON <字段1>[/D][/C] [,…] [<范围>][FOR<条件>][WHILE<条件>][FIELDS<字段名清单>|FIELDS LIKE<通配字段名>|FIELDS EXCEPT<通配字段名>] [功能]:按指定的排序关键字<字段名1>、<字段名2>…对当前表文件进行排序,生成一新表文件。 [说明] /A – 按升序排序(默认方式) /D – 按降序排序 /C – 不区分英文字母的大小写
排序命令举例 例1 按“单价”升序排序,产生新表SB1。 USE SB SORT ON 价格 TO SB1 USE SB1 LIST 例2 按“启用日期”降序排序,只包括编号,名称和启用日期三个字段,产生新表SB2。 USE SB SORT ON 价格/D TO SB2 FIELDS 编号,; 名称,启用日期 USE SB2 LIST 要 点 两个字段的排序???
排序命令举例 例3 将主要设备按编号降序排序, 产生新表SB3。 USE SB SORT TO SB3 ON 编号/D FOR 主要设备 USE SB3 LIST 要 点 注意:排序生成的新表文件是原表文件的部分或全部,只是记录顺序是有序的。因此,使用排序命令生成的排序文件会占用大量的磁盘空间。
3.1.3 索引 1、索引概述:表索引是一个列表,它建立了索引表达式与记录号的一种对应关系,并可按索引表达式排序查找相应的记录。 对同一个表可以建立多个索引,每一个索引代表一种处理记录的顺序,但在任何时刻,最多只有一个索引起作用,这个索引称为主控索引。 要 点
索引的组成 通常情况下,每一个索引都包含两部分: (1)索引关键字表达式:它是用来创建索引的标准,可以是表中的某个特定字段、变量、函数各项的组合表达式。 (2)索引标识:它就是索引的名称,以字母或下划线开头,以字母、数字和下划线组成,不能超过10个字符。
索引的分类 (1)按扩展名分类 ,索引文件的类型: (1)单索引文件(.IDX) (2)复合索引文件(.CDX) (2)按功能来分类 ,P71 表3.1 普通索引:允许关键字重复值 唯一索引:允许关键字重复值,但输出无重复值 候选索引:不允许,输入重复值将禁止存盘 主索引: 不允许,输入重复值将禁止存盘 * 只有结构复合索引文件才有候选型索引。 ** 只有数据库表文件才有主索引。
建立单索引文件 INDEX ON <索引关键字> TO <索引文件> [FOR<条件>][COMPACT][UNIQUE][ADDITIVE] 单索引文件 要 点 ADDITIVE表示建立本索引文件时并不关闭先前打开的索引文件。
单索引文件建立举例 例1 按“价格”升序建立索引文件SBJG1。 USE SB INDEX ON 价格 TO SBJG1 例2 按“价格”降序建立索引文件SBJG2。 USE SB &&由于SB并没有关闭,此句可省略 INDEX ON -价格 TO SBJG2 要 点 例3 按“名称”升序建立索引文件SBMC USE SB INDEX ON 名称 TO SBMC LIST
纪录号 名称 1 车床 2 车床 6 复印机 7 轿车 5 磨床 5 微机 4 钻床 索引示意图
复合索引文件可包含多个索引,每个索引 都有一个索引标识,代表一种记录逻辑顺序。 (1)建立复合索引文件 INDEX ON <索引关键字> TAG <索引标识> [OF <索引文件名>] [ADDITIVE] [ASCENDING/DESCENDING] ☆TAG子句则用于建立复合索引文件及索引标识,或增加索引标识。 ☆OF子句用于指定非结构复合索引文件的名字。 复合索引文件 要 点
复合索引举例 建立复合索引文件SB.CDX,其中包括2个索引标识。 USE SB INDEX ON 价格 TAG JG DESCENDING LIST INDEX ON 部门+STR(价格,9,2) TAG JG1 LIST CLOSE INDEXES LIST
复合索引举例 向SB.CDX中添加索引标识:bmjg1:索引表达式计算后升序排列,当部门相同时,价格按降序排列 INDEX ON VAL(部门) -价格/1000000 TAG bmjg1 CANDIDATE LIST
复合索引举例 向SB.CDX中添加索引标识:bmjg2: 索引表达式运算后降序排列,当部门 相同时,价格按升序排列 INDEX ON VAL(部门)-价格/1000000 TAG bmjg2 CANDIDATE DESCE LIST 按记录的物理顺序显示SB表文件的记录 SET ORDER TO LIST
索引的使用 用户利用索引查询记录,必须同时打开表文件与索引文件。 一个表可以打开多个索引文件,但任何时候只有一个索引文件能起作用,同一个复合索引文件中也可能包含多个索引标识,在复合索引文件中也只有一个索引标识能起作用。当前起作用的索引文件称为主控索引文件,当前起作用的索引标识称为主控索引。 使用索引查询记录的步骤:☆打开表;☆打开索引;☆确定主控索引文件或主控索引。
(1)打开和关闭索引文件 除结构复合索引文件能随着表的打开而打开外,其它索引文件必须用命令显式打开。 打开单索引文件 USE <表文件名> INDEX <索引文件名表> SET INDEX TO <索引文件名表>[ADDITIVE] ☆ <索引文件名表>中第一个索引文件为主控索引文件 ☆若缺省ADDITIVE选项,则在本命令打开索引文件时,除结构复合索引文件以外的索引文件均被关闭。 ☆若缺省所有选项(即只有SET INDEX TO),将关闭当前工作区中除结构复合索引文件外的所有索引文件,同时取消主控索引。
确定主控索引 复合索引文件中当前建立的索引标识自动成为主控索引; 表重新打开时,尽管复合索引文件已自动打开,但须确定主控索引。 命令格式:SET ORDER TO [<数值表达式>| <单索引文件名>|[TAG]<索引标识 >[ASCENDING|DESCENDING]]
确定主控索引 说明: ☆<数值表达式>表示已打开索引的序号,该序号用来指定主控索引文件或主控索引。系统先为各单索引文件编号,故结构复合索引文件的序号比单索引文件大。 ☆<单索引文件名>指定该单索引文件为主控索引文件。 ☆<索引标识>指定该索引标识为主控索引。 ☆SET ORDER TO或SET ORDER TO 0命令取消主控索引文件及主控索引,表中记录将按物理顺序输出。
(1)删除复合索引标识(文件) DELETE TAG <索引标识名表>|ALL 删除已打开的复合索引文件中的索引标 识。 选择ALL或者复合索引文件的所有索引标识都被删除,则该索引文件也被删除。 (2)用ERASE命令删除索引文件,注意须先关闭后删除。 ERASE 文件名.CDX 注意:ERASE命令是删除文件命令。 删除索引 要 点
删除索引举例 删除复合索引标识。 USE SB DELETE TAG JG SET ORDER TO JG1 LIST DELEET TAG ALL DIR *.CDX 删除索引文件: SET INDEX TO ERASE SBJG2.IDX
显示 表设计器 索引 索引的查看 要 点
3.2 查询命令 (1)顺序查询命令 LOCATE FOR …… …… CONTINUE (2)索引查询命令 FIND SEEK (3)查询测试函数FOUND() 要 点
顺序查询命令 格式:LOCATE FOR <条件> [<范围>] [WHILE <条件> ] 功能:从表头向表尾方向搜索表中满足条件的第一个记录。当找到后,记录指针就指向该记录,FOUND()=.T.;若表中无此记录,记录指针则指向文件结束标记处, FOUND()=.F.状态栏中显示“已到定位范围末尾”。 顺序查询是按照给定的条件在指定的范围内从头到尾查找记录,顺序查询速度较慢,适用于记录数较少的表。 顺序查询命令包括LOCATE与CONTINUE两条命令。 要 点
顺序查询命令 说明: ★缺省<范围>表示ALL。 ★如果需要继续查找满足相同条件的下一条记录,则必须使用CONTINUE命令来实现。 格式:CONTINUE ★函数FOUND( )用于测试是否找到查找的记录 。 若找到,则返回真值,没有找到,则返回假值。 ★没有找到记录时,EOF( )函数的状态与<范围> 选项有关。
例1 从表SB中查找1992启用的设备。 LOCATE FOR YEAR(启用日期)=1992 DISPLAY CONTINUE DISPLAY 例2 查找表SB中其价格大于6万元的设备。 LOCATE FOR 价格>60000 DISPLAY CONTINUE DISPLAY 顺序查询命令举例 要 点
3.2.2 索引查询命令 索引查询依赖二分查找来实现。二分查找也称折半查找,其原理为:每次取中心记录,比较其键值Km与所找记录Ki的键值,若Km>Ki ,则舍弃后一半记录,取前一半记录重复折半过程;否则类似地取后一半记录,一直到发现所找记录或无法再折半为止。 由此可见,索引查询速度很快,但其算法要求表的记录是有序的,这就需事先对表进行索引或排序。 索引查询可使用SEEK与FIND两条命令,而FIND命令是为了与旧版本兼容而保留的。
索引查询命令 格式:SEEK <表达式> FIND <常量> 功能:在索引文件中查找索引关键字段 与指定的<表达式>相匹配的第一条记录。若 找到,记录指针就指向该记录;若没找到, 则显示“没有找到”。 SEEK命令中的<表达式>可以是字符型、 数值型、日期型和逻辑型。如果是字符型, 则必须用定界符括起来。 要 点
USE SB INDEX ON 名称TO SYY1 SEEK “车床” DISPLAY FIND车床 DISPLAY INDEX ON 启用日期TO SYY2 SEEK {^1992/01/15} DISPLAY 通过单索引文件来查询 要 点
USE SB INDEX ON 价格TO SYY3 SEEK 8810 (或 FIND 8810) DISPLAY SEEK 10000 (或 FIND 10000) INDEX ON 主要设备TO SYY4 SEEK .T. DISPLAY 通过单索引文件来查询 要 点
USE SB INDEX ON 名称TAG MC INDEX ON 启用日期TAG RQ INDEX ON 价格TAG JG INDEX ON 主要设备TAG ZY 通过复合索引文件来查询 要 点 SEEK .T. SET ORDER TO MC SEEK “车床” SET ORDER TO RQ SEEK {^1992/01/15} SET ORDER TO JG SEEK 8810
例1 函数FOUND()的使用。 USE SB LOCATE FOR 名称=“车床” ?FOUND(),RECNO() DISP CONTINUE ?FOUND(),RECNO() INDEX ON 部门 TO BM SEEK “22” ?FOUND(),RECNO() FOUND( )函数使用举例 要 点
(1)计数命令—COUNT (2)求和命令—SUM (3)求平均值命令—AVERAGE (4)财务统计命令—CALCULATE (5)分类统计—TOTAL 3.3 统计汇总 要 点
计数命令COUNT 【格式】 COUNT [<范围>] [FOR <条件>][TO <内存变量名>] 【功能】 在当前表中的指定范围内,统计满足给定 条件的记录个数。 【说明】 ①统计结果显示在主窗口的状态条中。 ②缺省<范围>表示ALL。 要 点
例1 USE SB COUNT TO A ?A 例2 USE SB COUNT FOR 价格>10000 TO W ?“W=”,W 例3 USE SB GO 3 COUNT REST FOR 主要设备 计数命令COUNT使用举例 要 点
求和命令—SUM 【格式】 SUM [<范围>] [<字段名表>] [FOR <条件>] [TO <内存变量名> | TO ARRAY <数组名>] 【功能】 对当前表中满足指定条件的记录的数值型字段求和。 要 点 【说明】 ★<数值表达式表>中各表达式的和数可依次存入<内存变量名表>或数组。缺省该表达式表,则对当前表所有的数值表达式分别求和。 ★缺省<范围>项,指ALL。
SUM命令举例 创建货物表结构: CREATE TABLE HW(货名 C(10),产地 C(6),;单价 N(4,0),数量 N(2,0),总价 N(6,0)) 输入4个记录: INSERT INTO HW(“22英寸彩电 ”,“天津 ”, ; 1100, 5 ,数量*单价) INSERT INTO HW(“25英寸彩电 ”,“北京 ”, 1300 , 10 , 13000 ) INSERT INTO HW(“29英寸彩电 ”,“西安 ”, 2000 , 5 , 10000 ) INSERT INTO HW(“25英寸彩电 ”,“天津 ”, 1300 , 4 , 5200 )
SUM命令举例 分别求出数量和总价之和 注意状态条显示4条记录已求和 SUM 数量,总价 屏幕显示:数量总价 24.0033700.00 求出25英寸彩电的总价之和,并把结果存入ZJ25 SUM 总价FOR 货名=’ 25英寸彩电’TO ZJ25 屏幕显示:总价 注意状态条显示2条记录已求和 18200.00 ? ZJ25 18200.00
例3 USE SB SUM TO A ?A 求和命令SUM使用举例 请问:变量A存放的是?的和 要 点 例4 USE SB SUM FOR 主要设备 SUM FOR NOT 主要设备 例5 USE SP SUM SUN 数量 FOR “公司”$ 生产单位
求平均值命令—AVERAGE [格式] AVERAGE [<范围>] [<字段名表>] [FOR <条件>] [TO <内存变量名> | TO ARRAY <数组名>] [功能] 对当前表中指定范围内满足指定条件的记录的数值型字段求算术平均值。 要 点 ★该命令的选项说明与SUM命令相同。
例1 USE SB AVERAGE TO S ?S 例2 USE HW AVERAGE AVERAGE FOR 产地=“天津” 求平均值命令AVERAGE使用举例 要 点
计算命令—CALCULATE [格式] CALCUATE <函数名表> [<范围>] [FOR <条件>] [TO <内存变量名表> | TO ARRAY <数组名>] [功能] 对当前表中的字段进行财务统计,其计算 工作主要由<函数名表>中的函数来完成。 [说明] <函数名表>中至少必须包含8个规定函数之 一。若用了多个函数,相互之间用逗号分隔。 要 点
CALCULATE命令常用的5个函数 要 点 注:CNT( )或COUNT( )的括号内可以写上字段名称。
CALCULATE命令使用举例 例1 USE HW CALC CNT() TO YY CALC SUM(数量), AVG(数量) CALC MAX(单价), MAX(总价) CALC MIN(产地), MIN(货号) 要 点 例2 USE SB CALC CNT() FOR 主要设备 TO Y1 CALC SUM(价格) FOR !主要设备 TO Y2 CALC AVG( ) TO Y3
分类统计—TOTAL [格式] TOTAL TO <文件名> ON <关键字> [FIELDS <数值型字段表>] [<范围>][FOR <条件>] 要 点 [功能] 对当前表中的数值型字段按关键字段进行分类求和,并将结果存入一个新表。一组关键字值相同的记录在新表中产生一个记录。 [说明] ★原表必须事先按关键字进行排序或索引。★<数值型字段名清单>列出分类求和的字段名,缺省此项,则对表文件中所有的N型字段汇总。
USE DX INDEXON 编号TAG bh TOTAL ON编号TO bhhz FIELDS费用 USE bhhz BROWSE FIELDS编号,费用 TITLE “大修费用汇总表” TOTAL命令使用举例 例1:在DX.DBF中按设备的编号来汇总大修费用. 要 点 例2:在HW.DBF中按产品的货号来汇总. USE HW INDEX ON 货名TAG hh TOTAL ON 货名TO hhhz USE hhhz LIST
3.4 SELECT-SQL查询 • 用SQL命令直接查询 SELECT-FROM[-WHERE] • 用查询设计器建立查询 打开查询设计器 查询设置 执行查询问 保存查询设置 3. 查询结果的图形处理 要 点