第 3章,VFP数据库及操作
1 创建项目
2
3
4
5
创建数据库创建数据表数据表的基本操作数据表的维护
6
7
数据表排序与索引建立数据字典单词准备:
Database table structure filter
Blank null
delete browse locate continue
append insert recall remove
第 3.1节
1
创建项目方法默认目录 (工作目录 )
建立工作目录:组织和管理磁盘中的各类文件。
为什么要设置默认目录 (工作目录 )?
1) 使新建的文件都保存到固定的文件夹中;
2) 命令中不需要输入很长的绝对路径和扩展名,
直接使用文件名即可,语句简洁 。
创建项目
建立项目文件
1) 菜单
2) 命令,CREATE PROJECT [<项目文件名 >]
打开项目文件 (*.PJX)
1) 菜单:
2)命令,MODIFY PROJECT [<项目文件名 >]
为什么要用项目管理器
项目,数据库和表之间的关系:
项目管理器就像一个分门别类的整理箱,
可以将各种相关资源有效地整合在一起。
数据库就像一个可以放入这个大箱子的小盒子,可以将多个数据表收入其中并进行管理。
第 3.2节
2
创建数据库方法创建数据库
数据库 (.DBC) 存储了所包含的表和表之间的关系,以及依赖于表的视图、连接和存储过程等信息。
1,建立数据库
1) 项目管理器:新建:数据库
2) 菜单:文件?新建:数据库
3) 命令,CREATE DATABASE <数据库名 >
2.在项目中添加数据库数据库的基本操作 (1)
1,打开数据库
1) 项目管理器:选定要打开的数据库,
单击,打开,按钮 。
2) 菜单:文件?打开数据库的基本操作 (2)
3) 命令:
*打开数据库文件
OPEN DATABASE [<数据库文件名 >]
*打开 数据库设计器
MODIFY DATABASE [<数据库文件名 >]
数据库的基本操作 (2)
2.关闭数据库
1) 项目管理器:选定要关闭的数据库,单击
,关闭,按钮 。
注意:关闭数据库和关闭数据库设计器的区别 !!
2) 命令,CLOSE DATABASES
close all &&关闭当前已经打开的所有文件。
数据库的基本操作 (3)
3,删除数据库
1) 项目管理器:
2) 命令:
DELETE DATABASE <数据库文件名 >
第 3.3节
3
创建数据表方法创建数据表
1,数据表( Table) ; 数据库( DATABASE)
数据表 =表结构 +表记录
2,数据表的类型
1) 自由表:不属于任何数据库而独立存在的表 。
2) 数据库表:属于某一数据库的表
数据库表 /自由表转换,,移去,/,添加,命令。
数据表的基本概念 (1)
定义字段:定义表结构。为每个字段指定名称、
数据类型和宽度。
输入数据,确定 表记录。
1)字段名:以字母或汉字开头,由字母、汉字、数字或下划线组成,不能包含空格。
数据库表字段名最长为 128个字符,自由表字段名最长为 10个字符。
数据表的基本概念 (2)
2) 字段类型:存储在字段中的值的数据类型 。
3) 字段宽度:指能够容纳存储数据的长度 (小数点占一位 )。
4) 小数位:数值型 (N)和浮点型 (F)需给出小数位数 。
5) 使用空值:指定字段是否接受空值 (NULL)。
自由表的建立 (1)
1,定义表结构:利用,表设计器,创建表的结构。
1) 菜单:选择,文件 |新建,命令 。
2) 命令,Create <表文件名 >
3) 项目管理器:在,数据,选项卡中选择,自由表,,再选,新建,命令 。
设置表的字段属性:字段名、数据类型、字段宽度和小数位数等。
自由表的建立 (2)
2.输入记录:显示?浏览 (或,编辑,)。
1) 一般数据的输入:浏览 (编辑 )窗口
2) 备注型字段数据的输入:双击名为,memo”
的备注字段标志 。
3)通用型字段数据的输入:双击名为,gen”
的通用字段标志。
备注文件 (.FPT)
若在数据表中定义了备注型或通用型字段,系统将 自动生成备注文件,文件名与表文件名同。
备注文件 是表文件的辅助文件 。 用于 存放数据表中备注型或通用型字段的实际内容 ;它随着表文件的打开而打开,随着表文件的关闭而关闭 。
系统只生成一个备注文件,存放这个表文件中的所有 备注型或通用型字段内容。
在数据库中建立新表
1) 项目管理器,使用项目管理器创建的表自动包含在项目文件中 。
2) 数据库,处于打开状态时,新建立的表自动包含在该数据库中 。
注意:关闭数据库和关闭数据库设计器的区别!!
将自由表添加到数据库
1) 项目管理器?数据库?表?添加,
2) 命令,OPEN DATA <数据库名 >
ADD TABLE <数据表文件名 >
数据库中的表只能属于一个数据库文件 P50。
如果向当前数据库中添加的表已属于其它数据库:先从其它数据库中移去该数据表,然后才能将它添加到当前数据库中。同一个数据库可以属于不同的项目文件 。
从数据库中移去数据表
1)项目管理器?数据库?表?移去,
2)命令,OPEN DATA <数据库名 >
REMOVE TABLE <数据表文件名 >
例:将学生表添加到数据库,教学管理,中,
然后又将其加入到数据库,数据 1” 中。
步骤,1将‘学生’添加到‘教学管理’数据库; 2将‘学生’移去,变为自由表; 3将‘学生’添加到‘数据 1’中 。
第 3.4节
4
数据表的基本操作掌握数据表的浏览
1,打开数据表。 1)菜单:
2) 命令,USE [<表文件名 >]
2,浏览与显示表结构 。
1)浏览表结构 (打开表设计器 ):
① 项目管理器:选定要浏览的表,单击,修改,按钮
② 菜单:打开要浏览的数据表 --,显示 |表设计器,
③ 命令方式,MODIFY STRUCTURE
2)显示表结构
命令,LIST|DISPLAY STRUCTURE
在浏览窗口中浏览记录
① 项目管理器:选定表,单击,浏览,按钮 。
对于备注型字段或通用型字段内容,可以在浏览窗口中双击相应的字段标志 (,Memo”或
,Gen”),打开 。
② 菜单:打开数据表,显示?,浏览,或,编辑,。
③ 命令,BROWSE/EDIT
有选择地浏览 (菜单方式 )
打开浏览窗口 --“表 |属性”,出现“工作区属性”
对话框。
在,数据过滤器,中输入筛选条件 。 例:性别 =’
女 ’
在,允许访问,中:,字段筛选指定的字段,?,字段筛选,,打开,字段选择器,对话框,选择要显示的字段 。
有选择地浏览 (命令方式 )
设置数据过滤器,SET FILTER TO [<条件 >]
例,use student
set filter to len(alltrim(姓名 ))=4
brow
set filter to &&取消数据过滤器
Brow
设置字段过滤器,SET FIELDS TO ALL| <字段名表 >
显示数据表的记录
将数据表的记录显示在主窗口:
命令,LIST | DISPLAY
例,use student
list [fields] 学号,姓名,系别 for ;
len(alltrim(姓名 ))=4
*显示姓名为 2个字的学生的学号,姓名,系别。
记录的定位 (1)
1,记录指针:按照输入数据的顺序存放记录号。
2,移动记录指针
1) 菜单:打开浏览窗口,表?转到记录 。
2)命令
绝对移动,GO <记录号 > | TOP | BOTTOM
相对移动,SKIP [+|-][<算术表达式 >]
功能:将记录指针从当前位置向前或向后移动若干条记录位置 。
记录的定位 (2)
条件定位,LOCATE [<范围 >] FOR <条件 >
[WHILE <条件 >]
功 能,查 找 满 足 条 件 的 第 一 条 记 录 。
CONTINUE,查找下一条 。
例,LOCATE FOR 性别 =,男”
DISP
CONTINUE
思考题:
如何查找并显示全部入学成绩在 500到 600之间的学生?
List for 入学成绩 >=500 and 入学成绩 <=600
*其中 List可以换成 disp all
看看自己是不是用 locate for做的呢?千万不要因为学了复杂的,就忘记了前面学过的简单的方法哟!
第 3.5节
5
数据表的维护掌握修改表结构
在表设计器中可以修改表结构 。
1.项目管理器,选定要修改的表?修改 。
修改表结构:修改字段,增加字段,删除字段,
改变字段顺序 。
2,菜单,在表打开的情况下选择,显示 |表设计器,
3,命令,Modify Structure
1.追加 (在表末尾 )记录
1) 菜单:打开浏览窗口,选择
显示?追加方式,可追加多条新记录 。
表?追加新记录,每次只能添加一条新记录 。
2) 命令,APPEND可追加多条新记录
append blank &&不打开浏览或编辑窗口,直接追加一条空记录。
2.插入记录
命令,INSERT [ BEFORE] [BLANK]
功能:在数据表的某个记录之前或之后插入一条记录 。
例:如何在第 2条记录之后插入空记录?
go 2 或 go 1
insert blank insert blank before
如何在第 7条纪录之前插入 记 录?
3.从其它文件中追加记录
1) 菜单:打开浏览窗口,表?追加记录 。
2) 命令,append from <文件名 >[fields<>] [for <>]
功能:将满足条件 (for)的记录按指定的字段 (fields)
从源表文件 (from)中追加到当前数据表的末尾 。
要求:名称和类型相匹配的字段内容才可以追加 。
例,use 学生
append from student fields姓名,学号 for 性别 =’ 女 ’
1,在浏览窗口中编辑记录
1) 项目管理器:将目录展开并选择要修改的表文件名?浏览 。
2 ) 命 令,BROWSE [FIELDS< 字 段 名 表
>][FOR<条件表达式 >]
例:浏览学生表中 81年出生的男学生。
Brow for year(出生日期 )=1981 and 性别 =‘男’
2.批量修改记录 (1)
对一批记录中的若干字段进行编辑修改 。
1) 菜单:打开数据表浏览 (或编辑 )窗口,
表?替换字段 。
2)命令,REPLACE [<范围 >][<字段 1>
WITH <表达式 1> [FOR <条件 >]
2.批量修改记录 (2)
既没有 <范围 >又没有 FOR<条件 >的时候,默认只替换当前的一条记录。故最好写上范围,如
replace all ……
例:在表中添加一个,身高,(N,3)字段,用
replace命令和 iif函数为这个字段赋值,使得所有女生的身高为 160cm,男生的身高为 180cm。
Replace all 身高 with iif(性别 =‘女’,160,180)
1,逻辑删除,
1)鼠标操作:在浏览窗口中,单击左侧的白色方框使之变黑。
2) 菜单:表?删除记录,设置,删除,对话框 。
3) 命令,DELETE <范围 > FOR<条件 >
和 replace命令相似,若 delete命令中没有 <范围 >
和 <条件 >子句,则默认只删除当前的一条记录 。
例:如何为九九级的同学打上删除标记?
Delete all for left(学号,2)=‘ 99’
2,恢复逻辑删除
1) 鼠标操作:单击删除标记,取消黑色方框 。
2) 菜单:选择,表 |恢复记录,命令,设置,恢复记录,对话框 。
3) 命令,RECALL [<范围 >] [ FOR <条件 >]
例:先逻辑删除所有计算机专业的学生,再全部恢复。
Delete all for 专业 =‘计算机’
Recall all
3.物理删除:
从磁盘上删除所有带有删除标记的记录,不可恢复 。
1) 菜单:表?彻底删除 。
2) 命令,PACK
ZAP ( 清除表中所有记录,仅保留表结构 )
等价于,delete all
pack
1.数据表文件的复制
1)菜单:打开表文件,选择,文件 |导出,,
设置,导出,对话框 。
2)命令,COPY TO <新表文件名 > [<范围
>][FIELDS <字段名表 >][FOR <条件 >]
若无任何选项,则复制一个完全相同的表 。
例:将 01级学生资料复制到,stu_01”表中 。
Copy to stu_01 for left(学号,2)=’ 01’
2.数据表结构的复制
将表结构复制到一个新表中 。
命令:
COPY STRUCTURE ;
TO <新表文件名 >;
[FIELDS <字段名表 >]
表结构的复制举 例:
利用 student表的表结构,建立一个新的’录取情况’表,包括:学号,姓名,录取情况三个字段。并显示新表结构。
Use student
Copy to 录取情况 fields 学号,姓名,录取情况
Use 录取情况
List structure
第 3.6节
6
数据表排序与索引理解数据表排序 (1)
排序是把数据表中的记录按照某个字段值的大小重新排列,作为排序依据的字段称为,关键字,。 字段之间用逗号隔开 。
排序后生成一个 新 的数据表文件,其结构和数据可以与源文件完全相同,也可以取自源文件的一部分字段 。
数据表排序 (2)
命令,SORT TO <文件名 > ON <字段名 1>
[/A][/D][/C] [,<字段名 2>[/A][/D][/C]…]
[ASCE/DESC][<范围 >][ FOR <条件 >]
[FIELDS <字段名表 >]
缺点:生成新文件,占用较多的存储空间,且不能更新。
数据表排序举例
例,对,student”表按,专业,升序排序,专业相同 的 按,学号,降序排序 。 文件 名为,各系学生,,查看排序文件,
USE student
SORT TO 各系学生 ON 专业,学号 /D
Use 各系学生
brow
数据表索引基本概念
索引:是由指向表记录的指针构成的文件,
这些指针 逻辑上 按照索引关键字的值进行排序 。
索引文件和表文件分别存储,并且不改变表中记录的物理顺序 。
索引的类型 (1)
① 独立索引:在索引文件中只包含一个单一的关键字或者组合关键字的索引,独立索引文件的扩展名为 IDX。
② 结构复合索引,在索引文件中可以包含多个索引项的索引。结构复合索引文件的扩展名为 CDX,是最常用的一种索引类型。
索引的类型 (2)
③ 非结构复合索引,索引文件的扩展名也是 CDX,但文件名与数据表文件名不相同,它不会随着数据表文件的打开而打开,需要使用单独的打开命令。
结构复合索引的特点:
1.结构复合索引的文件名与数据表 文件名相同
2.在用一索引文件中可以包含 多个索引关键字
3.在打开数据表时 自动打开
4.对表进行添加、修改、更新、删除等操作时自动维护 索引索引关键字
索引关键字:建立索引用的字段或字段表达式,
可以是表中的单个字段,也可以是几个字段组成的表达式 。
复合索引表达式 通常用字符串运算符,+” 将几个字段 连接 起来 。 当各 字段类型不同 时,必须转换为相同的数据类型 。
创建索引文件时就是根据索引关键字值的大小从逻辑上重新安排数据表中各条记录的组织顺序。
索引关键字的类型 (1)
① 主索引 (Primary Indexes),索引表达式的 值唯一,即记录不允许有重复值 。 只有数据库表才有主索引,有且仅有一个 。
② 候选索引 (Candidate Indexes),索引表达式的 值唯一,即记录不允许有重复值 。 一个表可以有多个候选索引 。
索引关键字的类型 (2)
③ 惟一索引 (Unique Index),索引表达式的值惟一,若有重复,只取第一个值 。 一个表可以有多个唯一索引 。
④ 普通索引 (Regular Indexes),索引表达式的值允许有重复。 一个表可以有多个普通索引。
建立结构复合索引
1) 利用表设计器:选择,索引,选项卡 。
2)命令,INDEX ON <索引关键字表达式 >
TAG <索引标识名 >[ UNIQUE|CANDIDATE]
[ASCENDING|DESCENDING][FOR <>]
默认为普通索引 。
索引标签 (TAG)的命名规则和字段名类似,只能由汉字,字母,下划线组成。 注意不要将下划线误写为减号!!
结构复合索引举例
例:用 INDEX命令为,学生,表建立结构复合索引,包含 4个索引项:学号 ( 候选索引 ),
入学成绩降序 (普通索引 ),专业与性别 ( 普通索引 ),出生日期 ( 普通索引 ) 。
USE 学生
INDEX ON 学号 TAG xh CANDIDATE
INDEX ON -入学成绩 TAG cj
INDEX ON 专业 + 性别 TAG xib_xb
INDEX ON 出生日期 TAG sr
排序与索引小结 (1)
1.排序的升 /降序可写为 /A,/D或 asce,desc(P82);
但是索引的升 |降序只能写为 asce或 desc(P86)。
若在一个索引表达式中有的要求升序,有的要求降序,则想办法用函数实现 。
2.主索引只能在数据库表设计器里操作,用
index命令只能建立普通索引,唯一索引 unique
和候选索引 candidate,不能建立主索引,因为只有数据库表才有主索引 。
排序与索引小结 (2)
3.删除索引,dele tag <索引标识名 >;全部删除
dele tag all
4.表的显示只由一个索引 ( 当前索引 ) 控制,但在修改表时,所有已打开的索引文件都将被更新 。
5.索引的建立方法不同,则 seek语句的写法也不同 。
6.注意标点符号写法 (西文状态 ),函数的用法 。
7.每一行输入完要按回车键,否则等于没有输入 。
排序与索引小结 (3)
有字段要求 fields
有条件 for
范围 all/next n/rest,不加 for
按关键字操作 on
索引标识前 tag
显示 /分屏显示 /浏览 list/display all/browse
追加 /输入记录 append
按索引顺序浏览记录
一个复合索引文件中可以建立多个索引项,每一项代表了处理记录的一种 逻辑顺序 。 使用索引之前,应先指定将要使用的索引项 。 P87
1) 菜单:打开浏览窗口,选择,表 |属性,命令,
打开,工作区属性,对话框,在,索引顺序,
框中选择一个索引项,浏览窗口中的记录就会按按照该索引顺序排列 。
2) 命令,SET ORDER TO [TAG <索引标识名 >]
数据表查询命令
数据表建立索引后,就可以使用 FIND,SEEK
等查询命令,快速定位记录,提高数据库应用系统的运行效率 。
要求:已经按查找关键字设置了索引 。
1.FIND命令,FIND <字符串 >|<数值 >
2.SEEK命令,SEEK <表达式 >
FIND命令
只能查找字符型和数值型的索引关键字,字符串可以省略定界符 。
当通过字符型内存变量检索时,必须用宏代换 &。
不能用表达式 。
x='0101019'
find x &&查找字符 ‘ x’
find &x &&按内存变量 x的内容检索
SEEK命令 (1)
可以处理任意类型的关键字表达式,但常量的定界符不能省略 。
这两条命令可以快速查找表中索引关键字值与表达式相匹配的第一条记录 。 若要继续查找表中其他满足条件的记录 ----执行 SKIP命令 。
例( 假设学生表已经打开,索引已经建好):
1如何查找学号为 01020215的学生记录??
2如何查找计算机系男生的记录??
SEEK命令 (2)
1 如何查找学号为 01020215的学生记录??
SET ORDER TO TAG xh
FIND 01020215
SEEK,01020215”
2 如何查找计算机系男生的记录??
SET ORDER TO TAG zy_xb
SEEK,计算机,+,男,
数据表统计与汇总 (1)
1,数据表的统计
1) 计数,COUNT [范围 ] [for<条件 >][to<内存变量名 >]
2) 求和,SUM
3) 求平均值,AVERAGE
请写出能完成如下功能的命令:
1 统计 23岁的学生人数,并存入变量 rs_23中;
2 计算 01级学生的总分,并存入变量 zf_01中;
3 计算 01级学生的平均分;
数据表统计与汇总 (2)
2.数据表的分类汇总
对数据表中的数值型字段,按照 排序 或 索引 关键字值的不同分类,然后各组分别求和 。
要求:分类汇总前一定要按照关键字字段进行 排序 或 索引 。
命令,TOTAL ON <汇总关键字 > TO <表文件名 >
例:在课程表中按专业类别汇总学分和课时 。
Index on 专业 tag zy
Total on 专业 to zyhz fields 学分,课时第 3.7节
7
建立数据字典方法建立数据字典
数据库文件可以作为一个数据字典来存储和管理有关记录和字段的规则、缺省值、触发器、表间关系等。
数据库表是数据库的一部分,具有自由表所没有的一些属性。
设置表的字段属性
1.长字段名,自由表的字段名最多 10个字符,数据库表的字段名最多 128个字符。
2.输入掩码,限制输入字段的内容格式,屏蔽非法输入 。
3.格式 (输出掩码 ),决定字段的显示方式 。
4.标题,字段标题将作为该字段在浏览窗口中的列标题,以及表单表格中的默认标题名称 。
5.字段注释,为字段添加注释,使表更容易被理解 。 也可以在,表,选项卡的,表注释,框中为整个数据表添加注释 。
设置字段的默认值
1,默认值,如果某个表的字段在大部分记录中都有相同的值,则可以预先设定一个默认值,
以加快数据的输入速度。
默认值可以是一个具体的值或者任何有效的
VFP表达式,但表达式的返回值的类型必须和该字段的数据 类型一致 。
在输入数据时,VFP自动为该字段填入默认值。
默认值不影响已经存在的记录!!
有效性规则
2,字段的有效性规则,将输入的数据与所定义的规则表达式进行比较,如果输入的值不满足规则要求,系统就拒绝修改,从而减少输入信息的错误。
3,表的有效性规则,比较同一记录中两个或多个字段的输入值,确保它们遵守一定的规则。
与字段有效性规则不同,表的有效性规则是当记录的值被改变后,记录指针准备离开时被激活的。
设置触发器
触发器是指当进行输入、删除或更新表记录等操作时,系统自动启动的一个检测程序,检测结果为真时,接受此次操作;否则,还原为操作前的状态。
1)插入触发器:
2)更新触发器:
3)删除触发器:
创建永久关系 (1)
永久关系是数据库表之间的关系,作为数据库的一部分 存储在数据库文件中。
所以称为永久关系。
建立关系的两个表通常具有公共字段或语义相关的字段,其中含主关键字段的表称为父表,含外部关键字段的表称为子表。子表和父表是相对的。
创建永久关系 (2)
1.建立关系,对主关键字段和外部关键字段使用相同的索引表达式分别建立索引;在,数据库设计器,中,将父表的索引拖到子表相匹配的索引上 ( 两表之间显示一条关系线 ) 。
2.编辑关系,右击关系线,选择,编辑关系,命令 。
3.删除关系,右击关系线,选择,删除关系,命令。
参照完整性 (1)
参照完整性是指建立一组规则 。 建立了关系的两个数据库表,通过实施参照完整性规则,可以确保:
父表中没有关联记录时,记录不得添加到子表中;
改变主表的值导致子表中出现孤立记录时,不允许改变;
主表记录在子表中有匹配记录时,该主表记录不能被删除 。
参照完整性 (2)
参照完整性规则:更新规则、删除规则、
插入规则。
如果在父表中删除了一条记录,则当子表中有相关的记录时,这些记录就成了孤立的记录;
当在父表中修改了索引关键字的值,那么还需要修改子表中相应记录的关键字值,否则就会产生错误 。 反过来也一样;
参照完整性 (3)
在子表中增加记录时,如果所增加记录的关键字值是父表中没有的,则增加在子表中的记录也成了孤立的。
出现以上的任何一种情况,都会破坏关系表的完整性。在 VFP中通过建立参考完整性,可以防止这些问题的出现。