1、第四章 查询与统计,本 章 要 点,4.1 表的排序 4.2 表的索引 4.3 查询命令 4.4 数据表的统计 4.5 多表同时操作,排序 是从物理上对表进行重新整理,按 照指定的关键字段 来重新排列表中数据记录的顺序,并产生一个新的表文件。由于新表的产生即费时间也浪费空间,实际中很少用。,4.1 表 的 排 序,【格式】SORT TO ON /A | /D /C , /A | /D /C . ASCENDING | DESCENDING FOR WHILE FIELDS 【功能】对当前打开的表,按指定的字段进行排序,生成新的表文件。,表的排序,生成的排序文件也是一个数据库文件。范围、条件的含
2、义同COPY TO命令。用作排序的字段的数据类型允许是N、C、D、L型。/A 表示升序 /D 表示降序 /C 表示不区分大小写当有多个关键字段时,先按字段1的值排列,其值相同的,再按字段2的值排列。【例】将Spxx.DBF按商品编号进行降序排列USE SpxxSORT TO STUD2 ON 商品编号/D,1索引及索引文件的概述索引是以索引文件的形式存在的,它根据指定的索引关键字表达式建立的。索引文件可以看成索引关键字的值与记录号之间的对照表,关键字可以是一个字段,也可以是几个字段的组合。 索引文件必须与原表一起使用。这样的查找方式使顺序查找和随机查找都有较高的效率。打开索引文件时,将改变表中
3、记录的逻辑顺序,但并不改变表中记录的物理顺序。一个表文件可建立多个索引文件,也可同时打开多个索引文件,但在同一时间内只有一个索引起作用,这个索引称为主控索引。,4.2 表的索引,Visual FoxPro系统中支持两种不同的索引文件类型,即单索引文件和复合索引文件。单索引文件是根据一个索引关键字表达式(或关键字)建立的索引文件,文件扩展名为.IDX。复合索引文件是指索引文件中可以包含多个索引标识的扩展名为.CDX。每一个索引标识均有一个特殊的标识名(TAG)。,复合索引文件有两种:一种是独立复合索引文件;另一种是结构复合索引文件。结构复合索引文件与相应的表文件同名,扩展名为.CDX。当Visu
4、al FoxPro打开一个表时,便自动查找一个结构复合索引文件,如果找到便自动打开,该索引文件随表文件同时打开和同时关闭。 独立复合索引文件不与表文件同名,扩展名为.CDX。 索引可分为下列四种类型: (1)主索引 主索引是一个永远不允许在指定字段和表达式中出现重复值的索引。每一个表只能建立一个主索引,只有数据库表才能建立主索引。,(2)侯选索引侯选索引也是一个不允许在指定字段和表达式中出现重复值的索引。数据库表和自由表都可以建立侯选索引,一个表可以建立多个侯选索引。主索引和侯选索引都存储在.CDX结构复合索引文件中,不能存储在独立复合索引文件和单索引文件中。 (3)唯一索引系统只在索引文件中
5、保留第一次出现的索引关键字值。数据库表和自由表都可以建立唯一索引 (4)普通索引是一个最简单的索引,允许关键字值的重复出现,适合用来进行表中记录的排序和查询,也适合于一对多永久关联中“多”的一边(子表)的索引。数据库表和自由表都可以建立普通索引。,普通索引和唯一索引可以存储在.CDX独立复合索引文件和.IDX单索引文件中。 2索引文件的建立 (1)命令方式 【格式】INDEX ON TO | TAG OF FOR ASCENDING | DESCENDINGUNIQUE ADDITIVE 【功能】对当前表文件按指定的关键字建立索引文件。 【说明】:指定建立索引文件的关键字表达式,可以是单一字段
6、名,也可以是多个字段组成的字符型表达式,表达式中各字段的类型只能是数值型、字符型和日期型和逻辑型。,TAG :此选项只对建立复合索引文件时有效,指定建立或追加索引标识的标识名。 OF :指定独立复合索引文件名。若有此选项,表示在指定的独立复合索引文件中追加一个索引标识,若指定的独立复合索引文件不存在,系统将自动建立指定的文件。 FOR :表示只对满足条件的记录建立索引。ASCENDING|DESCENDING: ASCENDING表示按升序建立索引,DESCENDING表示按降序建立索引。缺省时,按按升序建立索引。单索引文件不能选用DESCENDING选项。,UNIQUE:表示建立的是唯一索引
7、。 ADDITIVE:表示保留以前打开的索引文件。否则,除结构复合索引文件外,以前打开的其他索引文件都将被关闭。【例】对Spxx.DBF表文件建立商品编号单索引文件STUD.IDX。 USE Spxx INDEX ON 商品编号 TO STUD 【例】对表文件Spxx.DBF,建立一个基于商品编号字段的结构复合索引文件。 USE Spxx INDEX ON 商品编号 TAG tspbh DESCENDING,【例】在表文件Spxx.DBF的结构复合索引文件中,按类别和零售价各追加一个标识。USE SpxxINDEX ON 类别 TAG tlb INDEX ON 零售价 TAG tlsj,(2)
8、菜单方式 打开表文件。 选择【显示】|【表设计器】命令,打开表设计器对话框,选择“索引”标签。 在索引名中输入索引标识名,在类型的下拉列表框中确定一种索引类型,在表达式中输入索引关键字表达式,在筛选中输入确定参加索引的记录条件,在排序序列下默认的是升序按钮,单击可改变为降序按钮。 注意:用表设计器建立的索引都是结构复合索引文件。,3索引文件的打开 【格式1】USE INDEX ORDER | | TAG OF ASCENDING | DESCENDING 【功能】打开指定的表文件及相关的索引文件 【说明】:如果中的第一个索引文件是单索引文件,则它是主索引文件,若第一个索引文件是复合索引文件,则
9、表文件的记录将以物理顺序被访问。 :指定要打开的索引文件,索引文件中的文件扩展名可以省略,但如果存在同名的单索引文件和复合索引文件,必须带扩展名。,ORDER子句:指定主索引。选择此选项时,主索引文件将不是中的第一个单索引文件,而是此选项指定的单索引文件或标识。ORDER子句中各选项的含义如下: 指定主索引的编号,若的值为0,表示不设主索引。 指定的单索引文件设置为主索引。 TAG OF :表示将中的指定标识作为主索引。OF 缺省表示为结构复合索引文件。, ASCENDING | DESCENDING:表示主索引被强制以升序或降序索引;缺省此选项,主索引按原有顺序打开。 【格式2】SET IN
10、DEX TO ORDER | | TAG OF ASCENDING | DESCENDINGADDITIVE 【功能】在已打开表文件的前提下,打开相关索引文件。 【说明】ADDITIVE:表示保留以前打开的索引文件。否则,除结构复合索引文件外,以前打开的其他索引文件都将被关闭。 4索引文件的关闭 【格式1】USE 【功能】关闭当前工作区中打开的表文件及所有索引文件。,【格式2】SET INDEX TO 【功能】关闭当前工作区中打开的所有单索引文件和独立复合索引文件。 【格式3】CLOSE INDEXS 【功能】关闭当前工作区中打开的所有单索引文件和独立复合索引文件。 注意:结构复合索引文件不能
11、用以上命令关闭,它随表文件的打开而打开,随表文件的关闭而关闭。 5改变主索引 【格式】SET ORDER TO | | TAG OF IN | ASCENDING | DESCENDING 【功能】重新指定打开的索引文件中的主索引。 【说明】的值为指定主索引的编号。,如果的值为0或缺省,则恢复表文件的原始顺序,使所有打开的索引文件都无效。 【例】打开Spxx.DBF表文件及其相关索引文件,并指定结构复合索引文件中的商品名称为主控索引。USE Spxx INDE Spxxsy ORDER TAG 商品名称 【例】打开Spxx.DBF表及其相关索引文件,改变主索引文件。USE Spxx INDEX
12、 SpxxSET ORDER TO 商品名称SET ORDER TO & 使所有索引均无效 6索引文件的更新当表中的记录被修改时,系统会自动地更新所打开的索引文件,及时反映数据的变化。对于没有打开的索引文件,索引不能自动更新。为避免使用旧的索引文件导致错误,应该使用重新索引命令更新已经建立的索引文件。,(1)命令方式 【格式】REINDEX 【功能】重新建立已索引过的索引文件。【例】将表Spxx.DBF的索引文件重新索引。USE SpxxSET INDEX TO SpxxREINDEX (2)菜单方式,7索引的删除 (1)标识的删除 【格式】DELETE TAG OF , OF . 或:DEL
13、ETE TAG ALL OF 【功能】从指定的复合文件中删除标识 【说明】OF :指定复合索引文件名,若缺省,则为结构复合索引文件。 (2)单索引文件的删除,对表记录的查询系统提供了两类查询命令:顺序查询和索引查询。查询操作实际上就是起到了条件定位的作用。,4.3 查 询 命 令,1. 顺序查询 【格式】LOCATE FORWHILE 【功能】在表指定范围中查找满足条件的记录。 【说明】LOCATE 命令在表指定范围中查找满足条件的第一条记录。 :表示所需满足的条件。:指定查找范围,缺省时为ALL,即在整个表文件中查找。 找到第一条满足条件的记录后,记录指针指向该记录,并将函数FOUND()(
14、用于检测是否找到满足条件的记录)置为.T.;否则,记录指针指向的底部或文件结束标志,并且将函数FOUND()置为.F,并在状态栏给出提示信息“已到定位范围末尾”。,顺序查询,如果没有打开索引文件,查找按记录号顺序进行。若打开了索引,查找按索引顺序进行。该命令的最大特点是可以在没有进行排序或索引的无序表中进行任意条件的查询,这是索引查询做不到的,但在大型表中查询速度和效率也是最低的。 CONTINUE命令:LOCATE找到第一条满足条件的记录后,可以用CONTINUE继续查找下一个满足条件的记录。 CONTINUE命令必须在LOCATE命令之后使用。 【例】在Spxx.DBF中查找商品编号为16
15、0003的商品记录。USE SpxxLOCATE FOR 商品编号=160003,2. 索引查询(FIND、SEEK)LOCATE命令用于按条件进行顺序定位,无论索引文件是否打开都可使用。在打开索引文件后,还可以用FIND、SEEK命令进行快速检索。,索引查询(FIND、SEEK),1FIND命令 【格式】FIND / 【功能】在表文件的主控索引中查找关键字值与或相匹配的第一个记录。 【说明】必须打开相应的库文件、主索引文件。查询字符型内存变量,必须使用宏替换。【例】打开表文件Spxx.DBF,查找商品名称含有“万胜”的记录。USE SpxxSET ORDER TO 商品名称FIND 万胜,2
16、SEEK命令 【格式】SEEK 【功能】在表文件的主索引中查找关键字值与值相匹配的第一个记录。 【说明】SEEK命令可以查找字符型、数值型、日期型、逻辑型表达式的值。,内存变量可以直接进行查询,不用进行宏替换。表达式为字符串时,必须用定界符括起来。日期常量也必须用大括号括起来。【例】用SEEK命令在Spxx.DBF中查找记录。SET ORDER TO 商品名称SEEK “统一鲜橙多 “,1. 统计记录数 【格式】COUNT FOR WHILE TO 【功能】用于统计当前表中指定范围内满足条件的记录个数。 【说明】除非指定了或 FOR/WHILE ,否则将计算所有记录个数,如选择了 TO ,则可
17、将计算结果保存在中,否则统计结果只在屏幕上显示。 若选择了SET TALK OFF将不显示统计结果。 【例】统计Spxx.DBF中的”办公用品”记录个数和表记录总数。,4.4 数据表的统计,USE SpxxCOUNT FOR 类别=”办公用品” TO ACOUNT TO B 2. 求和 【格式】SUM FOR WHILE TO | TO ARRAY 【功能】对指定范围内、满足条件的记录按指定的各个表达式分别求和。 【说明】缺省范围、条件表示全部记录。缺省数值型表达式表,表示对库中所有数值型字段求和。数值型表达式表中表达式的个数应与内存变量的个数一致。,3. 求平均值 【格式】AVERAGE F
18、OR WHILE TO | TO ARRAY 【功能】对当前表文件中指定范围内满足条件的记录,按指定的数值型字段计算平均值。【说明】缺省范围、条件表示全部记录。缺省数值型表达式表,表示对当前库中所有数值型字段求平均值。数值型表达式表中表达式的个数应与内存变量的个数一致。 【例】分别计算Spxx.DBF中的各类别零售价的平均值。 USE Spxx AVER FOR 类别=”办公用品” TO B AVER FOR 类别=”饮料” TO C,4. 综合计算 【格式】CALCULATE FOR WHILE TO | TO ARRAY 【功能】对当前表文件中指定范围内满足条件的记录进行指定的计算工作。【
19、说明】可以是CNT(),SUM(),AVG(),MAX(),MIN()函数的任意组合。 【例】统计chmx.dbf中销售数量最多和最少的商品数。USE chmxCALCULATE MAX(销售数量), MIN(销售数量) TO m1, m2,5. 分类汇总 【格式】TOTAL TO ON FIELDS FOR WHILE 【功能】按关键字段对当前表文件的数值型字段进行分类汇总,形成一个新的表文件。 【说明】当前表必须在关键字上排序或索引,否则仅将关键字段值相同的紧挨的记录值汇总。汇总命令执行后,将生成一个新的数据库文件(并没有被打开)。对非数值型字段,则把关键字相同的连续记录的第一条记录的字段
20、内容送入新库。缺省待汇总字段名表,则将所有数值型字段的值进行汇总。,【例】分类汇总各种商品的销售数量。USE chmx INDEX ON 商品编号 TAG spbhTOTAL ON 商品编号 TO spxxhz FIELDS 销售数量,多表的操作在实际应用中,用户常常需要同时打开多个表文件,以便对多个表文件的数据进行操作。,4.5 多表同时操作,1工作区和当前工作区Visual FoxPro 能同时提供32767个工作区。系统默认值为1区。在任意时刻,只有一个工作区是当前工作区,用户只能在当前工作区对打开的当前库进行操作。每一个工作区都可以并且只能打开一个数据库文件。同一个数据库文件不允许同时
21、在多个工作区打开。,4.5.1 工作区与多个表,2选择当前工作区 每一个工作区用工作区号或别名来标识 (1)工作区号利用数字132767来标识32767个不同的工作区 (2)别名前10工作区用AJ10个字母来标识。采用该工作区中已打开的数据库的库名来作别名用户自己定义【命令格式】 :USE 数据库名ALIAS别名【功能】 :打开数据库文件并为该数据库起一个别名。,(3)工作区的选择当系统启动时,1号工作区是当前工作区,若想改变当前工作区,则可使用SELECT命令来转换当前工作区。 【命令格式】:SELECT/ 【功能】:选择一个工作区作为当前工作区。 【说明】:别名可以是系统规定的别名,也可以
22、是用户规定的别名,甚至可以用已打开的表名替代工作区别名。此命令允许选用“0”号工作区。如果指定“0”,则表示选用当前未使用过的编号最小的工作区作为当前工作区。执行该命令后,对任何工作区中的表及记录指针均不发生影响,仅实现各个工作区之间切换。,【例】在1号和2号工作区内分别打开Spxx.DBF和Chxx.DBF表文件,并选择1号工作区为当前工作区。SELECT 1 & 或 SELECT AUSE SpxxSELECT 2USE ChxxSELECT 1 3非当前工作区字段的引用 Visual FoxPro系统对当前工作区上的表可以进行任何操作,也可以对其他工作区中的表文件的数据进行访问。在主工作
23、区可通过以下两种格式访问其他工作区表中的数据。 格式:- . ,【例】在当前工作区显示其他工作区的数据。 SELE 1 USE spxx GO 7 DISP 商品编号,商品名称,类别,零售价 SELE 2 USE jhxx GO 3 DISP A-商品编号,A-商品名称,A-类别,A-零售价,进货单价,进货数量 CLEA ALL,1关联的概述一个数据库可以包含多个表,这些表之间不是孤立的,而是存在某种联系,这种联系称为表的关联或表的关系。 数据库表之间存在着永久关联和临时关联两种关系。 2.建立和编辑永久性关联 (1)如果需要建立关联的表的索引还没有建立,先为相应的表建立索引,并打开“数据库设
24、计器”。 (2)在“数据库设计器”上将鼠标放在“一”表的主索引上,将该主索引拖拽到“多”表的与其对应的普通索引上,此时在两索引之间建立一条“一对多”的连线,表示两表之间的关联。 (3)“在数据库设计器”上将鼠标放于“一对多”的连线上,单击使其变粗表示选择,然后右击,在出现的快捷菜单上,选择“编辑关系”命令。 (4)在“编辑关系”对话框中,输入关系的条件。,4.5.2 表的关联,3建立表的临时关系 当前工作区的表和另一工作区中的打开表建立临时关联后,当前工作区是表的记录指针移动时,被关联工作区的表记录指针也将自动相应移动,以实现对多个表的同时操作。在多个表中,必须有一个表为关联表,此表常称为父表
25、,而其他的表则称为被关联表,常称为子表。在两个表之间建立关联,必须以某一个字段为标准,该字段称为关键字段。 【格式】SET RELATION TO | INTO | ADDITIVE 【功能】将当前工作区的表文件与(或工作区号)指定的工作区中的表文件按或建立关联。 【说明】当用建立关联时,关键字必须是两个表文件共有字段,且别名表文件已按关键字段建立了索引文件,并已指定关键字段为主索引。当父表文件的记录指针移动时,子表文件的记录指针根据主索引文件指向关键字段值与父表文件相同的记录。如果子表中没有与关键字段值相同的记录,记录指针指向文件尾,EOF()为.T.。,SET RELATION TO则表示
26、取消当前工作区与其他工作区的关联。 【例】将spxx.dbf和jhxx.dbf按照商品编号建立关联。 SELE 1 USE spxx SELE 2 USE jhxx INDEX ON 商品编号 TAG spbh_sy SELE 1 SET RELATION TO 商品编号 INTO B DISP ALL A-商品编号,商品名称, B-进货单价,零售价,【格式】 JOIN WITH | WITH TO FOR FIELDS 【功能】将当前表文件和另一工作区中打开的表文件按指定的条件连接,生成一个以为名的新表文件,实现物理上的连接。 【说明】WITH | WITH 指定另一工作区打开的表文件,表示
27、连接生成的新表文件,其扩展名可省略,系统默认为.DBF。FOR 指定两个表文件的连接条件,它不同于其他命令中的FOR子句,其他命令的FOR子句都是选择项,这里的FOR子句不可缺省,否则,JOIN命令无法执行。 【例】将spxx.dbf和chmx.dbf连接生成sp_ch.dbf。 SELE 1 USE spxx SELE 2 USE chmx SELE 1 JOIN WITH B TO sp_ch FOR 商品编号=B-商品编号 FIELDS 商品编号,商品名称, B-销售单价,B-销售数量 SELE 3 USE sp_ch LIST CLEA ALL,4.5.3 表的连接,参照完整性,就是利
28、用相关表之间的制约关系,互相参照控制相关表数据的完整性。参照完整性规则分为三种:更新规则、删除规则及插入规则. 如,通过参照完整性规则对相关的表做以下限制。 (1)当主表中没有相关记录时,记录不得追加到相关子表中。 (2)当主表中某条记录在相关子表中有相关记录时,这条主表记录不允许删除。 (3)当主表的关系字段值改变将导致相关子表中出现无关记录时,在主表中不允许做这种改变。,4.5.4 参照完整性,建立参照完整性步骤如下。 (1)在“数据库设计器”窗口中 ,双击表之间的关系线来打开“编辑关系”对话框。 (2)在“编辑关系”对话框中,单击“参照完整性”按钮来打开“参照完整性生成器”对话框. (3)如果在数据库中有多个表建立了关联,应当在“参照完整性生成器”中,要先选定设置参照完整性的关系行。,