数据库应用与开发
第一章 概述
第一节 数据库系统概述
一,数据处理方法的演变
?数据库应用系统
? 订票系统
? 银行系统
? 企业管理信息系统
? 学校教务管理系统
? ……
1.数据处理的特点
? 数据存储:长期保存、大容量
? 数据实时处理
? 基本数据操作:查询,更新(增、删、改)
——基于大容量存储数据的操作
? 对数学运算能力要求相对不高,通常是简单
的算术运算、统计运算
? 面向多种应用(多用户):共享、并发访问
? 数据安全性要求
? 数据完整性要求
2.数据库技术的产生
发展:技术本身的发展
实际需求的要求
数据管理方法的演变经历了三个阶段,
? 人工管理阶段
? 文件系统阶段
? 数据库系统阶段
- 数据的结构化,面向整体的观点组织数据
- 数据共享,可控冗余度
- 高度的数据和程序独立性
- 提供安全性、完整性及并发访问等控制功能
三、数据库应用与开发
用数据库管理系统 ( 数据库语言及其工具 )
解决实际问题, 其 过程 分两步,
- 数据库设计
- 数据库的实现及其操作
用 数据模型 描述现实世界的问题, 并对数
据模型实施操作, 实现相应的数据处理 。
1.数据库设计
用 关系数据模型 描述现实世界, 即设计 关
系 (表 ),主 码, 索引, 外码, 关联 等 。
所需 基础 知识,
信息系统分析与设计 / 管理信息系统
——分析现实世界的信息需求
数据库原理
——设计 结构良好 的数据库
示例,主码 (Sno+Cno)
Sno Name Gen,Birth Addr,Cno Subj,Time Credit Score
01 张强 M 78/9/1 X C01 数学 96 6 85
01 张强 M 78/9/1 X C02 英语 124 8 90
01 张强 M 78/9/1 X C03 物理 56 3.5 83
02 田丽 F 77/2/25 W C02 英语 124 8 90
02 田丽 F 77/2/25 W C04 化学 64 4 88
02 田丽 F 77/2/25 W C05 生物 48 3 75
03 王东 M 78/11/18 X C01 数学 96 6 78
03 王东 M 78/11/18 X C03 物理 56 3.5 80
03 王东 M 78/11/18 X C04 化学 64 4 92
结构不好存在的问题
? 数据冗余
? 插入异常
? 删除异常
? 修改异常
2.数据库的实现及其操作
在计算机系统中物理地实现所设计的数据
库, 并对数据库实施操作, 即使用数据库中的
数据 ——对数据库进行增删改, 查询等操作 。
工具,数据库 管理系统 ( DBMS)
如 Oracle,Sybase,SQL Server,DB2,
Visual FoxPro等 。
四、数据模型
在数据库系统中,数据库设计的核
心问题就是设计一个好的数据模型,数
据模型的好坏直接影响数据库的性能。
目前流行的数据模型是 关系数据模
型 。
1.关系数据模型
关系 数据 模型是把 现实世界信息需求 的数据逻辑
结构归结为满足一定条件的二维表 的 模型 。 一个 二维
表 就是一个 关系, 描述问题的所有 二维表的集合 就构
成了一个 关系数据 库 。
从理论上定义, 关系是 笛卡尔积 的任意一个子集 。
从直观上看, 关系就是一个具有横行 ( 记录 ) 和竖列
( 字段 ) 的一张二维表 。 日常工作和生活中的各种报
表, 如工资表, 学生成绩表, 人事档案表, 产品库存
表, 生产报表等都具有二维表的结构, 可以很方便地
表示成关系数据模型中的一个关系 。
?关系数据模型示例
Sno Cno Score
01 C01 85
01 C02 90
01 C03 83
02 C02 90
02 C04 88
02 C05 75
03 C01 78
03 C03 80
03 C04 92
Sno Name Gen,Birth Addr,
01 张强 M 1978/9/1 X
02 田丽 F 1977/2/25 W
03 王东 M 1978/11/18 X
Cno Subj,Time Credit
C01 数学 96 6
C02 英语 144 12
C03 物理 64 4
C04 化学 64 4
C05 生物 48 3
?关系数据模型分析
Sno Name Gen,Birth Addr,
字段
记录 数据
01 张强 M 1978/9/1 X
02 田丽 F 1977/2/25 W
03 王东 M 1978/11/18 X
……
结构
表中含有几个字段:字段名、字段类型、字段宽度、小数位
学生表
?相关术语之间的联系
Database(数据库 ) University Database
Student Table,Course Table,Score Table,……
Table(表 ) Cno Subject Time Credit
C01 数学 96 6
C02 英语 144 12
C03 物理 64 4
……
Cno Subject Time Credit
Record(记录 ) J101 数学 160 10
Fields(字段 ) J101
Byte(字节 ) 01001010 (字母 J的 ASCII码 )
Bit(位 ) 0
2.关系的性质
? 一个关系中的任意两个记录不能相同;
? 关系的每列都必须有不同的名字;
? 列是同质的, 即关系的每列都是同类型的数据;
? 关系的行, 列的次序不影响其信息内容, 可以
任意交换;
? 关系的每个分量都必须是不可分的基本数据项;
? 每个关系都必须至少有一个关键字(即主码)
唯一标识它的记录。
3.关系的码
定义 1:若关系中的某一字段或一组字段的值
能唯一地标识关系的一个记录,则称该字段
或字段组为关系的 候选码 。若一个关系有多
个候选码,则选定其中一个为 主码 。
定义 2,F是关系 R的某一字段或一组字段,但
不是关系 R的主码,如果 F与关系 S的主码对
应,则称 F是关系 R的 外码 。
Dno Dname Dloc Dmgr
D-01 财务部
D-02 生产部
D-03 销售部
D-04 供应部
D-05 人事部
Eno Ename Title Salary Dno
E-001 张立 D-01
E-002 赵洪新 D-01
E-003 王强 D-03
E-004 齐东 D-02
E-005 孙海 D-02
E-006 刘伟 D-03
E-007 卫希凯 Null
Department Table
Employee Table
?码的示例
关系之间是通过主码和外码相互关联的
4.其他二维数据组织形式
电子表格 ( Excel,Lotus)
二维数组
文本数据文件 (*.txt,*.dat)
?数据的引用与数据所在的位置有关, 即地
址相关 。
?而关系中数据的引用是地址无关的 ——数据
和程序相互独立 。
第二节 Visual FoxPro简介
一,VFP的发展
20世纪 70年代末,DbaseⅡ, Ashton-Tate公司
1984/1985年 DbaseⅢ/ DbaseⅢ+
1987年 FoxBASE+,FOX公司
1989年 FoxPro for DOS
1993年 FoxPro for Windows,微软公司
1995年 Visual FoxPro
Visual FoxPro
FoxPro
FoxBase
xBase
版本号 运行平台
8.0/7.0 Windows 2000
6.0 Windows 95/98
5.0 Windows 95/98
3.0 Windows 95/98
2.5/2.6 Dos,Windows 95/98
2.0 Dos
1.0 Dos
Dos
Dos
发展 兼容
二、启动 VFP,退出 VFP
1,启动 /运行 VFP
桌面快捷方式
开始菜单 - 程序 - Visual FoxPro
2,退出 VFP
在系统菜单, 文件, 中选择, 退出,
在命令窗口中执行, QUIT‖命令
桌面快捷方式启动 VFP
用开始菜单启动 VFP
三,VFP的界面
1,初始界面
2,命令窗口
3,系统菜单
4,对话框
5,工具栏
Visual FoxPro 6.0的初始界面 (一 )
Visual FoxPro 6.0的初始界面 (二 )
Visual FoxPro 6.0的系统菜单
Visual FoxPro 6.0的对话框
四,VF的命令执行方式
1,命令方式
在命令窗口中输入要执行的命令,以回车结束命
令,并开始执行命令。
2,菜单引导方式
在 FoxPro的系统菜单中选择相应的菜单选项,在
对话框中填写命令参数,执行命令。
3,程序执行方式
编写 FoxPro源程序 (命令程序 ),运行程序,按照
程序的逻辑结构执行程序中的命令。
五、关于 VF的命令和函数
? 除 @ … 命令, ON … 命令外, VF的命令均以 英语动
词开头, 结构为,命令动词 + 若干修饰子句 ;
? 命令中的保留字和函数名几乎都采用完全或缩写的
英语单词, 因而容易理解和记忆;
? 命令中的保留字和函数名 不区分字母的大小写 ;
? 在多数情况下, 保留字和函数名可以简化使用其前
四个字母 即可 。 例如, 的命令 DISPLAY STRUCTURE
可简化为 DISP STRU,DISP STRUCTURE,DISPLAY
STRU,函数 ISUPPER()可简化为 ISUP()。
五、关于 VF的命令和函数
? 除少数子句外, 命令中起限制和修饰作用的子句,
可在命令中以 任意顺序 出现 。 因此, 下述几个命
令是完全等效的,
LIST FIELDS sno,name,score FOR score>=590
ALL OFF TO PRINTER
LIST FOR score>=590 FIELDS sno,name,score
ALL OFF TO PRINTER
LIST ALL OFF FOR score>=590 FIELDS sno,name,
score TO PRINTER
LIST TO PRINTER OFF ALL FOR score>=590
FIELDS sno,name,score
六、命令语法约定
<…> 选择该项时, 尖括号中的内容必须代之以
实际数据;
[…] 任选项, 表示其中的内容可以选择也可以
不选择;
…|… 择一选项, 表示应从列出的内容中选择一
项 。
一般, 用大写字母标识符代表 FoxPro系统
的保留字, 小写字母标识符为由用户使用
时填写的项, 如文件名, 变量名等 。
七,VF的辅助设计工具
? 向导 ——向导是一种快捷的设计工具, 它通
过一组对话框依次与用户对话, 引导用户分
步完成 VFP的某项任务 。 VFP 6.0有 21种向导,
参见 P22,表 1.2。
? 设计器 ——与向导类似, 用来帮助用户创建
或修改 VFP应用程序所需的构件, 如表, 表单,
菜单等 。 VFP 6.0有 9种设计器, 参见 P23,
表 1.3。
? 生成器 ——帮助用户在 VFP应用程序的构件中
生成并加入某类构件, 如文本框, 表格等 。
VFP 6.0有 10种生成器, 参见 P24,表 1.4。
八、数据类型 (熟练掌握)
? 字符型 (C),0-254个字节的文本数据,如学号,姓名,性别,
邮政编码,电话号码,身份证号,产品名称等。
? 数值型 (N),由正负号、整字和小数点组成且能用于数值运算
的数据,如产量,价格,库存量,成绩,工资额等。
? 日期型 (D),由年份、月份、日组成的表示日历日期的数据,
如生日,交货日期等。
? 逻辑型 (L),由真值、假值两个值组成的表示逻辑判断结果的
数据,如婚否,党员否等。
? 备注型 (M),超过 254个字节的长文本数据,如工作经历,奖惩
情况等。
八、数据类型 (了解)
?日期时间型 (T):由年份、月份、日、时、分、秒组成
的表示某一时刻时间的数据,如交款时间,采样时间
等。
?整型 (N),不带小数的数值,如年龄,成绩等。
?货币型 (Y),表示货币的数值,如价格,工资额等。
?浮动型 (N),用科学记数法表示的数值。
?双精度型 (N),表示高精度要求的数值。
?通用型 (G),用来存放多媒体数据,如照片,图片等。
九、文件类型及其扩展名对照表
文件类型 扩展名 文件类型 扩展名
数据表
备注文件
单条目索引文件
复合索引文件
源程序文件
编译程序文件
表单定义数据表
表单定义备注文件
菜单定义数据表
菜单定义备注文件
生成的菜单程序
编译菜单程序
DBF
FPT
IDX
CDX
PRG
FXP
SCX
SCT
MNX
MNT
MPR
MPX
项目管理数据库
项目管理备注文件
文本文件
视图文件
报表文件
报表备注文件
标签文件
标签备注文件
生成的查询程序
编译查询程序
可执行文件
应用程序文件
PJX
PJT
TXT
VUE
FRX
FRT
LBX
LBT
QPR
QPX
EXE
APP
第二章 表的基本操作
? 建立新表
? 表达式
? 记录指针
? 记录的增删改
? 表的其他操作
第一节 建立新表
建立表:建立表的结构 ——定义新表
输入数据记录 ——对表的操作之一
定义 /建立表结构,
表名 (*.DBF)
字段名
字段类型
字段宽度(小数位)
是否建索引
字段是否可为空
1.如何建立新表
a) 表结构的逻辑设计 ——数据模型设计,即,
? 建立几个表
? 每个表里包含哪些数据项
? 每个数据项采用什么数据类型
? 每个表的主码
? 是否需要建立索引
b) 在 VF中实现表结构
c) 向表中输入初始数据记录
2.用表设计器创建新表的结构
? 命令方式
CREATE student↙
? 菜单引导方式
文件 (F)—新建 (N)—表 (T)—新建文件 (N)
* 菜单引导方式
* 各类型数据的字段宽度
系统自动设置,
?逻辑型, 1
?日期型, 8
?日期时间型, 8
?整型, 4
?货币型, 8
?备注型, 4
?通用型, 4
由用户定义,
?字符型, 0-254
?数值型, 20
?浮动型, 20
?双精度型, 8
小数点
宽度 = 整数位 +小数位 +1+1
符号位
* 关于备注 /通用型字段
?当定义备注 /通用型字段时,系统自动产生
同名的备注文件 (*.FPT),作为表文件的辅
助文件;
?在表文件中,备注 /通用型字段宽度为 4个字
节,存储指向备注文件的地址信息,相当于
指针;
?备注 /通用型数据实际存储在备注文件中,
所占用字节数根据实际情况按 512字节倍数
递增;
?备注文件不能单独使用。
* 结束退出表设计器
保存退出
? 点, 确定, 按钮
? 按 <Ctrl+W>键
不保存退出
? 点, 取消, 按钮
? 按 <Ctrl+Q>键
? 按 <Esc>键
3.打开和关闭表
? 打开表
USE <filename>
文件 (F)—打开 (O)—―表 (*.dbf)‖
? 关闭表
USE
CLOSE TABLES
CLOSE DATABASES
CLOSE ALL
CLEAR ALL
窗口 (W)—数据工作期 (D)—―关闭, 按钮
?关于表文件打开方式
? 独享方式 ——EXCLUSIVE
对表结构、表记录操作没有限制
? 只读方式 ——SHARED
可以显示表结构,但不可以修改表结构
对表记录操作没有限制
设置命令,
SET EXCLUSIVE ON|OFF
USE … EXCLUSIVE | SHARED
默认为独享方式打开
?示例
SET EXCLUSIVE ON
USE student

USE student EXCLUSIVE
------------------------------------
SET EXCLUSIVE OFF
USE student

USE student SHARED
4.表中初始数据的输入
? 在上一步保存退出遇, 现在输入记录, 时选择 Y,

直接进入数据输入窗口。
? 在上一步保存退出遇, 现在输入记录, 时选择 N,

从键盘直接录入,BROWSE 命令 (按 Ctrl+Y键 )
APPEND 命令
显示 (V)—浏览 (B)
从数组中间接输入,APPEND FROM ARRAY 命令
从其他文件间接输入,APPEND FROM 命令
BROWSE [FIELDS <field list>] [FONT <font> [,<size>]]
[STYLE <style>]
[FOR <expL1> [REST]] [FORMAT] [FREEZE <field name>]
[KEY <expr1> [,<expr2>]] [LAST | NOINIT]
[LOCK <expN1>] [LPARTITION] [NAME <object name>]
[NOAPPEND] [NODELETE] [NOEDIT | NOMODIFY]
[NOLGRID] [NORGRID] [NOLINK] [NOMENU]
[NOOPTIMIZE] [NOREFRESH] [NORMAL] [NOWAIT]
[PARTITION <expN2> [LEDIT] [REDIT]]
[PREFERENCE <expC1>] [SAVE]
[TIMEOUT <expN3>] [TITLE <expC2>]
[VALID [:F] <expL2> [ERROR <expC3>]]
[WHEN <expL3>] [WIDTH <expN4> ]
[WINDOW <window name1>]
[IN [WINDOW] <window name2> | IN SCREEN]
[COLOR SCHEME <expN5>]
命令格式,
APPEND [BLANK] [IN <expN> | <expC>] [NOMENU]
两种方式,
APPEND BLANK IN <expN> |<expC>
以非交互方式直接追加一个空记录。
APPEND IN <expN> |<expC>
以交互方式追加数据记录。
? 以交互方式追加数据记录
APPEND FROM <file name> |?
[FIELDS <field list>] [FOR <expL>]
[[TYPE] [DELIMITED [WITH <delimiter> | WITH
BLANK | WITH TAB
| WITH CHARACTER <delimiter>]
| DIF | FW2 | MOD | PDOX | RPD | SDF | SYLK
| WK1 | WK3 | WKS | WR1 | WRK | CVS
| XLS | XL5 [SHEET <sheet name>] | XL8
[SHEET <sheet name>]]]
[AS <code page>]
5.表结构的修改
? 何时需要修改表结构
增加字段
删除字段
修改字段名、类型、宽度、小数位、置空否
修改索引
? 修改表结构的命令
MODIFY STRUCTURE
? 菜单引导修改表结构
显示 (V)—表设计器 (L)
6.显示数据记录
交互方式:同时可编辑数据记录
BROWSE命令
显示 (V)—浏览 (B)
非交互方式:仅显示、不可编辑数据记录
LIST命令
DISPLAY命令
(1) LIST/DISPLAY命令格式
LIST [[FIELDS] <field list>]
[<Scope>] [FOR <expL1>] [WHILE <expL2>]
[OFF] [NOCONSOLE] [NOOPTIMIZE]
[TO PRINTER [PROMPT] | TO FILE <filename>]
DISPLAY [[FIELDS] <field list>]
[<Scope>] [FOR <expL1>] [WHILE <expL2>]
[OFF] [NOCONSOLE] [NOOPTIMIZE]
[TO PRINTER [PROMPT] | TO FILE <filename>]
(2) LIST/DISPLAY命令解释
FIELDS <field list>
指定输出的字段(列选择)
<scope>
指定输出的数据记录的范围(行选择)
FOR <expL> 或 WHILE <expL>
指定输出的数据记录的条件(行选择)
TO PRINTER [PROMPT] | TO FILE <filename>
指定数据输出到何处,显示器,打印机,文件?
默认为输出到显示器。
(3) 关于范围选择子句
范围选择子句 <scope>按指定的范围选择
命令要操作的数据记录 。 它有四种形式,
ALL:限定可对文件中的所有记录操作;
NEXT <n>:对文件中当前记录之后的 n个记
录操作;
REST:对文件中当前记录之后的剩余记录
操作;
RECORD <n>:限定只对文件中的第 n个记录
操作 。
(4) LIST和 DISPLAY命令的差别
? 当命令中无 <scope>,FOR,WHILE子句时,
LIST默认为输出数据库中 所有 的记录;
DISPLAY仅输出 当前 记录 。
? LIST为 连续 输出数据;
DISPLAY在输出结果满一屏时, 系统自动暂
停, 按任意键后继续显示 。
(5) 示例
LIST FIELDS sno,name,major FOR gender= "女 "
(5) 示例
GO TOP
LIST sno,name,major NEXT 5
(5) 示例
SKIP
DISPLAY
(5) 示例
DISPLAY ALL
7.显示表结构
LIST STRUCTURE
[IN <expN> | <expC>]
[NOCONSOLE]
[TO PRINTER [PROMPT] | TO FILE <filename>]
DISPLAY STRUCTURE
[IN <expN> | <expC>]
[NOCONSOLE]
[TO PRINTER [PROMPT] | TO FILE <filename>]
第二节 表达式
表达式的构成,变量,常量,函数,运算符
类型,值
变量:字段变量,内存变量
函数:系统函数,用户定义函数
运算符,P49,表 2.6
算术运算符
关系运算符 优先级
逻辑运算符 运算对象
字符运算符 (+,-)
1.常量 (1)
数值型 /货币型 /浮动型 /整型 /双精度型常量,
100
-305.23
1.05E+5
字符型常量,
双引号,"Good Morning!"
单引号,'Good '
方括号,[Morning]
1.常量 (2)
日期型常量,
{^yyyy-mm-dd}或 {^yyyy/mm/dd}或 {^yyyy.mm.dd}
{^2001/09/26}
日期时间型常量,
{^yyyy-mm-dd [hh[:mm[:ss]] [a|p]]}
{^2001/09/29 4:10 p}
逻辑型常量,
真值,.T.,Y.,t.,y,
假值,.F.,N.,f.,n,
2.变量
字段变量,
可为任意数据类型。
内存变量,可是如下数据类型,
N,数值型 (货币型 /浮动型 /整型 /双精度型 )
C,字符型 (备注型 )
D,日期型
T,日期时间型
L,逻辑型
不能是通用型的。
3.表达式示例 (1)
25+100-(12*8-7)+54/9 数值 42
"Good "+"afternoon!" 字符串 "Good afternoon!"
"Good "-"afternoon!" 字符串 "Goodafternoon!"
{^2004/10/01} > {^2004/09/26} 逻辑 真 值
{^2004/09/29 4:00 p}>{^2004/09/29 8:00}
逻辑 真 值
"abcd"="ABCD" 逻辑 假 值
"abcd"="ABCD" AND 50 > 10*4 逻辑 假 值
"abcd"="ABCD" OR 50 > 10*4 逻辑 真 值
婚否 =,F,无效表达式
NOT 婚否 有效表达式
3.表达式示例 (2)
{^2004/10/01}+10 日期 2004年 10月 11日
{^2004/03/01}-1 日期 2004年 2月 29日
{^2004/10/01}-{^2004/09/26} 数值 5
{^2004/09/29 4:10:00 p}+10
日期时间型 2004年 9月 29日下午 4时 10分 10秒
{^2004/09/29 4:10:00 p}-30
日期时间型 2004年 9月 29日下午 4时 9分 30秒
{^2004/09/29 8:10}-{^2004/09/29 8:00}
数值 600
4.显示表达式
命令格式,? <Expr>
示例,
25+100-(12*8-7)+54/9
{^2004/10/01}+10
{^2004/10/01}-{^2004/09/29}
{^2004/09/29 4:10 p}
{^2004/09/29 4:10 p}-30
{^2004/10/01} > {^2004/09/26}
"abcd"="ABCD" OR 50 > 10*4
"abcd"="ABCD"
注:日期型 /日期时间型变量 定义格式 和 显示格式不
一定相同 。
第三节 记录指针
FoxPro系统在数据输入时, 依据其输入的
先后顺序 自动为每个记录赋予一个 记录号, 最
先输入的记录的记录号为 1,其次为 2,依此类
推 。 用户对表文件中某个数据项的访问, 除要
指定数据项所在字段 (列 )的字段名外, 还要给
出它所在的记录 (行 )。
FoxPro系统内部有个用以指向当前操作记
录 (称为 当前记录 )的 记录指针, 通过 记录指针
定位 命令, 可将它移到预定的位置上 。
1.与记录指针有关的函数
函数格式,RECNO([<expN> | <expC>])
功能:返回指定表的当前记录号 。
返回值类型,N
函数格式,EOF([<expN> | <expC>])
功能:测试指定表的记录指针是否指向文件尾 。
返回值类型,L
函数格式,BOF([<expN> | <expC>])
功能:测试指定表的记录指针是否指向文件头 。
返回值类型,L
* 说明(设 表中共有 N条数据记录 )
记录物理顺序 RECNO() EOF() BOF()
表头
第 1条记录
第 2条记录
……
第 k条记录
……
第 N条记录
表尾
1
1
2
……
K
……
N
N+1
F
F
F
……
F
……
F
T
T
F
F
……
F
……
F
F
* 示意图
Begin of Flie
End of Flie
1
2
3

N
EOF()=.T,→
BOF()=.T,→
RECNO()有效
?记录指针定位的几种方法
? 记录指针绝对移动 ——GOTO命令
? 记录指针相对移动 ——SKIP命令
? 记录指针条件移动 ——LOCATE命令
? 借助索引文件移动 ——SEEK命令 (第三章 )
? 随着对记录操作的命令移动
LIST,DISPLAY,REPLACE,……
2.记录指针绝对移动
命令格式,GO|GOTO [RECORD]<expN1> | TOP | BOTTOM
[IN <expN2> | <expC>]
解释:将记录指针直接移到指定的记录位置上。
[RECORD] <expN1>,记录号为 <expN1>的任意记录;
TOP:表文件的首记录( 逻辑顺序 );
BOTTOM:表文件的最后一个记录( 逻辑顺序 ) 。
记录顺序:物理顺序 ——与记录号一致,由输入顺序决定。
逻辑顺序 ——依据指定的数据项排序形成。
逻辑顺序和物理顺序可能一致,可能不一致。
* 示例 1
nn=RECNO() && 保存当前指针位置
… && 执行命令使记录指针移动了
GOTO nn && 恢复原来指针位置

3.记录指针相对移动
命令格式,SKIP [<expN1>] [IN <expN2>|<expC>]
解释:记录指针相对当前记录移动若干个数据记录。
<expN1>为 正值, 向表尾方向移动;
<expN1>为 负值, 向表头方向移动;
<expN1>为 零, 记录指针不动;
省略 <expN1>,记录指针向表尾移动一个记录 。
* 示例 2
GO TOP
DO WHILE,NOT.EOF()
,.,&& 处理当前记录的一组命令
SKIP && 指针下移
ENDDO
或 ------------------------------------------
GO BOTTOM
DO WHILE,NOT.BOF()
,.,&& 处理当前记录的一组命令
SKIP -1 && 指针上移
ENDDO
* 示例 3——程序 1
CLEAR
USE student
GO TOP
DO WHILE,NOT.EOF()
DISPLAY
SKIP
ENDDO
* 程序 1执行结果
4.记录指针条件移动
命令格式,LOCATE FOR <expL1> [WHILE <expL2>]
[<scope>] [NOOPTIMIZE]
解释:根据 FOR或 WHILE子句的条件,在表中按指定
的记录范围顺序查找。若表中有符合条件的记
录,则指针定位在最先遇到的满足条件的记录
上,此时 EOF()函数返回假值。若无符合条件
的记录,此时当命令中无范围子句或指定的记
录范围为 ALL时,EOF()函数返回真值,记录指
针指向文件尾;否则,EOF()函数返回假值,
指针指向指定记录范围的最后一条记录上。
CONTINUE命令:限定与 LOCATE命令匹配使用,表示
LOCATE命令的继续。
* 示例 4
LOCATE ALL FOR gender="男 " AND dno="01"
RECNO(),BOF(),EOF()
显示 1,F.,F,
CONTINUE
RECNO(),BOF(),EOF()
显示 2,F.,F,
CONTINUE
RECNO(),BOF(),EOF()
显示 4,F.,F,
CONTINUE
..,
* 示例 5——程序 2
CLEAR
USE student
LOCATE ALL FOR gender="男 " AND dno="01"
DO WHILE NOT EOF()
DISPLAY
CONTINUE
ENDDO
* 程序 2执行结果
第四节 数据记录的增删改
? 增加数据记录,
追加命令 ——APPEND命令
插入命令 ——INSERT-SQL命令
? 删除数据记录,
数据记录逻辑删除 (加删除标志 )——DELETE命令
数据记录物理删除 ——PACK命令
恢复数据记录 (取消删除标志 )——RECALL命令
清空表 ——ZAP命令
? 修改数据记录,
交互式修改数据记录 ——BROWSE命令
非交互式替换修改数据记录 ——REPLACE命令
1.插入数据记录
命令格式,INSERT INTO <dbf_name>
[(<field name1>
[,<field name2>,...])]
VALUES (<expr1> [,<expr2>,...])
解释:在表尾插入一条数据记录。
示例 1,
INSERT INTO student (sno,name,gender);
VALUES ("9503045","张丽 ","女 ")
?执行 INSERT插入操作后显示结果
2.删除数据记录
数据记录的删除分,
—— 逻辑删除(给记录加删除标志),DELETE
—— 物理删除,PACK
逻辑删除的记录可以恢复,RECALL
物理删除的记录不可以恢复
ZAP命令执行后数据记录将被物理删除,不可恢复。
?删除数据记录命令
命令格式,
DELETE [<scope>] [FOR <expL1>] [WHILE <expL2>] [IN
<expN2>|<expC>] [NOOPTIMIZE]
PACK [MEMO] [DBF]
RECALL [<scope>] [FOR <expL1>] [WHILE <expL2>] [IN
<expN2>|<expC>] [NOOPTIMIZE]
ZAP [IN <expN2>|<expC>]
说明:不指定范围或条件,只对当前记录操作;
如果表的索引文件同时打开,则 PACK命令自动重建索引;
ZAP命令等效于执行 DELETE ALL命令后接着执行 PACK命令。
* 示例 2
a,DELETE FOR RECNO()=21
LIST
RECALL FOR RECNO()=21
LIST
b,DELETE FOR RECNO()=21
LIST
PACK
LIST
?执行 DELETE删除操作后显示结果
a.再执 行 RECALL操作后显示结果
b.再执 行 PACK操作后显示结果
3.修改数据记录
命令格式,
REPLACE <field1> WITH <expr1> [ADDITIVE]
[,<field2> WITH <expr2> [ADDITIVE]] …
[<scope>] [FOR <expL1>] [WHILE <expL2>]
[IN <expN2>|<expC>] [NOOPTIMIZE]
解释:计算 ——替换;
每个 WITH前后的字段和表达式的类型须匹配;
表达式中不允许引用未知的变量;
无范围和条件子句时,默认只替换当前记录;
适于对可计算的数据批量修改。
* 示例 3
USE student
DISPLAY FOR sno="9503045"
REPLACE major WITH "有机化学 ",class WITH "951";
FOR sno="9503045"
DISPLAY FOR sno="9503045"
*示例 4( Salary.dbf替换修改前)
* 示例 4
USE salary
REPLACE ALL 实发工资 WITH 基本工资 +岗位工资 ;
+津贴 +奖金 -扣款
BROWSE
*示例 4( Salary.dbf替换修改后)
第五节 表的其他操作
?复制文件
?复制表结构
?文件操作
?设置默认存储路径
?备注型、通用型数据输入
?将表文件数据转换为其他类型的文件
?表文件与数组数据交换
?设置逻辑表
1.复制文件
命令格式,
COPY FILE <filename1> TO <filename2>
解释:复制任何类型的文件。
命令格式,
COPY TO <filename>
解释:复制当前打开的表文件。
?示例 1
COPY FILE student.dbf TO student2.dbf
COPY FILE student.cdx TO student2.cdx
COPY FILE student.fpt TO student2.fpt
COPY FILE student.* TO student2.*
COPY TO A:student.dbf
2.复制表结构
命令格式,
COPY STRUCTURE TO <tablename>
[FIELDS <field list>]
[[WITH] CDX | [WITH] PRODUCTION]
[DATABASE <dbname [NAME <tablename>]]
解释:形成一个与当前表结构相同的新的空表。
FIELDS子句决定原表中哪些字段被复制到新表;
WITH子句决定与原表对应的索引文件是否被复制。
示例 2,COPY STRUCTURE TO student1 ;
FIELDS sno,name,dno,class,major WITH CDX
3.文件操作
? 文件改名
? 删除文件
? 列文件目录
? 显示文本文件内容
命令格式 (P56,表 2.12),
RENAME <filename1> TO <filename2>
ERASE | DELETE FILE <filename>
TYPE <filename>
[TO PRINTER [PROMPT] | TO FILE <filename>]
DIR | DIRECTORY [ON <drive>]
[[LIKE] [<path>] [<skel>]]
[TO PRINTER [PROMPT] | TO FILE <filename>]
4,设置默认存储路径
初始进入时的默认存储路径,
… /vfp98/
设置个人默认存储路径,
? 命令格式
SET DEFAULT TO <path>
? 示例 3
SET DEFAULT TO "c:\program files\;
microsoft visual studio\vfp98\"
5,备注型、通用型数据输入
进入备注型, 通用型数据编辑窗口,
? 按 <Ctrl+Home>或 <Ctrl+PgUp>或 <Ctrl+PgDn>键
? 或 双击 相应数据项
在通用型数据项上插入多媒体数据,
? 编辑 —插入对象
新建 —选对象类型
由文件创建 —输入对象文件名
保存输入数据,
? 按 <Ctrl+W>键
6.将表文件数据转换为其他类型的文件
命令格式,
COPY TO <filename>
[DATABASE <dbname> [NAME <longtablename>]]
[FIELDS <field list> | FIELDS LIKE <skel>
| FIELDS EXCEPT <skel>] [NOOPTIMIZE] [Scope]
[FOR <expL1>] [WHILE <expL2>]
[[WITH] CDX] | [[WITH] PRODUCTION]
[[TYPE] [FOXPLUS | FOX2X | DIF | MOD
| SDF | SYLK | WK1 | WKS | WR1 | WRK | CVS
| XLS | XL5
| DELIMITED [WITH Delimiter | WITH BLANK |
WITH TAB | WITH CHARACTER <delimiter>]]]
[AS <code page>]
解释:将表文件中的数据复制到指定类型的文件中。
此命令与 APPEND FROM命令对应。
示例 4,
COPY TO stud1 WITH CDX
形成 stud1.dbf和 stud1.cdx文件
COPY TO stud2 FIELDS sno,name,major,class
形成 stud2.dbf文件
COPY TO stud3 DELIMITED FOR dno="02―
形成 stud3.txt文件
7.表文件数据与数组数据转换 -1
命令格式,单个记录转换
表中记录的数据转换为数组或内存变量
SCATTER [FIELDS <field list> | FIELDS
LIKE <skel> | FIELDS EXCEPT <skel>] [MEMO]
TO <arrayname> [BLANK] | MEMVAR [BLANK]
| NAME <objectname> [BLANK]
数组或内存变量数据转换为表记录
GATHER FROM <arrayname> | MEMVAR
| NAME <objectname>
[FIELDS <fieldlList> | FIELDS LIKE <skel>
| FIELDS EXCEPT <skel>] [MEMO]
7.表文件数据与数组数据转换 -2
命令格式,多个记录转换
表中记录的数据转换为数组或内存变量
COPY TO ARRAY <arrayname> [FIELDS <field list>
| FIELDS LIKE <skel> | FIELDS EXCEPT <skel>]
[<scope>] [FOR <expL1>] [WHILE <expL2>]
[NOOPTIMIZE]
数组或内存变量数据转换为表记录
APPEND FROM ARRAY <arrayname> [FOR <expL>]
[FIELDS <field list> | FIELDS LIKE <skel>
| FIELDS EXCEPT <skel>]
8.设置逻辑表
逻辑表的实现,
? 设置过滤器 ——选择记录,SET FILTER命令
? 设置字段表 ——选择字段,SET FIELDS命令
命令格式,
SET FILTER TO [<expL>]
SET FIELDS TO [<field list>
| ALL [LIKE <skel> | EXCEPT <skel>]]
SET FIELDS ON | OFF
解释,
? SET FIELDS ON | OFF命令决定字段表是否有效,
ON为有效。
? SET FIELDS命令为隐式增加方式;
? 不带参数的 SET FILTER TO 命令为取消过滤器的
设置。
? 不带参数的 SET FIELDS TO 命令将封锁对任何字
段的操作。
? SET FIELDS TO ALL命令为恢复对所有字段的操
作。
* 示例 5
USE student
SET FILTER TO dno="01"
SET FIELDS TO sno,name,dno,major
SET FIELDS TO class
LIST
?示例 6
SET FIELDS TO
LIST
SET FIELDS TO ALL EXCEPT A*,B*
LIST
SET FIELDS OFF
LIST
第三章 索引与统计
? 排序
? 索引
? 索引与查询
? 数据工作期窗口
? 索引的应用 ——表的关联
? 统计运算
? SQL查询
? 数据库与数据库视图
第一节 排序与索引
关于数据记录的顺序,
?物理顺序,在数据记录输入时,依据记录输入
的先后形成的顺序。记录的物理顺序与数据记
录的记录号一致。
?逻辑顺序,依据指定的 数据项 对表中数据记录
排列顺序 。
升序、降序 关键字
第一节 排序与索引
?排序和索引是依据指定的 数据项 对表中数据记录
重新排列顺序的两种不同方式。
?排序:用新生成的 表文件 保存排序结果,原数据
文件不变,新文件按新的物理顺序存储数据记录。
?索引:用 索引文件 (CDX/IDX)保存排序结果,原表
文件不变,借助索引文件表中数据记录按所形成
的 逻辑顺序 被引用。索引文件中的数据是不可显
示的,并且不可以单独使用,需与表文件同时使
用。
?一个表文件可以对应有多个索引。
1.排序
命令格式,
SORT TO <tablename>
ON <fieldname1> [/A | /D] [/C]
[,<fieldname2> [/A | /D] [/C],..]
[ASCENDING | DESCENDING]
[<scope>] [FOR <expL1] [WHILE <expL2>]
[FIELDS <field list>
| FIELDS LIKE <skel>| FIELDS EXCEPT <skel>]
[NOOPTIMIZE]
解释,<fieldname1>——第一排序关键字
<fieldname2>——第二排序关键字
A——升序,D——降序,C——区分字母大小写
* 示例
USE student
SORT TO stud4 ON dno/A,class/A
FIELDS sno,name,dno,major,class
USE stud4
DISPLAY ALL
2.索引与索引文件
索引是按照 索引表达式 使表中的记录有序排
列的一种技术,它是借助索引文件实现的 。 使
用数据库文件时,如果将相关的索引文件同时
打开,则数据库的记录即按索引表达式值的逻
辑顺序显示和操作 ( 表中记录的物理顺序并没
有改变 ),而且数据变化时,索引文件自动按
索引表达式值调整 。
优点,减少数据冗余, 动态反应数据的逻辑
顺序, 数据记录快速检索, 建立表间的关联,
支持 Rushmore技术, RQBE查询和 SQL查询等高效
的数据库查询 。
3.索引类型
有以下几种索引,
普通索引:允许关键字重复;
唯一索引:允许关键字重复, 但输出时无重复值;
候选索引:不允许关键字重复, 输入重复值时系统
将禁止;
主索引:不允许关键字重复, 输入重复值时系统将
禁止 。 ——仅对数据库表有效
P71,表 3.1
4.索引文件的类型
有以下几种索引文件,
一般索引文件 ——单条目索引, 扩展名为 IDX
复合索引文件 ——多条目索引, 扩展名为 CDX
* 结构复合索引文件, 与表文件同名
压缩索引 ——IDX,CDX
非压缩索引 ——IDX
5.建立索引
命令格式,
INDEX ON <expr> TO <IDX filename>
| TAG <tagname> [OF <CDX filename>]
[FOR <expL>] [COMPACT]
[ASCENDING | DESCENDING]
[UNIQUE | CANDIDATE] [ADDITIVE]
解释:当索引表达式 <expr>中出现不同类型数据时,
需 归一成字符型 的。
多条目的复合索引文件,需对文件中的每个索引条
目命名,称为 索引标识 (TAG)。
* 命令解析
INDEX ON <expr> TO <IDX filename>
[FOR <expL>] [COMPACT]
[ASCENDING | DESCENDING]
[UNIQUE | CANDIDATE] [ADDITIVE]
INDEX ON <expr> TAG <tagname> OF <CDX filename>]
[FOR <expL>]
[ASCENDING | DESCENDING]
[UNIQUE | CANDIDATE] [ADDITIVE]
INDEX ON <expr> TAG <tagname>
[FOR <expL>]
[ASCENDING | DESCENDING]
[UNIQUE | CANDIDATE] [ADDITIVE]
* 示例
USE student
INDEX ON sno TAG sno OF studcdx
INDEX ON dno+class TAG dnoclass OF studcdx
DISPLAY ALL
INDEX ON name TAG name OF studcdx
DISPLAY ALL
INDEX ON sno TO studidx ADDITIVE
SET ORDER TO TAG sno
DISPLAY STATUS
?数据类型转换函数
函数格式,STR(<expN1>[,<expN2>[,<expN3>]])
功能:将数值型变量转换成字符型变量 。
说明,<expN1>被转换变量, <expN2>长度, <expN3>小数位 。
相反函数格式,VAL(<expC>)
函数格式,DTOS(<expD>)
功能:将日期型变量转换成字符型变量, 转换格式为
yyyymmdd。
函数格式,DTOC(<expD>)
功能:将日期型变量转换成字符型变量, 转换格式为
mm/dd/yy。
相反函数格式,CTOD(<expC>)
* 示例
a1 = 123.4567
a2 = "210.32"
a3 = DATE()
a4 = "04/10/16"
b1 = STR(a1,6,2)
b2 = VAL(a2)
b3 = DTOS(a3)
b4 = DTOC(a3)
b5 = CTOD(a4)
DISPLAY MEMORY LIKE *
6.用表设计器建立索引
方法一,
在字段选项卡的索引列组合框中设定。
方法二,
使用索引选项卡设定。
表设计器建立的为结构复合索引文件。
7.打开索引
? 结构复合索引文件随表文件自动打开;
? 索引文件刚建立时是打开的;
? 用命令打开。
表文件已打开,之后打开索引文件,
SET INDEX TO 命令
表文件和索引文件同时打开,
USE … INDEX … 命令
7.打开索引
命令格式,
SET INDEX TO [<indexfile list> |? ]
[ORDER <expN> | <IDX filename>
| [TAG] <tagname> [OF <CDX filename>]
[ASCENDING | DESCENDING]] [ADDITIVE]
USE [[<dbname>!] <tablename> | <SQL viewname> |?]
[IN <expN> | <expC>] [ONLINE] [ADMIN] [AGAIN]
[NOREQUERY [nDataSessionNumber]] [NODATA]
[INDEX [<indexfile list> |?
[ORDER <expN> | <IDX filename>
| [TAG] <tagname> [OF <CDX filename>]
[ASCENDING | DESCENDING]]]]
[ALIAS <alias>] [EXCLUSIVE] [SHARED] [NOUPDATE]
8.关闭索引
? 关闭表文件时,索引文件随之关闭;
? 用命令关闭;
? 结构复合索引文件只有在表文件关闭时才自动随之
关闭,下述命令不能关闭结构复合索引文件。
命令格式,
SET INDEX TO
只关闭当前非结构复合索引文件。
CLOSE INDEXES
关闭所有非结构复合索引文件。
9.指定主索引标识
主索引标识,
当前起作用的索引标识, 决定当前表中记录的
逻辑顺序 。
方法,
?在打开索引文件时, 用 ORDER子句声明主索引
标识;
?用 SET ORDER TO命令来指定主索引标识 。
9.指定主索引标识
命令格式,
SET ORDER TO [<expN1> | <idx file> |
[TAG] <tagname> [OF <cdx file>]
[IN <expN2> | <expC>]
[ASCENDING | DESCENDING]]
说明,
?IDX索引:用 IDX索引文件名
?CDX索引:用索引标识 ( TAG)
?物理顺序:数值零, 即 ORDER 0
?关于索引标识的组织顺序
索引标识的组织顺序是 ( 从 1开始编号 ),
? 打开的 IDX索引文件;
? 结构复合索引文件中的索引标识 ( TAG) ;
? 打开的非结构复合索引文件中的索引标识
( TAG) 。
* 在复合索引文件中, 索引标识按创建先后顺
序依次编号 。
*示例
USE student ORDER TAG sno
SET INDEX TO studcdx ORDER TAG name
SET ORDER TO TAG sno
SET ORDER TO TAG sno OF studcdx
SET ORDER TO 0
10.删除索引
? 删除索引文件,此时索引文件需关闭,
用 ERASE命令。
? 删除复合索引文件中的索引标识,
命令格式,
DELETE TAG <tagname1> [OF <CDX filename1>]
<tagname2> [OF <CDX filename2>],.,
或 DELETE TAG ALL [OF <CDX filename>]
解释,
当用 ALL删除复合索引文件的所有索引标识,这时
索引文件也被删除了。
11.索引更新
? 自动更新
在索引文件打开时
? 用 INDEX命令重新建立索引和索引文件
? 重新索引
命令格式,
REINDEX [COMPACT]
解释,
对表文件中的数据重新索引,调整索引顺序。
第二节 索引与查询
查询方式,
? 顺序查询
LOCATE/CONTINUE命令
? 索引查询
SEEK命令
? SQL查询
SELECT-FROM-WHERE命令
* SEEK命令
命令格式,
SEEK <expr> [ORDER <expN> | <IDX filename>
| [TAG] <tagname> [OF <CDX filename>]
[ASCENDING | DESCENDING]]
[IN <expN2> | <expC>]
解释,
<expr>——查询表达式,可以是字段,由字段构成的
表达式,应与建立索引时的索引表达式对应;
ORDER——指定索引检索的主索引标识;
ASCENDING | DESCENDING——指定按升序或降序检索。
* FOUND()函数
函数格式,FOUND([<expN2> | <expC>])
功能:返回 SEEK命令的查询结果 。
返回值类型,L
解释,
查询到满足条件的数据记录,返回逻辑真值;
未查询到满足条件的数据记录,返回逻辑假值;
3.示例
USE student INDEX studcdx
SET ORDER TO sno
SEEK "9502003"
FOUND() &&,T.(8)
SET ORDER TO TAG dnoclass OF studcdx
SEEK "02953"
FOUND() &&,T.(16)
SET ORDER TO TAG name OF studcdx
SEEK "田新 "
FOUND() &&,F,
第三节 数据工作期
数据工作期 是一个用来设置数据工作环
境的 交互操作窗口,它包括,
- 打开的表
- 打开的索引
- 索引顺序
- 表间关联
- 一对多联系
可以用 视图文件 (*.VUE)保存所设置的
数据工作环境。
1.工作区 (1)
VFP允许同时使用多个表。对于每个正在使用的
表,系统提供了各自的 工作区 。
一个工作区上同时只能打开一个表,后打开的
表文件将使该工作区上先打开的表文件自动关闭。
VFP 6.0 提供了 32767个工作区。
工作区标识,
* 数值序号 1~ 32767
* 前 10个工作区还可用字母 A~ J
* 表名或别名 (alias)。若在工作区中打开了
表,则打开的表名或别名亦可作为工作区的标识。
1.工作区 (2)
? 最初进入 FoxPro时,系统 默认为第一工作区;
? 可用 SELECT命令选择工作区;
? 最近选择的工作区为 当前工作区 。
命令格式,
SELECT <expN> | <expC>
解释,
<expN>——工作区编号。当为零值时,即 SELECT 0,
系统将自动从当前未用的工作区中选取区号最低者
为当前工作区。
<expC>——工作区别名,即 文件名 。
1.工作区 (3)
VFP总是默认为对当前工作区打开的表操作,引
用非当前工作区的字段变量时必须在其字段名前加工
作区标识,即,
<alias>.<field>
或 <alias> -> <field>
VFP的命令或函数中的 "IN <expN> | <expC>"选
项, 用来限制其操作的工作区, 可使命令在不改变当
前工作区的情况下, 对由工作区号或工作区别名指定
的非当前工作区中打开的表进行操作 。
* 示例
SELECT 0 && 选择工作区
USE dept ORDER dno && 打开表 dept及其索引
SELECT 0 && 选择工作区
USE student ORDER sno
&& 打开表 student及其索引
SET RELATION TO dno INTO dept
&& 建立表间关联
LIST sno,name,dept.dname,dept.tele,major
&& 显示当前和非当前工作区指定的字段
USE IN dept
&& 在第二工作区关闭第一工作区的表文件
2.数据工作期窗口
? 打开数据工作期窗口
命令格式,
SET
SET VIEW ON
菜单方式,
窗口 (W)—数据工作期 (D)
? 关闭数据工作期窗口
命令格式,
SET VIEW OFF
菜单方式,
文件 (F)—关闭 (O)
3.视图文件
? 建立视图文件
命令格式,
CREATE VIEW <filename>
菜单方式,
窗口 (W)—数据工作期 (D)
? 打开视图文件
命令格式,
SET VIEW TO <viewfile> |?
菜单方式,
文件 (F)—打开 (O)—视图 (*.VUE)
4.表间关联
关联,令不同工作区的记录指针建立一种临时的联动
关系,使一个表记录指针移动时另一个表的记录指
针随之移动。
关联的条件,
? 两个表:一个在当前工作区打开,称为父表;另一
个称为子表,在非当前工作区打开,指针将随父表
联动;
? 两个表有相同的字段表达式;
? 子表的字段表达式上要建立索引,并打开。
关联关系,
? 多对一:父表有多条记录对应子表中的一条记录;
? 一对多:父表的一条记录对应子表中的多条记录。
?表间关联示意图
Dno Dname Dloc Dmgr
D-01
D-02
D-03
D-04
D-05
Eno Ename Title Salary Dno
E-001 D-01
E-002 D-01
E-003 D-03
E-004 D-02
E-005 D-02
E-006 D-03
E-007 Null
Department Table
Employee Table
?表间关联 --示例
* 在数据工作期窗口建立关联
步骤,
? 打开数据工作期窗口;
? 按, 打开, 按钮分别打开父表和子表;
? 在, 别名, 列表框中选定父表, 按, 关系, 按钮;
? 在, 别名, 列表框中选定子表;
在, 设置索引顺序, 窗口中确定子表的主索引标识;
在, 表达式生成器, 窗口中指定父表的字段表达式;
? 如建立一对多联系, 按, 一对多, 按钮;
? 浏览数据 。
在数据工作期窗口打开表
选定父表
确定子表的主索引标识
指定父表的字段表达式
浏览结果
BROWSE FIELDS ;
sno,student.name,cno,course.subject,score
创建一对多关系
* 用命令建立关联
命令格式及解释,
SET RELATION TO [<expr1> INTO <expN1> | <expC1>
[,<expr2> INTO <expN2> | <expC2> … ]
[ADDITIVE]]
<expr>为关联表达式, INTO 子句指定子表,
ADDITIVE子句将保持已存在的关联 。
SET SKIP TO [<alias1> [,<alias2>] … ]
设置一对多关系 。
SET RELATION TO
取消父表和所有其他子表的关联 。
SET RELATION OFF INTO <expN> | <expC>
只取消父表和指定子表的关联 。
* 示例
CLEAR
CLEAR ALL
SET TALK OFF
SELECT 0
USE student ORDER TAG sno
SELECT 0
USE course ORDER TAG cno
SELECT 0
USE score ORDER TAG scno
SET RELATION TO sno INTO student,cno INTO course
BROWSE FIELDS ;
sno,student.name,cno,course.subject,score
CLOSE DATABASES
RETURN
第四节 统计运算
?计数统计 ——COUNT命令
?求累加和 ——SUM命令
?求平均值 ——AVERAGE命令
?分类汇总统计 ——TOTAL命令
?综合统计 ——CALCULATE命令
1.计数统计
命令格式,
COUNT [Scope] [FOR <expL1>] [WHILE <expL2>]
[TO <varname>] [NOOPTIMIZE]
解释:统计表中记录个数。
示例,
USE salary
COUNT FOR 部门号 ="02" TO x1
x1 && 显示,4
2.求累加和
命令格式,
SUM [<expr list>]
[<scope>] [FOR <expL1>] [WHILE <expL2>]
[TO <memvar list> | TO ARRAY <array>]
[NOOPTIMIZE]
解释:计算表中数值型字段或字段表达式的累加和。
示例,
SUM ALL 岗位工资,津贴 +50 TO x2,x3
x2,x3 && 显示,18900.00 1526.20
3.求平均值
命令格式,
AVERAGE [<expr list>]
[<scope>] [FOR <expL1>] [WHILE <expL2>]
[TO <memvar list> | TO ARRAY <array>]
[NOOPTIMIZE]
解释:计算表中数值型字段或字段表达式的平均值。
示例,
AVERAGE ALL 基本工资,岗位工资 TO x4,x5
x4,x5 && 显示,543.33 1260.00
4.分类汇总统计
命令格式,
TOTAL TO <filename> ON <expr>
[FIELDS <field list>] [<scope>]
[FOR <expL1>] [WHILE <expL2>] [NOOPTIMIZE]
解释:按索引或排序关键字分类,求表中数值型字段或字段表
达式的累加和。
示例,
USE salary
INDEX ON 部门号 TAG bmh OF scdx
TOTAL TO salary1 ON 部门号
USE salary1
BROWSE
5.综合统计
命令格式,
CALCULATE <expr list>
[<scope>] [FOR <expL1>] [WHILE <expL2>]
[TO <memvar list> | TO ARRAY <array>]
[NOOPTIMIZE]
解释:根据 CALCULATE专用函数实现各种统计运算。
示例,
CALCULATE ALL SUM(扣款 ),AVG(扣款 ),MAX(扣款 ),MIN(扣款 )
显示,487.38 32.49 49.35 9.09
* 专用统计函数
AVG(<expN>) 计算 <expN>的平均值
CNT() 返回数据库文件的记录数
MAX(<expr>) 返回 <expr>的最大值
MIN(<expr>) 返回 <expr>的最小值
NPV(<expN1>,<expN2> [,<expN3>])
计算资金的净现值
STD(<expN>) 计算 <expN>的标准偏差
SUM(<expN>) 对 <expN>求和
VAR(<expN>) 计算 <expN>的方差示例,
第五节 SELECT-SQL查询
SQL——Structured Query Language
结构化查询语言
标准数据库查询语言
实现方式,
? 用 SELECT-SQL命令直接查询
? 用查询设计器建立查询
1.SQL查询命令
命令格式,
SELECT [ALL | DISTINCT] [TOP <expN> [PERCENT]] [Alias.] Select_Item
[AS Column_Name] [,[Alias.] Select_Item [AS Column_Name],..]
FROM [FORCE] [<dbname>!]<table> [[AS] Local_Alias]
[[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN
DatabaseName!]Table [[AS] Local_Alias] [ON JoinCondition …]
[[INTO Destination] | [TO FILE <filename> [ADDITIVE]
| TO PRINTER [PROMPT] | TO SCREEN]]
[PREFERENCE PreferenceName] [NOCONSOLE] [PLAIN] [NOWAIT]
[WHERE JoinCondition [AND JoinCondition,..]
[AND | OR FilterCondition [AND | OR FilterCondition,..]]]
[GROUP BY <GroupColumn1> [,GroupColumn2>,..]]
[HAVING <FilterCondition>]
[UNION [ALL] SELECTCommand]
[ORDER BY <OrderItem1> [ASC | DESC] [,<OrderItem2> [ASC |
DESC]...]]
* 命令解析
SELECT <Select_Item > 查询目标
FROM <Data_Source> 数据源
[WHERE <Join_Condition>] 查询条件
[GROUP BY <Group_Column〉 ] 分组输出
[HAVING <Filter_Condition>] 过滤条件
[UNION [ALL] SELECT_Command] 合并
[ORDER BY <Order_Item1>] 排序输出
* 示例
SELECT sno,name,major,class ;
FROM student ;
WHERE dno = "02"
等效于,
USE student
BROWSE FIELDS sno,name,major,class ;
FOR dno = "02"
SELECT * FROM student
等效于,
USE student
BROWSE
2.用查询设计器建立查询
? 新建查询
命令格式,
CREATE QUERY [<filename> |?] [NOWAIT]
菜单方式,
文件 (F)—新建 (N)—查询 (Q)—新建文件 (N)
? 编辑查询
命令格式,
MODIFY QUERY [<filename> |?] [[WINDOW
<windowname>]
[IN SCREEN] [NOWAIT] [SAVE] [AS <codepage>]
菜单方式,
文件 (F)—打开 (O)—查询 (*.qpr)
1) 设计步骤
? 打开查询设计器;
? 选择第一个数据源文件;
? 添加其他数据源文件;
? 设置表间联接条件,选择联接类型;
? 选定输出字段;
? 指定查询去向;
? 显示 SELECT-SQL命令窗口;
? 运行查询。
a,选择第一个数据源文件
b,添加其他数据源文件
c,设置表间联接
d,选定输出字段
e,指定输出去向
? 浏览 (B):在浏览窗口中显示查询结果;
? 临时表 (C):将查询结果保存于临时表中;
? 表 (T):将查询结果用表文件 (.DBF)保存起来;
? 图形 (G):利用 Microsoft的图形功能,将查询结

以图形形式输出;
? 屏幕 (S):在当前输出窗口中显示查询结果;
? 报表 (R):向报表文件 (.FRX)发送查询结果;
? 标签 (L):向标签文件 (.LBX)发送查询结果
e,指定输出去向
f,显示 SQL命令
g,运行查询
g,运行查询
2) 图形输出设计步骤
? 步骤 1 – 字段选取 /选择图形输出
? 步骤 2 – 定义布局
? 步骤 3 – 选取图形样式
? 步骤 4 – 完成
* 定义标题
* 预览
* 完成
a,选择图形输出
b,定义布局
c,选择图形样式
d,定义图形标题
e,图形预览
3) 几点说明
? 可用“显示”菜单中的“工具栏”选项,
打开或关闭,查询设计器,工具栏;
? 所有查询结果在,运行查询” 后得到。
? 对查询的修改需通过,运行查询” 实现。
第六节 数据库与数据库视图
? 数据库,*.DBC
表和视图的集合;
? 数据库视图,虚拟表,对应于对数据库的
一个查询,由 SQL-SELECT查询生成。
自由表,独立于数据库 (*.dbc)之外的表。
数据库表,数据库 (*.dbc)中的表。
1.数据库设计器
? 新建数据库
命令格式,
CREATE DATABASE [<filename> |?]
菜单方式,
文件 (F)—新建 (N)—数据库 (D)—新建文件 (N)
? 打开数据库设计器
命令格式,
MODIFY DATABASE [<dbname> |?] [NOWAIT]
[NOEDIT]
菜单方式,
文件 (F)—打开 (O)—数据库 (*.dbc)
?示例
?数据库表设计器
?关联设计
2,几点说明
? 可用“显示”菜单中的“工具栏”选项,
打开或关闭,数据库设计器,工具栏;
? 数据库表不同与自由表,
数据库表允许使用长表名和长字段名;
数据库表设计包含关系完整性设计。
3.打开和关闭数据库
? 打开数据库命令格式,
OPEN DATABASE [<dbname> |?]
[EXCLUSIVE | SHARED] [NOUPDATE] [VALIDATE]
说明,
EXCLUSIVE——独享
SHARED——共享
? 将自由表添加到当前数据库中,
ADD TABLE <Tablename>|? [NAME <Longtablename>]
? 关闭数据库命令格式,
CLOSE DATABASE [ALL]
4.SQL视图定义等命令
CREATE SQL VIEW [<ViewName> ] [REMOTE]
[CONNECTION <ConnectionName> [SHARE]
| CONNECTION <DataSourceName>]
[AS SQL-SELECT-Statement]
DISPLAY VIEWS
LIST VIEWS
MODIFY VIEW
DELETE VIEWS
RENAME VIEW
第四章 程序设计
? 程序文件
? 结构化程序控制结构
? 多模块程序
? 自定义函数
? 内存变量及其作用域
? 浏览窗口定制
? 事件陷阱和键盘宏
第一节 程序文件
源程序文件,
用户编写,*.PRG文件
系统生成,*.SPR—屏幕设计器
*.MPR—菜单设计器
*.QPR—查询设计器
一、源程序的编辑
命令格式,
MODIFY COMMAND [<filename> |?]
说明:打开源程序编辑窗口书写源程序。
按 <Ctrl+W>保存,<Ctrl+Q>或 <Esc>不保存。
源程序文件扩展名 (PRG)可以省略。
书写规则,
续行符:;
注释符,* 或 NOTE——整行注释
&&——行尾注释
?源程序编辑窗口
二、执行源程序
命令格式,
DO <programname>
说明:源程序文件扩展名 (PRG)可以省略。
VFP的 可执行程序 及 执行顺序,
*.EXE
*.APP
*.FXP(.SPX,.MPX,.QPX)
*.PRG(.SPR,.MPR,.QPR)
三、源程序的编译
命令格式,
COMPILE <filename> | <fileskel> |?
说明:伪编译,将源程序文件编译成 VFP的编译文件。
源程序文件 ——编译文件
*.PRG —— *.FXP
*.SPR —— *.SPX
*.MPR —— *.MPX
*.QPR —— *.QPX
DO命令能够自动编译源程序文件,并生成编译文件。
第二节 程序的基本控制结构
结构化程序控制结构,
* 顺序
* 分支 /判断
* 循环
* 过程 /子程序
一、分支 /判断结构
1,单重分支
IF <expL>
<Commands>
ENDIF
?示例 1
CLEAR
SET TALK OFF
USE student ORDER sno
@ 5,10 SAY "请输入学号," GET msno DEFAULT SPACE(7)
READ
SEEK msno
IF NOT FOUND()
APPEND BLANK
REPLACE sno WITH msno
BROWSE NODELETE NOAPPEND
ENDIF
CLOSE DATABASE
RETURN
2.双重分支 /判断
IF <expL>
<Commands-1>
ELSE
<Commands-2>
ENDIF
?示例 2
CLEAR
SET TALK OFF
USE student ORDER sno
@ 5,10 SAY "请输入学号," GET msno DEFAULT SPACE(7)
READ
SEEK msno
IF NOT FOUND()
APPEND BLANK
REPLACE sno WITH msno
BROWSE NODELETE NOAPPEND
ELSE
@ 8,10 SAY "该学生记录已经存在! "
DISPLAY
ENDIF
CLOSE DATABASE
RETURN
3.多重分支 /判断
DO CASE
CASE <expL1>
<Commands-1>
[CASE <expL2>
<Commands-2>
,.,
CASE <expLn>
<Commands-n>]
[OTHERWISE
<Commands>]
ENDCASE
?示例 3
CLEAR
SET TALK OFF
INPUT "请输入百分成绩= " TO mscore
DO CASE
CASE mscore >= 90 AND mscore <=100
mgrade = "优 "
CASE mscore >= 80 AND mscore <=89
mgrade = "良 "
CASE mscore >= 70 AND mscore <=79
mgrade = "中 "
CASE mscore >= 60 AND mscore <=69
mgrade = "及格 "
CASE mscore >= 0 AND mscore < 60
mgrade = "不及格 "
OTHERWISE
mgrade = "输入不正确 "
ENDCASE
mgrade
二、循环结构
三种循环结构,
DO WHILE — ENDDO 一般循环
FOR — ENDDFOR/NEXT 计数循环
SCAN — ENDSCAN 记录扫描循环
1.DO WHILE循环
DO WHILE <expL>
<Commands>
ENDDO
说明,
初始应使 <expL>为真;
循环体中应有改变循环条件的指令。
?示例 4
CLEAR
SET TALK OFF
USE student ORDER sno
DO WHILE NOT EOF()
,....,
SKIP
ENDDO
CLOSE DATABASE
RETURN
2.FOR循环
FOR <memvar>=<expN1> TO <expN2> STEP <expN3>
<Commands>
ENDFOR | NEXT
说明,
步长为正,初值 < 终值,循环控制变量递增;
步长为负,初值 > 终值,循环控制变量递减。
?示例 5
CLEAR
SET TALK OFF
x2=0
FOR x1 = 100 TO 1 STEP -1
x2=x2+x1
ENDFOR
x2
RETURN
3.SCAN循环
SCAN [<Scope>] [FOR <expL>]
<Commands>
ENDSCAN
说明,
对当前表中记录扫描;
记录指针自动下移;
默认范围为 ALL。
?示例 6
CLEAR
SET TALK OFF
USE student
SCAN
DISPLAY
ENDSCAN
RETURN
三、循环中的 LOOP和 EXIT命令
1,LOOP命令
DO WHILE <expL>
……
LOOP
……
ENDDO
2,EXIT命令
DO WHILE <expL>
……
EXIT
……
ENDDO
……
需与分支判断语句结合使用才有意义
?示例 7
CLEAR
SET TALK OFF
USE student ORDER sno
DO WHILE,T,
@ 5,10 SAY "请输入学号," GET msno DEFAULT SPACE(7)
READ
IF msno = "9999999"
EXIT
ENDIF
SEEK msno
IF NOT FOUND()
APPEND BLANK
REPLACE sno WITH msno
BROWSE NODELETE NOAPPEND
LOOP
ENDIF
@ 8,10 SAY "该学生记录已经存在! "
ENDDO
CLOSE DATABASE
RETURN
第三节 多模块程序结构
子程序
过程
自定义函数
作用
调用方式
参数传递
一、子程序和过程
主程序,调用程序(文件)。
子程序,被调用的独立的程序文件,一个程
序模块一个程序文件。
过程,被调用的程序模块,多个程序模块一
个程序文件,这个程序文件又称为 过程文
件 。
1.过程文件
PROCEDURE <procname1>
……
RETURN
PROCEDURE <procname2>
……
RETURN
……
FUNCTION <funcname1>
……
RETURN <expr>
……
过程文件
*.prg
过程 procname1
过程 procname2
函数 funcname1
2.子程序和过程调用
子程序调用,
DO <程序文件名 >
过程调用,
SET PROCEDURE TO <过程文件名 >
DO <过程名 >
或 DO <过程名 > IN <过程文件名 >
3.参数传递
主程序 子程序 /过程 /函数
发送参数,
DO <程序 > WITH <参数表 >
函数名 (<参数表 >)
接收参数,
子程序 /过程 /函数的第一个可执行语句为,
PARAMETER <参数表 >
参数传递
4.程序返回
返回到调用处的下一个指令,
RETURN
RETURN TO MASTER | <程序名 >
返回到调用处,
RETRY
?
?
?
DO P2
?
?
?
?
?
?
DO P3
?
?
?
RETURN
?
?
?
DO P4
?
?
?
RETURN
TO MASTER
?
?
?
DO P5
?
?
?
RETURN
?
?
?
?
?
?
RETRY
P1 P2 P3 P4 P5
二、自定义函数
格式,
FUNCTION <函数名 >
……
RETURN <expr>
[ENDFUNC]
函数调用,
无参调用:函数名 ()
有参调用:函数名 (<参数表 >)
函数返回,某一类型的值
?示例 8
CLEAR
SET TALK OFF
USE student ORDER 0
BROWSE FIELDS sno,name,gender,birthday,dno,major,;
class:H="班级 ":V=fenter():F
CLOSE DATABASES
RETURN
FUNCTION fenter
DO CASE
CASE RECNO()=RECCOUNT() AND LASTKEY()=13
KEYBOARD "{CTRL+Y}" && 加一空行
CASE RECNO()<RECCOUNT() AND LASTKEY()=13
KEYBOARD "{DNARROW}" && 换行
ENDCASE
RETURN,T,
第四节 内存变量及其作用域
一、内存变量定义与赋值
命令格式,
STORE <expr> TO <memvar list>
<memvar> = <expr>
说明,
?定义内存变量并为内存变量赋值;
?<expr>必须有确定的值,不允许含有未知量;
?第一个命令为一组内存变量赋予相同的值;
?第二个命令为一特定内存变量赋值。
?其他内存变量定义命令
ACCEPT [<expC>] TO <memvar>
INPUT [<expC>] TO <memvar>
WAIT [<expC>] [TO <memvar>]
[WINDOW [NOWAIT]] [CLEAR]
[TIMEOUT <expN>]
二、内存变量的显示
命令格式,
DISPLAY MEMORY [LIKE <skel>]
[TO PRINTER | TO FILE <file>
[ADDITIVE]] [NOCONSOLE]
LIST MEMORY [LIKE <skel>]
[TO PRINTER | TO FILE <file>
[ADDITIVE]] [NOCONSOLE]
| <expr1>
?示例 1
X1= 12345.67
X2=DATE()
X3=.T,
X4="ABCDEFG"
DISPLAY MEMORY LIKE X*
三、内存变量的作用域
公用变量 PUBLIC
私有变量 PRIVATE
本地变量 LOCAL
区域变量 REGIONAL
?公用变量和私有变量
公用变量,公用变量不论它是在哪个程序或函数中
建立的,它将在所有程序、过程或 UDF函数中有
效。
PUBLIC <memvar list>
私有变量,私专用变量使内存变量仅在它被建立的
程序以及被该程序调用的程序、过程或 UDF函数
中有效,当从该程序返回上级调用程序时,专
用变量将被从内存中释放。
PRIVATE <memvar list> |
ALL [LIKE <skel> | EXCEPT <skel>]
四、内存变量释放
命令格式,
RELEASE <memvar list>
RELEASE ALL [LIKE <skel> | EXCEPT <skel>]
CLEAR ALL
CLEAR MEMORY
说明,从内存中删除已定义的内存变量,把占
据的内存空间释放出来。
SET TALK OFF
PUBLIC val1,val2
LOCAL val4
val1 = 10
val2 = 15
val4 = 40
DO test && 调用子程序
DISPLAY MEMORY LIKE val?
RELEASE ALL && 仅删除私有变量
DISPLAY MEMORY LIKE val?
RELEASE val1,val2 && 公有变量必须显示删除
DISPLAY MEMORY LIKE val?
PROCEDURE test
PRIVATE val1,val3
val1 = 50
val2 = 100
val3 = 200
'val1 =',val1
'val2 =',val2
'val3 =',val3
**? 'val4 =',val4 && 找不到变量 'VAL4'
DISPLAY MEMORY LIKE val?
RETURN
?示例 2
第五节 浏览窗口定制
?打开数据浏览窗口,
BROWSE命令
显示 (V)—浏览 (B)
?浏览窗口中的编辑键
<Ctrl+Y>——数据记录追加
<Ctrl+T>——数据记录删除
?退出浏览窗口,
<Ctrl+W> 或 <Ctrl+Q> 或 <Esc>
?不使用任何子句的浏览命令, 是对表中所
有数据记录的所有字段进行浏览 。
BROWSE [FIELDS <field list>] [FONT <font> [,<size>]]
[STYLE <style>]
[FOR <expL1> [REST]] [FORMAT] [FREEZE <field name>]
[KEY <expr1> [,<expr2>]] [LAST | NOINIT]
[LOCK <expN1>] [LPARTITION] [NAME <object name>]
[NOAPPEND] [NODELETE] [NOEDIT | NOMODIFY]
[NOLGRID] [NORGRID] [NOLINK] [NOMENU]
[NOOPTIMIZE] [NOREFRESH] [NORMAL] [NOWAIT]
[PARTITION <expN2> [LEDIT] [REDIT]]
[PREFERENCE <expC1>] [SAVE]
[TIMEOUT <expN3>] [TITLE <expC2>]
[VALID [:F] <expL2> [ERROR <expC3>]]
[WHEN <expL3>] [WIDTH <expN4> ]
[WINDOW <window name1>]
[IN [WINDOW] <window name2> | IN SCREEN]
[COLOR SCHEME <expN5>]
1.浏览命令中常用的子句
FIELDS <field list> 字段选择
FONT <font> [,<size>] [STYLE <style>]
字体、字型、字号控制
FOR <expL1> 条件选择
FREEZE <field name> 只编辑指定字段
KEY <expr1> [,<expr2>] 记录范围
LOCK <expN1> 锁住左边若干列
NOAPPEND 禁止追加
NODELETE 禁止删除
NOEDIT | NOMODIFY 禁止修改
TITLE <expC2> 窗口标题
2.用 FIELDS子句进行控制
在 BROWSE命令中, 在 FIELDS子句的字段后辅以
参数, 还可以控制字段的显示格式, 特性或输入时
的校验标准等, 用法如下,
<field1>[:R]
[:<col width>]
[:V = <expr1> [:F] [:E = <expC1>]]
[:P = <expC2>]
[:B = <expr2>,<expr3> [:F]]
[:H = <expC3>]
[:W = <expL>]
?参数说明
:R 只读
:<col width> 字段显示宽度
:V = <expr1> 字段输入校验
,F 强制校验
,E = <expC1> 出错提示
:P = <expC2> 显示格式
:B = <expr2>,<expr3> 设置上下限
,F 强制校验
:H = <expC3> 显示标题
:W = <expL> 进入字段校验
?示例
BROWSE FIELDS sno:H="学号 ":10:P="9999999",;
name:H="学生姓名 ":8:R,;
birthday:H="出生日期 ":10:R ;
TITLE "学生信息查询/编辑 "
第六节 事件陷阱和键盘宏
事件陷阱
设置
触发
取消
键盘宏
预定义
使用
一、事件陷阱
为实现对应用程序出错等异常情况的控制, 或实
施一些特殊处理等, VFP提供了一组设置事件陷阱的
命令 。 通过这些命令, 预先设置,
在上述情况发生时 ( 事件陷阱被触发 ), 如何将程
序控制转向事件处理程序模块, 并在事件处理结束
时返回 。 见示例 PP2.PRG。
设置,ON READERROR <command>
ON ERROR <command>
ON KEY LABEL <command>
ON KEY = <command>
……
触发,事件发生
取消,在设置命令中省略 <command>部分
CLEAR
SET TALK OFF
USE course
SCATTER TO temp
ON KEY LABEL F2 DO scrnhelp
@ 1,6 SAY "课程号," GET cno
@ 3,6 SAY "课程名," GET subject
@ 5,6 SAY "学 时," GET time
@ 7,6 SAY "学 分," GET credit
@ 9,6 SAY "[Esc]键终止 [F2]键帮助 "
READ
IF LASTKEY() = 27
GATHER FROM temp
ENDIF
ON KEY LABEL F2
PROCEDURE scrnhelp
@ 11,0 CLEAR
@ 11,2 SAY VARREAD() + "的帮助信息。按任意键继续。 "
WW=INKEY(0)
@ 11,0 CLEAR
RETURN
二、键盘宏
键盘宏功能将一个 FoxPro命令或一个字
符集合赋予一个键, 或将一组按键定义为等
效的一个按键, 这个新定义的键就是键盘宏 。
使用时直接键入键盘宏, 等效为键入了它所
代替的键或键组 。 通过键盘宏的定义和使用,
可避免逐个地击打键符集合的操作, 也可生
成新的功能键 。
键盘缓冲区填充命令,
KEYBOARD <expC>