第6讲数据库的高级操作 数据库文件的排序 数据库文件的索引 数据库文件的检索 数据的统计与运算 FoxproForWindowshttp://cc.synu.edu.cn
FoxPro For Windows http://cc.synu.edu.cn 1 第6讲 数据库的高级操作 数据库文件的排序 数据库文件的索引 数据库文件的检索 数据的统计与运算
数据库文件的排序 数据库记录的物理顺序(记录号)取决于数据输入的顺序。 排序:数据库中记录按照某字段值大小重新排列,作为排序依据的字段 称为“关键字”。排序后得到一个新数据库,原数据库不变。 SORT ON[ADo,……]TO 说明】 默认按字段升序 Record#(SH HE下区分字母 Record# SNI 排序依据可以 v191王亚洲 998181王亚洲 299195 2|996102 赵辉 可以加条件For 399019李苓梅是排序 3|990183丹 可以加 field<t 4990103王丹 陈别的结构。 499819李冬梅 599166 998185 白 【例】 USE stu 6998182赵辉 6990106陈不刚 SORT ON SNO TO stud 1 USE Stud1 LIST SORT TO stud2 oN birthday score/D FOR sex="T" FoxproForWindowshttp://cc.synu.edu.cn 2
FoxPro For Windows http://cc.synu.edu.cn 2 数据库记录的物理顺序(记录号)取决于数据输入的顺序。 排序:数据库中记录按照某字段值大小重新排列,作为排序依据的字段 称为“关键字”。排序后得到一个新数据库,原数据库不变。 数据库文件的排序 SORT ON [/A][/D][/C][,……]TO 【说明】 •默认按字段升序排序,/A:升序 /D:降序 /C:不区分字母的大小写,默认区分。 •排序依据可以是多个字段,中间隔以逗号。 •可以加条件For 或while,对满足条件的记录排序 •可以加 field ,决定生成新数据库的结构。 【例】 USE student SORT ON SNO TO stud1 USE stud1 LIST SORT TO stud2 ON birthday ,score/D FOR sex="女
数据库文件的索引 排序后生成了许多内容相同,仅排列顺序不同的新数据库文件,造 成数据余,排序过程中所需磁盘空间为原文件的三倍。 索引是不改变纪录的物理顺序,按照索引表达式值使数据库中的纪 录有序排列,它生成一个索引文件,数据变化时,索引文件自动按 索引表达式值进行调整 索引文件:由按照一定的逻辑顺序排列的关键字段(或表达式), 和每个字段值所在的记录号组成。 以SNoO为关键字的索引文件 SNOIDX: SNO 记录号 990101 查找时,先在索引文件中快速查到 990102 要查的关键字,然后根据相对应的 990103 记录号在数据库文件中快速定位到 990104 相应的记录上 990105 164325 990106 FoxproForWindowshttp://cc.synu.edu.cn 3
FoxPro For Windows http://cc.synu.edu.cn 3 • 排序后生成了许多内容相同,仅排列顺序不同的新数据库文件,造 成数据冗余,排序过程中所需磁盘空间为原文件的三倍。 • 索引是不改变纪录的物理顺序,按照索引表达式值使数据库中的纪 录有序排列,它生成一个索引文件,数据变化时,索引文件自动按 索引表达式值进行调整。 数据库文件的索引 索引文件:由按照一定的逻辑顺序排列的关键字段(或表达式), 和每个字段值所在的记录号组成。 以SNO为关键字的索引文件SNO.IDX: 查找时,先在索引文件中快速查到 要查的关键字,然后根据相对应的 记录号在数据库文件中快速定位到 相应的记录上。 SNO 记录号 990101 1 990102 6 990103 4 990104 3 990105 2 990106 5
单森弘文 复合索引文件: INDEX ON[oF<复合索引文件名 ASCENDING I DESCENDING]UNIQUE IDX CDX结构 CDX非结构 Sno Sno SI no name name name use student use student use student nde on sno to sno inde on sno tag sno inde on sno tag sno of stu inde on name to name inde on name tag name inde on name tag name of stu 索引文件 sno, IDX 索引文件 student, cdx索引文件 stu cdx 索引文件 name. IDX FoxproForWindowshttp://cc.synu.edu.cn
FoxPro For Windows http://cc.synu.edu.cn 4 .IDX .CDX 结构 .CDX 非结构 use student use student use student inde on sno to sno inde on sno tag sno inde on sno tag sno of stu inde on name to name inde on name tag name inde on name tag name of stu 索引文件 sno.IDX 索引文件 student.cdx 索引文件 stu.cdx 索引文件 name.IDX Sno Sno name Sno name name 【例】 单索引文件(.IDX):只能包含一个索引。 复合索引文件(.CDX):结构复合索引文件(与数据库文件主名同名) 非结构复合索引文件 单索引文件: INDEX ON TO 复合索引文件: INDEX ON TAG [OF ] [ASCENDING | DESCENDING][UNIQUE]
【例】索引表达式 USE student INDEX ON score TO score &&score. idx INDEX ON -score TOsco &&按 score降序 单索引只有升序,数值表达式前加∵号实现降序,字符型不可以。 INDEX ON sex+STR(score) TO sex &&sex. idx INDEX ON name+DTOC(brithday) TO bri 多个字段索引表达式需转换成同一类型后相加。 NDEX ON数学+语文Tosy 数值型取其和做关键字的值。 INDEXON性别ToSY1 UNIQUE 唯一索引,当几条纪录索引表达式值相同时只取其中记录号最小的 Record排 号 姓名 性别出生旦期 入学成绩奖学金 1990161 王亚洲 86-5-24 515 126 2999195 女 81-66-18 54 156 additive控制建立索引或打开索引时,以前的索引并不关闭 FoxproForWindowshttp://cc.synu.edu.cn 5
FoxPro For Windows http://cc.synu.edu.cn 5 【例】索引表达式 USE student INDEX ON score TO score &&score.idx INDEX ON -score TO sco &&按score 降序 多个字段索引表达式需转换成同一类型后相加。 单索引只有升序,数值表达式前加‘-’号实现降序,字符型不可以。 INDEX ON sex+STR(score) TO sex &&sex.idx INDEX ON name+DTOC(brithday) TO bri INDEX ON 数学+语文 TO sy INDEX ON 性别 TO SY1 UNIQUE 唯一索引, 当几条纪录索引表达式值相同时,只取其中记录号最小的。 数值型取其和做关键字的值。 additive控制建立索引或打开索引时,以前的索引并不关闭
相关函数 字符转日期函数:CToD(字符表达式 日期转字符函数:DToc() 数值转字符串函数:STR(] 字符串转数值函数:WAL) 【例】 ?str(350) 350 ?str(120,3) 120 ?str(120.456,7,3) 120.456 ?str(34452) 34 ?str(3455,2) 35 ?str(121.32) ?cToD(021103”) 02/11/03 DTOC(date) 03/30/04 ?va("12") 12.00 ?va("a12") 0 ?va("12a") 12.00 FoxproForWindowshttp://cc.synu.edu.cn 6
FoxPro For Windows http://cc.synu.edu.cn 6 字符转日期函数:CTOD() 日期转字符函数:DTOC() 数值转字符串函数:STR([,][,] 字符串转数值函数:VAL() 【例】 ? Str(350) ? Str(120,3) ? Str(120.456,7,3) ? Str(34.45,2) ? Str(34.55,2) ? Str(121.3,2) ? CTOD(“02/11/03”) ? DTOC(date()) ? val("12") ? val("a12") ? val("12a") 相关函数
2)打开索引 a.建立索引文件时,同时打开了这个索引文件 b结构复合索引文件随数据库自动打开。 c在打开数据库的同时打开索引文件。 USE INDEX 【例】 USE STUDENT INDE Score,sex d在打开数据库之后打开素引文件。 SET INDEX T0&&数据库文件必须先打开 例) USE STUDENT SET INDEX TO Score, sex 3)关闭索引 SET INDEXTO 关闭当前工作区中的所有索引文件。 CLOSEINDEX 关闭当前工作区中的所有索引文件。 CLOSE DATABASES关闭所有数据库及其索引文件 USE 关闭当前工作区的数据库及其索引文件。 FoxproForWindowshttp://cc.synu.edu.cn 7
FoxPro For Windows http://cc.synu.edu.cn 7 2)打开索引: a. 建立索引文件时,同时打开了这个索引文件。 b.结构复合索引文件随数据库自动打开。 c.在打开数据库的同时打开索引文件。 USE INDEX 【例】 USE STUDENT INDE Score,sex d.在打开数据库之后打开索引文件。 SET INDEX TO && 数据库文件必须先打开。 【例】 USE STUDENT SET INDEX TO Score,sex 3)关闭索引 SET INDEX TO 关闭当前工作区中的所有索引文件。 CLOSE INDEX 关闭当前工作区中的所有索引文件。 CLOSE DATABASES 关闭所有数据库及其索引文件。 USE 关闭当前工作区的数据库及其索引文件
4)控制索引: 同时打开多个索引文件时,只有一个是主索引,默认第一个。 可用 SET ORDER TO命令改变主索引。 【例】 USE STUDENT INDEX Score,Sex SET ORDER TO 2 &&Sex. IDX SET ORDER TO 2 OF ST1 SET ORDER TO 0 &&关闭主索引以物理顺序排列 5) REINDEX当数据库的纪录发生变化时,需重建索引 NDEX和 REINDEX忽略 set delete命令的设置。 use student use student 56 56 inde on score to score160 append &&8060 append &&80 set inde to score175 75 list List 80 2 REINDEX 依据关 ,新追加记录 75 1入索 list 92 FoxproForWindowshttp://cc.synu.edu.cn 6
FoxPro For Windows http://cc.synu.edu.cn 8 5)REINDEX 当数据库的纪录发生变化时,需重建索引. INDEX和REINDEX 忽略set delete命令的设置。 4)控制索引: 同时打开多个索引文件时,只有一个是主索引,默认第一个。 可用SET ORDER TO命令改变主索引。 【例】USE STUDENT INDEX Score,Sex SET ORDER TO 2 &&Sex.IDX SET ORDER TO 2 OF ST1 SET ORDER TO 0 &&关闭主索引以物理顺序排列 use student inde on score to score1 append &&80 List 依据关键字值,新追加记录 加入索引文件。 use student append &&80 set inde to score1 list REINDEX list 56 60 75 80 92 56 60 75 92 56 60 75 80 92
小结: 1.索引与排序比较: 排序 索引 文件类型 dbf idx 文件单独使用可以 不可以 物理次序记录号)改变 不变 自动更新 不能 检索速度 能快 2.命令格式 SORT TOON[AD]C]多个字段用“,"间隔。 NDEX ONTo多个字段转换成字符型用“+连接。 Score1.idx 56 3.索引后指针定位: 4 GO TOP|BOTT、SKP逻辑定位 2 Go1物理定位 80 FoxproForWindowshttp://cc.synu.edu.cn 9
FoxPro For Windows http://cc.synu.edu.cn 9 3. 索引后指针定位: GO TOP|BOTT 、SKIP 逻辑定位 GO 1 物理定位 排序 索引 文件类型 .dbf .idx .cdx 文件单独使用 可以 不可以 物理次序(记录号) 改变 不变 自动更新 不能 能 检索速度 慢 快 小结: 1.索引与排序比较: 2.命令格式: SORT TO ON [/A][/D][/C] 多个字段用“,”间隔。 INDEX ON TO 多个字段转换成字符型用“+”连接。 56 3 60 4 75 2 80 5 92 1 Score1.idx
注意 °必须在打开索引文件后使用; 不能在非关键字之外的字段中进行查找; ofind、seek的缺点:只能按确定值查找,不能使用范围条件。 也·LL示 索引检索:FIND/ SEEK Locate Find Seek 查询前 不排序、索引 索引 索引 速度 慢 快 快 查询范围 任何表达式、常量、C、N型常量和C型C型、N型、D型和L 变量 变量,不接受表达式型常量或表达式 查询常量 不加定界符 加定界符 查询变量 使用宏代换 不使用宏代换 查询下一个记录 CONTINUE SKIP SKIP 检索成功:指针指向首条符合条件的记录, FOUND0函数为T,EOFQ为F, RECNO函数可返回该记录的记录号; 检索失败:记录指针指向文件尾部, FOUNDO函数为F,而EOFO为T,且 系统显示提示" NO FOUND" FoxproForWindowshttp://cc.synu.edu.cn 10
FoxPro For Windows http://cc.synu.edu.cn 10 物理检索:LOCATE [范围] FOR 索引检索:FIND / SEEK 数据库文件的检索 检索成功: 指针指向首条符合条件的记录,FOUND()函数为.T.,EOF()为.F., RECNO()函数可返回该记录的记录号; 检索失败:记录指针指向文件尾部,FOUND()函数为.F.,而EOF()为.T.,且 系统显示提示"NO FOUND"。 注意: •必须在打开索引文件后使用; •不能在非关键字之外的字段中进行查找; •find、seek的缺点:只能按确定值查找,不能使用范围条件