1 / 41

第四章 5、6、7节

第四章 5、6、7节. 4.5 查询 4.6 表的统计与计算 4.7 多个表的操作. 4.5.1 顺序查询. 3.5.1 顺序查询 1 .命令方式 【格式】 LOCATE FOR< 逻辑表达式 1>[< 范围 >][ WHILE < 逻辑表达 2>] 【功能】在表指定范围中查找满足条件的记录。 【说明】 LOCATE 命令在表指定范围中查找满足条件的第一条记录。 < 逻辑表达式 1> :表示所需满足的条件。 < 范围 > :指定查找范围,缺省时为 ALL , 即在整个表文件中查找。

june
Download Presentation

第四章 5、6、7节

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 5、6、7节

  2. 4.5 查询 • 4.6 表的统计与计算 • 4.7 多个表的操作

  3. 4.5.1 顺序查询 3.5.1 顺序查询 1.命令方式 【格式】LOCATE FOR<逻辑表达式1>[<范围>][WHILE <逻辑表达2>] 【功能】在表指定范围中查找满足条件的记录。 【说明】LOCATE 命令在表指定范围中查找满足条件的第一条记录。 <逻辑表达式1>:表示所需满足的条件。 <范围>:指定查找范围,缺省时为ALL,即在整个表文件中查找。 找到第一条满足条件的记录后,记录指针指向该记录,并将函数FOUND()(用于检测是否找到满足条件的记录)置为.T.;否则,记录指针指向<范围>的底部或文件结束标志,并且将函数FOUND()置为.F,并在状态栏给出提示信息“已到定位范围末尾”。

  4. 如果没有打开索引文件,查找按记录号顺序进行。若打开了索引,查找按索引顺序进行。 如果没有打开索引文件,查找按记录号顺序进行。若打开了索引,查找按索引顺序进行。 该命令的最大特点是可以在没有进行排序或索引的无序表中进行任意条件的查询,这是索引查询做不到的,但在大型表中查询速度和效率也是最低的。 CONTINUE命令:LOCATE找到第一条满足条件的记录后可以用CONTINUE继续查找下一个满足条件的记录。 CONTINUE命令必须在LOCATE命令之后使用,否则出错。 在CONTINUE命令中实际隐含了前一个LOCATE命令中的条件。 例 1 在STUD.DBF中查找学号前四位为00的同学记录。 USE STUD LOCATE FOR 学号=“00” disp continue

  5. 2.菜单方式 ① 首先打开表文件 ② 选择【显示】|【浏览】命令。 ③ 选择【表】|【转到记录】|【定位】命令,出现如图3-19所示的定位记录对话框。 ④ 在“作用范围”下拉列表框中选择查询范围,在FOR或WHILE框中输入查询条件,选择定位按钮。系统将指针定位于符合条件的第一条记录上。

  6. 4.5.2 索引查询(FIND、SEEK) • LOCATE命令用于按条件进行顺序定位,无论索引文件是否打开都可使用。在打开索引文件后,还可以用FIND、SEEK命令进行快速检索。

  7. 1.FIND命令 【格式】FIND <字符串>/<数值常量> 【功能】在表文件的主控索引中查找关键字值与<字符串>或<数值常量>相匹配的第一个记录。 【说明】必须打开相应的库文件、主索引文件。 查询字符串,字符串可以不用定界符括起来,但前后有空格的,则必须要括进来。 查询常数,必须使用索引关键字的完整值。 允许查询字符型内存变量,但必须使用宏替换函数。 由于索引文件中关键字表达式值相同的记录总是排在一起的,可用SKIP、DISP命令来逐个查询。 查询完满足条件的记录后,不能自然给出提示,常借助于EOF()函数来判断查询是否完成。 多关键字查询,建立索引时STR函数若没有指定小数位,则应补齐不足10位的空格。

  8. 如果用SET EXACT ON命令,则匹配必须是精确的。即FIND命令中的查询内容必须与记录的关键字段值完全相等。如果用SET EXACT OFF命令,则匹配可以是不精确的,即只要FIND命令中的查询内容与记录的关键字段值的左侧相等即可。 【例3-38】打开表文件STUD.DBF,查找姓“赵”的记录。 USE STUD index on 姓名 to sy SET ORDER TO sy FIND 赵 ?find(),recno() disp

  9. 2.SEEK命令 【格式】SEEK <表达式> 【功能】在表文件的主索引中查找关键字值与<表达式>值相匹配的第一个记录。 【说明】SEEK命令可以查找字符型、数值型、日期型、逻辑型表达式的值。

  10. SEEK命令中的表达式的类型必须与索引表达式类型相同SEEK命令中的表达式的类型必须与索引表达式类型相同 可以查找字符、数值、日期和逻辑型字段的值。 内存变量可以直接进行查询,不用进行宏替换。 表达式为字符串时,必须用定界符括起来。日期常量也必须用大括号括起来。 表达式可以为一复杂的表达式,计算机先计算表达式的值,然后用其值进行查询。 由于索引文件中关键字表达式值相同的记录总是排在一起的,可用SKIP、DISP命令来逐个查询。 如果用SET EXACT ON命令,则匹配必须是精确的。 【例3-40】用SEEK命令在STUD.DBF中查找记录。 USE STUD INDEX ON 是否团员TAG 是否团员 SET ORDER TO sy SEEK “孙” ?found(),recno() disp

  11. 4.6 数据统计与计算 3.6.1 统计记录数 【格式】COUNT [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [TO <内存变量>] 【功能】用于统计当前表中指定范围内满足条件的记录个数。 【说明】除非指定了<范围>或FOR/WHILE <条件>,否则将计算所有记录个数,如选择了TO <内存变量>,则可将计算结果保存在<内存变量>中,否则统计结果只在屏幕上显示。 若选择了SET TALK OFF将不显示统计结果。 若SET DELETE OFF,则加删除标志的记录将被计算。

  12. 【例3-41】统计STUD.DBF中的男同学记录个数和表记录总数。【例3-41】统计STUD.DBF中的男同学记录个数和表记录总数。 USE STUD COUNT FOR 性别="男" TO A COUNT TO B

  13. 3.6.2 求和 【格式】SUM [<表达式表>] [<范围>] [FOR <条件>] [WHILE <条件>] [TO <内存变量表> | TO ARRAY <数组>] [NOOPTIMIZE] 【功能】对指定范围内、满足条件的记录按指定的各个表达式分别求和。 【说明】缺省范围、条件表示全部记录。 缺省数值型表达式表,表示对库中所有数值型字段求和。 数值型表达式表中表达式的个数应与内存变量的个数一致。

  14. 【例3-42】有一表文件GZGL.DBF内容如下, Record# 姓名性别车间 基本工资岗位工资奖金工资总额 1 张小红女金工一 645 340 120 1105 2 李建军男金工一 690 370 130 1190 3 孙爱国男金工一 580 340 120 1040 4 吴晓英女金工一 540 360 110 1010 5 张斌 男金工二 670 400 140 1210 6 赵娜 女 金工二 570 330 110 1010 7 赵明明男金工二 560 300 100 960 8 李菲 女机修 650 350 150 1150 9 苏汉胜男机修 600 340 100 1040 10 罗丹女工具 600 350 130 1080 11 李会明男工具 670 350 120 1140

  15. 对GZGL.DBF中的基本工资、岗位工资、奖金和工资总额求和,并将结果存贮成数组A中。对GZGL.DBF中的基本工资、岗位工资、奖金和工资总额求和,并将结果存贮成数组A中。 USE GZGL SUM TO ARRAY A

  16. 3.6.3 求平均值 【格式】AVERAGE [<表达式表>] [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [TO <内存变量表> | TO ARRAY <数组>] [NOOPTIMIZE] 【功能】对当前表文件中指定范围内满足条件的记录,按指定的数值型字段计算平均值。 【说明】缺省范围、条件表示全部记录。 缺省数值型表达式表,表示对当前库中所有数值型字段求平均值。 数值型表达式表中表达式的个数应与内存变量的个数一致。

  17. 【例3-43】分别计算GZGL.DBF中的男女各项收入的平均值。【例3-43】分别计算GZGL.DBF中的男女各项收入的平均值。 USE GZGL AVER FOR 性别=”男”TO ARRAY B AVER FOR 性别=”女”TO ARRAY C

  18. 3.6.4 综合计算 【格式】CALCULATE <表达式表> [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [TO <内存变量表> | TO ARRAY <数组>] 【功能】对当前表文件中指定范围内满足条件的记录进行指定的计算工作。 【说明】<表达式表>可以是表3-4中函数的任意组合。

  19. 【例3-44】计算GZGL.DBF中的人数、奖金收入的平均值和最大值、工资总额的最大值、平均值。【例3-44】计算GZGL.DBF中的人数、奖金收入的平均值和最大值、工资总额的最大值、平均值。 USE STUD CALC CNT(),AVG(奖金),MAX(奖 金),AVG(工资总额),MAX(工资总额) TO X1,X2,X3,X4,X5

  20. 3.6.5 分类汇总 【格式】TOTAL TO <汇总文件名> ON <关键字段> [FIELDS <字段名表>] [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [NOOPTIMIZE] 【功能】按关键字段对当前表文件的数值型字段进行分类汇总,形成一个新的表文件。 【说明】当前表必须在关键字上排序或索引,否则仅将关键字段值相同的紧挨的记录值汇总。 汇总命令执行后,将生成一个新的数据库文件(并没有被打开)。 对非数值型字段,则把关键字相同的连续记录的第一条记录的字段内容送入新库。

  21. 缺省待汇总字段名表,则将所有数值型字段的值进行汇总。 若数值型字段的汇总值超过了原数据库该字段的宽度,系统会自动修改汇总库中该字段的宽度。 汇总文件的结构与当前表的结构完全相同,汇总记录个数由<关键字段>的值确定 。 【例3-45】对GZGL.DBF按“车间”分类汇总。 USE GZGL INDEX ON 车间TAG 车间 TOTAL ON 车间TO GZCJ TOTAL TO GZCJ ON车间 USE GZCJ

  22. 对GZGL.DBF按“性别”分类汇总。 USE GZGL INDEX ON 性别TAG 性别 TOTAL TO GZXB ON 性别 USE GZXB

  23. 4.7 多表的操作 3.7 多表的操作 迄今所讲述的对表的操作都是在一个工作区进行的,每个工作区最多只能打开一个表文件,用USE命令打开一个新的表,同时也就关闭了前面已打开的表。在实际应用中,用户常常需要同时打开多个表文件,以便对多个表文件的数据进行操作。为了解决这一问题,Visual FoxPro引入了工作区的概念。Visual FoxPro允许用户在表间建立临时关系和永久关系。

  24. 3.7.1 工作区与多个表 1.工作区和当前工作区 Visual FoxPro 能同时提供32767个工作区。系统默认值为1区。 在任意时刻,只有一个工作区是当前工作区,用户只能在当前工作区对打开的当前库进行操作。 每一个工作区都可以并且只能打开一个数据库文件。 同一个数据库文件不允许同时在多个工作区打开,但在其它工作区中被关闭之后,可以在任意一个工作区中被打开。 各工作区中打开的数据库彼此相互独立(指针不受影响)。

  25. 2.选择当前工作区 每一个工作区用工作区号或别名来标识 (1)工作区号 利用数字1~32767来标识32767个不同的工作区 (2)别名 前10工作区用A~J10个字母来标识。 采用该工作区中已打开的数据库的库名来作别名 用户自己定义 【命令格式】 :USE 〈数据库名〉[ALIAS〈别名〉] 【功能】 :打开数据库文件并为该数据库起一个别名。 【说明】给数据库起了别名后,数据库名就不是默认的别名了。

  26. (3)工作区的选择 当系统启动时,1号工作区是当前工作区,若想改变当前工作区,则可使用SELECT命令来转换当前工作区。 【命令格式】:SELECT<工作区号>/<工作区别名> 【功能】:选择一个工作区作为当前工作区。 【说明】:<工作区号> | <工作区别名>:指定当前工作区。选择工作区时,可以直接指定区号,也可以通过别名指定工作区,二者是等效的。 别名可以是系统规定的别名,也可以是用户规定的别名,甚至可以用已打开的表名替代工作区别名。此命令允许选用“0”号工作区。如果指定“0”,则表示选用当前未使用过的编号最小的工作区作为当前工作区。 执行该命令后,对任何工作区中的表及记录指针均不发生影响,仅实现各个工作区之间切换。

  27. 【例3-46】在1号和2号工作区内分别打开STUD.DBF和COURSE.DBF表文件,并选择1号工作区为当前工作区。【例3-46】在1号和2号工作区内分别打开STUD.DBF和COURSE.DBF表文件,并选择1号工作区为当前工作区。 SELECT 1 && 或SELECT A USE STUD SELECT 2 USE COURS SELECT 1 3.非当前工作区字段的引用 Visual FoxPro系统对当前工作区上的表可以进行任何操作,也可以对其他工作区中的表文件的数据进行访问。在主工作区可通过以下两种格式访问其他工作区表中的数据。 格式:<工作区别名>-> <字段名> <工作区别名>. <字段名>

  28. 通过用工作区别名指定欲访问的工作区,所得到的字段值为指定工作区打开的表当前记录的字段值。 通过用工作区别名指定欲访问的工作区,所得到的字段值为指定工作区打开的表当前记录的字段值。 【例3-47】在1号和2号工作区打开STUD.DBF和SC.DBF,在1号工作区内查看当前记录的学号、姓名、性别、出生日期、课程号、成绩等字段内容。 SELECT A USE STUD && 在一号工作区中打开STUD SELECT B USE SC && 在二号工作区中打开SC SELECT A && 选择1号工作区为当前工作区 DISPLAY 学号,姓名,性别,出生日期,B->课程号,SC.成绩

  29. 3.7.2 表的关联 1.关联的概述 所谓表文件的关联是把当前工作区中打开的表与另一个工作区中打开的表进行逻辑连接,而不生成新的表。当前工作区的表和另一工作区中的打开表建立关联后,当前工作区是表的记录指针移动时,被关联工作区的表记录指针也将自动相应移动,以实现对多个表的同时操作。 在多个表中,必须有一个表为关联表,此表常称为父表,而其他的表则称为被关联表,常称为子表。在两个表之间建立关联,必须以某一个字段为标准,该字段称为关键字段。表文件的关联可分为一对一关联、一对多关联和多对多关联。

  30. 2.表文件关联的建立 (1)一对一关联的建立 1)命令方式 【格式】SET RELATION TO [<关键字段表达式> | <数值表达式>] [INTO<别名> | <工作区号>] [ADDITIVE] 【功能】将当前工作区的表文件与<别名>(或工作区号)指定的工作区中的表文件按<关键字段表达式>或<数值表达式>建立关联。 【说明】当用<关键字段表达式>建立关联时,关键字必须是两个表文件共有字段,且别名表文件已按关键字段建立了索引文件,并已指定关键字段为主索引。 当父表文件的记录指针移动时,子表文件的记录指针根据主索引文件指向关键字段值与父表文件相同的记录。如果子表中没有与关键字段值相同的记录,记录指针指向文件尾,EOF()为.T.。

  31. 当按<数值表达式>建立关联时,别名表不需要打开索引文件,两个表文件按照记录号相联系,父表文件的记录指针移动时,子表文件的记录指针移至与数值表达式相等的记录上。若找不到此记录,记录指针指向文件尾,EOF()为.T.。 当按<数值表达式>建立关联时,别名表不需要打开索引文件,两个表文件按照记录号相联系,父表文件的记录指针移动时,子表文件的记录指针移至与数值表达式相等的记录上。若找不到此记录,记录指针指向文件尾,EOF()为.T.。 ADDITIVE:表示当前表与其他工作区表己有的关联仍有效,实现一个表和多个表之间的关联;否则取消当前表与其他工作区表已有的关联,当前表只能与一个表建立关联。 SET RELATION TO则表示取消当前工作区与其他工作区的关联。

  32. 【例3-48】将表文件STUD.DBF和SC.DBF以学号为关键字段建立关联。【例3-48】将表文件STUD.DBF和SC.DBF以学号为关键字段建立关联。 SELECT 2 && 选择工作区2 USE SC && 打开表文件SCORE.DBF INDEX ON 学号TAG 学号 && 建立学号标识 SET ORDER TO TAG 学号 && 指定学号为主索引 SELECT 1 && 选择工作区1 USE STUD && 打开表文件STUD.DBF SET RELATION TO 学号 INTO 2 && 建立一对一关联 【例3-49】将表文件STUD.DBF和SC.DBF按数值表达式建立关联。 SELECT 2 && 选择工作区2 USE SC && 打开表文件SC.DBF SELECT 1 && 选择工作区1 USE STUD && 打开表文件STUR.DBF SET RELATION TO RECNO() INTO 2

  33. 2)菜单方式 ① 选择【窗口】|【数据工作期】,弹出数据工作期窗口。 ② 选择【打开】,将需要用到的表在不同的工作区打开。 ③ 在别名列表中选择主表,再单击“关系”按钮,再在别名列表中选择子表。 ④ 如果子表文件未指定主索引,系统会打开如图3-21所示的“设置索引顺序”对话框,以指定子表文件的主索引。 ⑤ 主索引建立后,系统弹出如图3-22所示的“表达式生成器”(Expression Builder)对话框,在字段列表框中选择关联关键字段,然后单击“确定”按钮,返回数据工作期窗口。 ⑥ 此时在数据工作期窗口的右侧列表框中出现了子表,在父表和子表之间有一单线相连,说明在两表之间已建立了一对一关联,如图3-23所示。

  34. (2)一对多关联的建立 1)命令方式 【格式】SET SKIP TO [<别名1>[, <别名2>] ...] 【功能】将当前表文件与其他工作区中的表文件建立一对多关联。 【说明】先要用SET RELATION命令建立了一对一的关联,然后才能将一对一的关联进一步定义成一对多的关联。 当前工作区表记录指针移动时,别名库文件的记录指针指向第一个与关键字表达式值相匹配的记录,若找不到相匹配的记录,则记录指针指向文件尾部,EOF()为.T.。 当父表中的一个记录与子库的多个记录匹配时,在父表中使用SKIP命令,并不使父表的指针移动,而子表的指针却向前移动,指向下一个与父表相匹配的记录;重复使用SKIP命令,直至在子表中没有与父表当前记录相匹配的记录后,父表的指针才真正向前发生移动。

  35. 无任何选择项的SET SKIP TO命令将取消一对多的关联(一对一的关联仍然存在)。 2)菜单方式 ① 选择【窗口】|【数据工作期】,弹出的数据工作期窗口。 ② 按前面所述的步骤,建立一对一关联。 ③单击【一对多】按钮,系统弹出创建一对多关系对话框。 ④ 在创建一对多关系对话框的子表别名列表框选择子表别名,单击“移动”按钮,子表别名将出现在选定别名列表框中,单击“确定”按钮,完成子表别名的指定,并返回到数据工作期窗口。 ⑤ 如果子表文件未指定主索引,系统显示“指定索引顺序”对话框,以便用户指定主索引。

  36. 完成上述工作后,在数据工作期窗口的右侧列表框中出现了子表文件名,在父表和子表之间有一双线相连,说明在两表之间已建立了一对多关联 。 (3)一个表对多个表关联的建立 1)命令方式 【格式】SET RELATION TO [<关联表达式1> INTO <别名1> | <工作区1>[, <关联表达式2> INTO <别名2> | <工作区2> ...][ADDITIVE]] 【功能】将主工作区中的表与多个其他工作区中的表建立关联。 【说明】<关联表达式1>表示与别名1表文件建立关联时的关键字段表达式,<关联表达式2>表示与别名2表文件建立关联时的关键字段表达式,建立关联时,关键字段必须是两个表文件共有字段,且别名表文件已按关键字段建立了索引文件,并已指定为主索引。

  37. 当父表文件的记录指针移动时,多个子表文件的记录指针根据各自的主索引文件指向关键字段值与父表文件相同的记录。 当父表文件的记录指针移动时,多个子表文件的记录指针根据各自的主索引文件指向关键字段值与父表文件相同的记录。 其他有关参数均同前述。 2)菜单方式 多次利用上节介绍的菜单步骤,只要每次选择的子表不同,就可以分别建立一个表文件同多个表文件的关联。 3.取消表的关联 (1)在建立关联的命令中,如果不选用ADDITIVE选项,则在建立新的关联的同时,取消了当前表原来建立的关联。 (2)命令SET RELATION TO,取消当前表与其他表之间的关联。 (3)命令SET RELATION OFF INTO <别名> | <工作区号>,取消当前表与指定别名表之间的关联。 (4)关闭表文件,关联都被取消,下次打开时,必须重新建立。

  38. 3.7.3 表的连接 在实际应用中,经常需要把不同数据结构的表文件按一定要求连接形成一个新的表文件,这就是表文件的连接,称为物理连接。 【格式】JOIN WITH <工作区号> | WITH <别名> TO <新文件名> FOR <逻辑表达式> [FIELDS <字段名表>] 【功能】将当前表文件和另一工作区中打开的<别名>表文件按指定的条件连接,生成一个以<新文件名>为名的新表文件,实现物理上的连接。 【说明】WITH <工作区号> | WITH <别名>指定另一工作区打开的表文件,<新文件名>表示连接生成的新表文件,其扩展名可省略,系统默认为.DBF。 FOR <逻辑表达式>指定两个表文件的连接条件,它不同于其他命令中的FOR子句,其他命令的FOR子句都是选择项,这里的FOR子句不可缺省,否则,JOIN命令无法执行。

  39. 【例3-51】将STUD.DBF和SC.DBF表按学号连接,生成一个新的表文件STUD_SC.DBF。【例3-51】将STUD.DBF和SC.DBF表按学号连接,生成一个新的表文件STUD_SC.DBF。 SELECT 2 USE SC SELECT 1 USE STUD JOIN WITH B TO STUD_SC FOR 学号=B->学号FIELDS 学号,姓名,班级名,系别代号,B->课程号,B->成绩 && 连接生成新文件STUD_SC 3.7.4 表间的数据更新 【格式】UPDATE ON <关键字段> FROM <别名> | <工作区号> REPLACE <字段1> WITH <表达式1> [,<字段2> WITH <表达式2>…] [RANDOM] 【功能】用<别名>或<工作区号>指定的表的数据更新当前区表中的数据。

  40. 【说明】<关键字段>必须为两个表所共有的。 <别名> | <工作区号>:指定用来进行数据更新的表文件。 <字段1> WITH <表达式1>:用表达式1的值更新字段1的内容, 表达式中出现的别名库中的字段应以前缀“别名->”或“别名.”标识。 如果选用RANDOM选择项,别名区中文件不需索引或按关键字段升序排序;否则两个表文件都必须以关键字段索引或按关键字段升序排序。 若当前区表中有多个关键字值相同的记录,则只对第一个进行更新;若别名库中有多个关键字值相同的记录,则对当前表中相应的记录进行多次更新。 【例3-52】表文件ZFCJ.DBF内容如下,用SC.DBF中的各课成绩值计算ZFCJ.DBF中的总分成绩。

  41. 记录号学号姓名总分 1 961101 李建国 90.0 2 961103 李宁 92.0 3 961202 赵娜 89.0 4 961204 孙亮 75.0 5 971110 赵琳 92.0 6 971405 罗宇波 90.0 SELECT 2 USE SC SELECT 1 USE ZFCJ SET ORDER TO TAG 学号 && 指定主索引标识 UPDATE ON 学号 FROM SC REPLACE 总分 WITH 总分+A->成绩 RANDOM

More Related