第三章 Visual FoxPro数据库和表 本章教学要求:掌握数据库和表的建立,对表的基本操作。 3.1 Visual FoxPro数据库和表的建立 3.2 Visual FoxPro表记录的操作 3.3 表的统计 3.4 表的索引 3.5 多表操作
3.1 Visual FoxPro数据库和表的建立 应当说明的是数据库是表、视图和连接等的集合,数据记录内容是存放在表中的,如图3-1所示。
学生学籍库 课程表 成绩表 学生基本信息表 图3-1 学生学籍库的组成
3.1.1 数据库的建立 在Visual FoxPro中有多种方法建立数据库。 l 在命令窗口中输入命令 格式:Create database 数据库名 例如:在命令窗口中输入: Create database c:\学籍管理\学生学籍库 将在“c:\学籍管理”文件夹下创建一个文件名为“学生学籍库.DBC”数据库。
l 通过菜单或工具栏上的“新建”命令 步骤: 点击工具栏上的“新建”按钮,出现如图3-2所示的 “新建”对话框,选择“数据库”,然后点击“新建文件” 按钮,出现“创建”对话框,输入文件名c:\学籍管理\学生学籍库(如图3-3所示),点击“保存” 按钮,屏幕上将出现“数据库设计器”窗口,如图3-4所示。 图3-2 新建对话框
图3-3创建对话框
图3-4 数据库设计器窗口
l 使用数据库向导创建数据库 步骤: 点击工具栏中的“新建”按钮,出现“新建”对话框,选择“数据库”,然后点击“向导” 按钮,按照屏幕指示进行操作即可。 3.1.2 数据库的打开与关闭 1. 打开数据库 l 使用Open DataBase命令 格式:Open DataBase [<数据库名|?>] [Shared|Exclusive][Noupdate][Validate]
命令参数: 若省略数据库名或用?代替数据名,则系统将显示“打开”对话框,让用户从中选择现有的数据库。 Shared:表式以共享方式打开数据库。 Exclusive:表式以独占方式打开数据库。 Noupdate:指定不能对数据库进行修改操作,即只能对数据库进行读操作。 Validate:指定在打开数据库时对数据库中的表和索引是否可用进行检查。 例如:打开c:\学籍管理\学生学籍库.dbc数据库 open database c:\学籍管理\学生学籍库
l 在Visual FoxPro的集成环境中打开数据库 点击工具栏中的“Open”按钮,然后在“打开”对话框中选择要打开的数据库文件。 说明:当数据库打开后,若要使用表还必须使用Use命令打开表。 2. 关闭数据库 l 使用Close DataBase命令 格式:Close DataBase [All] 命令参数:
All:关闭当前数据库和表,如果没有当前数据库,则关闭所有已打开的自由表、索引文件和格式文件,并把当前工作区设为1。 3.1.3 表的建立 在Visual FoxPro中表是非常重要的,数据都是以记录的形式存放在表中的,表由两部分组成:表结构和记录, 创建一个表时,首先应创建表结构,然后再根据需要输入数据,创建一个表结构时,应事先确定表结构的如下内容: l 字段名 只能以字母、下划线和汉字开始,后面可跟字母、数字、
下划线和汉字。每个字段名的最大长度不超过10个字符。 下列符号不能用于表字段名: @ # $ % ^ & * 空格 ! ~ Visual FoxPro的保留字等 l 数据类型、宽度及小数据位数 Visual FoxPro表中常用的数据类型: Visual FoxPro字段数据类型表: 数据类型 宽度 (字节) 小数 位数 备注 字符型(Character) <=254 任意字符
字符型(Character)) <=254 任意字符 货币型(Currency) 8 数值型(Numeric) <=20 任意字符 货币型(Currency) 8 数值型(Numeric) <=20 <=19 浮动型(Float) <=20 <=19 日期型(Date) 8 日期时间型(DateTime) 8 双精度型(Double) 8 <=7 整型(Integer) 4 逻辑型(Logical) 1 备注型(Memo) 4 通用型(General) 保存OLE对象的引用 字符型(二进制)(Binary) <=254 保存数据不经代码页修改 备注型(二进制) (Memo Binary) 4 保存数据不经代码页修改
双精度型(Double) 8 <=7 整型(Integer) 4 逻辑型(Logical) 1 备注型(Memo) 4 整型(Integer) 4 逻辑型(Logical) 1 备注型(Memo) 4 通用型(General) 保存OLE对象的引用 字符型(二进制)(Binary) <=254 保存数据不经代码页修改 备注型(二进制) (Memo Binary) 4 保存数据不经代码页修改
在Visual FoxPro中创建新表的方法有多种,但通常是在Visual FoxPro的集成开发环境中点击“文件”菜单→“新建”,在弹出的新建对话框中选择“表”,然后选择“新建文件”按钮,屏幕上出现“创建”对话框,在该对话框中键入表文件名(如图3-5所示),键入表文件名后,点击“保存”按钮,屏幕上出现“表设计器”窗口,在“表设计器”窗口中输入表结构(如图3-6所示),输入完成后点击“确定”按钮,屏幕上出现“现在输入数据记录吗?”对话时,若选择“否”则不输入数据,若选择“是”则屏幕上出现数据记录输入窗口,可在其中输入数据(如图3-7所示),输入完成后关闭数据记录输入窗口即可。 注:备注型输入方法是当光标移动到备注型字段时按“Ctrl+PageDown”键,屏幕上就会出现输入备注型字段的编辑窗体,如图3-7所示。
图3-5 创建对话框
图3-6 表设计器-学生基本信息表结构
图3-7 数据记录输入
3.1.4 表的打开与关闭 1. 通过菜单操作打开表 操作步骤: 点击“文件”菜单→“打开”,屏幕上出现“打开”文件对话框,选择要打开的表文件(如图3-8所示),然后点击“确定”按钮即可。 注:在图3-8中,若选择了“以只读方式打开(R)”,则只能对打开的表进行读操作不能进行修改、删除和增加等操作;若选择了“独占”,则其它用户此时只能以共享方式打开该表。
图3-8 “打开”对话框
2. 通过命令打开表 在Visual FoxPro的命令窗口中使用Use命令打开表。 命令格式:Use <表文件名> [Shared|Exclusive][ Alias <别名>] 命令参数: Shared:指定以共享方式打开表,以这种方式打开的表,可以对表进行增加、删除和修改数据记录的操作,但不能修改表结构。 Exclusive:指定以独占方式打开表,以这种方式打开的表,除可以对表进行增加、删除和修改数据记录的操作,还可以修改修表的结构。
若不指定打开方式,则以独占方式打开表。 Alias <别名>:指定打开表的别名,若省略该参数,表的别名就是表名。 例如 要共享方式打开表C:\学籍管理\学生基本信息表.dbf,可使用如下命令: Use C:\学籍管理\学生基本信息表.dbf Shared 若要对表进行操作,必须先打开表。 3. 表的关闭 对表的操作完成后,应及时关闭表。 命令格式:Use
3.2 Visual FoxPro表记录的操作 3.2.1 记录指针定位 1. Go/GoTo命令 命令格式: Go/GoTo [[RECORD] <记录号>|<TOP>|<BOTTOM>] [In <工作区>|<表别名>] 命令功能:移动记录指针。
命令参数: [RECORD] <记录号>:将表记录指针移到<记录号>指定的记录。 TOP:将表记录指针移到第一条记录。 BOTTOM:将表记录指针移到最后一条记录。 [In <工作区>| <表别名>]:指定要移到记录表所在的工作区,若省略该参数则是对当前工作的表进行操作。 例如 将当前工作区的表的记录指针移到第3条记录,可使用如下命令: GoTo 3 或者
Go 3 或者 3 2. Skip命令 命令格式:Skip [<数值表达式>] [In <工作区>|<表别名>] 命令功能:移动记录指针。 命令参数: <数值表达式>:指定记录指针移动的相对记录数,即若<数值表达式>为正数,表示记录指针向文件尾方向移动,为负数表示向文件头方向移动记录指针;若省略该参数,则表示记录指针向文件尾方向移动一个记录位置。
In <工作区>|<表别名>:指定要移动记录指针的工作区或表别名。 例如假设当前工作区的当前记录为12,总共有30条,执行如下程序: Skip –1 && 记录指针移到第11条记录 Skip –90 && 记录指针移到第1条记录 Skip && 记录指针移到第2条记录 Skip 100 && 记录指针移到第30条记录,即最后一条 Skip && 出错,因为已到文件尾 与记录指针移动有关的函数有3个:
Recno( ):返回当前记录号。 Bof( ):测试记录指针是否已到文件头,若已到文件头返回.T.,否则返回.F.。 Eof( ):测试记录指针是否已到文件尾,若已到文件尾返回.T.,否则返回.F.。 3.2.2 增加记录 向表中增加记录主要有两种方式,一种是直接通过全屏幕方式从键盘输入数据,另一种是从其它表文件中把有关数据记录添加到表中。 1. 从键盘输入新记录
(1) Apppend命令 命令格式:Append [Blank] [In 工作区|表别名] [NoMenu] 命令功能:在表的最末尾添加记录。 命令参数: Blank:若有该参数,则在表的末尾添加一条新记录,若没有该参数,则屏幕上出现数据输入窗体,在该窗体中可进行添加记录操作,如图3-9所示。 In 工作区|表别名:指定要对哪一个工作区的表进行操作,省略该参数,则是向当前工作区的表添加记录。 NoMenu:指定从系统菜单中删除“表”菜单项。
图3-9 向表中追加记录
例如,要向表“C:\学籍管理\学生基本信息表.dbf”添加一个空白记录,可在命令窗口中输入如下命令: Use C:\学籍管理\学生基本信息表 &&若表文件的扩展名为.DBF可省略 Append Blank Use &&关闭表 (2) Insert命令 命令格式:Insert [Before] [Blank] 命令功能:在当前表中插入新的记录。 命令参数:
Before:在当前记录之前插入新记录,若没有该参数则是在当前记录之后插入新记录。 Blank:插入一条空记录,屏幕上不出现数据输入窗口;若没有该参数,屏幕上出现数据输入窗口,用户可以输入新的数据。 例如 在表“C:\学籍管理\学生基本信息表.dbf”的第3和第4条记录之间插入新的记录,可在命令窗口输入如下命令: Use C:\学籍管理\学生基本信息表.DBF Go 3 &&使当记录指针指向第4条记录 Insert Use
2. 从其它表文件中把有关数据记录添加到表 命令格式: Append From [文件名|?] [Fields <字段列表>] [For <条件表达式>] 命令功能:从其它文件中将所需的数据复制到当前表中。 命令参数: 文件名:指定源数据文件名,即数据来自哪一个文件。 ?: 当执行该命令时,显示打开文件对话框,让用户从中选择一个源数据文件。
Fields <字段列表>:指定要将源表的哪些字段复制到当前表中,若有多个字段,字段之间用逗号“,”隔开,若省略该参数,则是将源表的所有字段值复制到当前表以对应的字段中去。 For <条件表达式>:指定添加记录的条件,只有符合条件的记录才会被添加到当前表中,若省略该参数,则是将源数据文件所有的记录添加到当前表中。 例如,C:\ 学籍管理\新生数据.DBF的内容如图3-10所示,C:\学籍管理\学生基本信息表.DBF的内容如图3-11所示。
图3-10新生数据表内容
图3-11学生基本信息表内容
将C:\ 学籍管理\新生数据.DBF文件中的所有记录复制到C:\学籍管理\学生基本信息表.DBF中,在命令窗口中输入如下命令: Use C:\学籍管理\学生基本信息表.DBF Append From C:\学籍管理\新生数据.DBF Use 上述命令执行完后,表C:\学籍管理\学生基本信息表.DBF的内容如图3-12所示
图3-12 追加记录后学生基本信息表内容
3.2.3 删除记录与恢复 当表中的数据不再需要时,应将删除。为了防止误删除,在Visual FoxPro中删除记录分两步进行,第一步是逻辑删除,即只在要删除的记录上作一个删除标记,数据记录并没有真正从表中删除,当发现删除操作有误时,还可以用恢复命令将其恢复,显然只被逻辑删除的记录仍要占用硬盘空间,被逻辑删除的记录在列表显示(List或Display)时记录前有一个删除标记“*”或“■”(用Browse浏览记录时);第二步是物理删除,即将作了删除标记的记录从硬盘中彻底删除,物理删除后的记录不可以再恢复。 1. 逻辑删除 命令格式:Delete [<范围>] [For <条件>] [While <条件>] [In <工作区>|<表别名>] 命令功能:对符合条件的记录进行逻辑删除。 命令参数: <范围>: 指定要操作的记录范围,该参数可以是: All:所有记录。 Next n:从当前记录开始的后面n个记录。 Record n:第n号记录。 Rest:从当前记录开始一直到文件结束。 For <条件>:指定要作删除标记的条件,依次对指定范围内的记录进行操作,若条件为真,对记录作删除标记,否则不作删除标记,然后再对下范围内的一个记录进行操作。 While <条件>:指定要作删除标记的条件,依次对指定范围内的记录进行操作,若条件为真,对记录作删除标记,若条件为假或已到范围内的最后一个记录则停止。 若省略范围、For <条件>和While <条件>参数,则只删除当前记录。 若省略范围,但有For <条件>或While <条件>参数,则缺省的范围为整个记录。 In <工作区>|<表别名>:指定要进行逻辑删除的表所在的工作区或表别名,若省略该参数,则是对当前工作区进行操作。 例如,假设当前表为前面的学生基本信息表,执行如下操作: Delete record 5 && 给第5条记录加删除标记 Go 7 && 给第7条记录成为当前记录 Delete && 给当前记录加删除标记 Delete for 学号=’ 20040805 ’ &&给学号为20040805加删除标记。 List &&列表显示记录 记录号 学号 姓名 性别 出生日期 身高 简历 1 *20040805 刘军 .T. 07/04/85 170.3 memo 2 20040807 张平 .T. 06/13/85 175.0 Memo 3 *20040805 刘军 .T. 07/04/85 170.3 memo 4 20040807 张平 .T. 06/13/85 175.0 Memo 5 * 李光辉 .T. 07/14/85 170.3 memo 6 张勇 .T. 11/17/85 177.6 Memo 7 * 罗丽 .F. 07/04/86 162.8 memo 8 欧阳德雷 .T. 03/18/85 175.0 Memo 2. 物理删除 命令格式:Pack 命令功能:将作了删除标记的记录从表中彻底删除,释放其所占的内存空间。 说明:要执行该命令,必须以独占方式打开表。 例如: Use C:\学籍管理\学生基本信息表.DBF exclusive Delete for 姓名=’李勇’ Pack Use 3. ZAP命令 命令格式:ZAP [IN <工作区> | <表别名>] 命令功能:物理删除表中的所有记录。 In <工作区> | <表别名>:指定要执行删除操作的工作区或表别名。 当要物理删除表中的所有记录可使用该命令,该命令与下面两条命令相当: delete all pack 4. 记录的恢复 命令格式:RECALL [<范围>] [FOR <条件>] [WHILE <条件>] 命令功能:取消已打删除标记记录的删除标记。 <范围>: 参见DELETE的命令参数说明。 For <条件>:指定要恢复记录的条件,依次对指定范围内的记录进行操作,若条件为真,对恢复记录,否则不恢复,然后再对下范围内的一个记录进行操作。 While <条件>:指定要恢复的条件,依次对指定范围内的记录进行操作,若条件为真,对恢复记录,若条件为假或已到范围内的最后一个记录则停止。 若省略范围、For <条件>和While <条件>参数,则只恢复当前记录。 若省略范围,但有For <条件>或While <条件>参数,则缺省的范围为整个记录。 In <工作区>|<表别名>:指定要进行恢复的表所在的工作区或表别名,若省略该参数,则是对当前工作区进行操作。 Use C:\学籍管理\学生基本信息表.DBF 5 && 使第5号记录为当前记录 delete && 对第5号记录作删除标记录 7 && 使第5号记录为当前记录 delete && 对第7号记录作删除标记录 recall && 恢复第7号记录 recall all && 恢复所有记录 3.2.4 修改记录 对表记录的修改有两种方式:屏幕编辑方式和和程序方式 1. 屏幕编辑方式 l EDIT/CHANGE命令 命令格式:EDIT/CHANGE [FIELDS <字段名列表>][<范围>] [FOR 条件] [WHILE条件] 命令参数: FIELDS <字段名列表>:指定哪些字段可以被修改。 <范围>:参见DELETE命令说明。 For <条件>或While <条件>:指定要修改记录的条件,符合条件的记录才会在编辑窗口中显示并修改。 说明:EDIT和CHANGE的功能是完全相同的。
1. 逻辑删除 命令格式:Delete [<范围>] [For <条件>] [While <条件>] [In <工作区>|<表别名>] 命令功能:对符合条件的记录进行逻辑删除。 命令参数: <范围>: 指定要操作的记录范围,该参数可以是: All:所有记录。 Next n:从当前记录开始的后面n个记录。 Record n:第n号记录。 Rest:从当前记录开始一直到文件结束。
For <条件>:指定要作删除标记的条件,依次对指定范围内的记录进行操作,若条件为真,对记录作删除标记,否则不作删除标记,然后再对下范围内的一个记录进行操作。 While <条件>:指定要作删除标记的条件,依次对指定范围内的记录进行操作,若条件为真,对记录作删除标记,若条件为假或已到范围内的最后一个记录则停止。 若省略范围、For <条件>和While <条件>参数,则只删除当前记录。 若省略范围,但有For <条件>或While <条件>参数,则缺省的范围为整个记录。
In <工作区>|<表别名>:指定要进行逻辑删除的表所在的工作区或表别名,若省略该参数,则是对当前工作区进行操作。 例如,假设当前表为前面的学生基本信息表,执行如下操作: Delete record 5 && 给第5条记录加删除标记 Go 7 && 给第7条记录成为当前记录 Delete && 给当前记录加删除标记 Delete for 学号=’ 20040805 ’ &&给学号为20040805加删除标记。
List &&列表显示记录 记录号 学号 姓名 性别 出生日期 身高 简历 1 *20040805 刘军 .T. 07/04/85 170.3 memo 2 20040807 张平 .T. 06/13/85 175.0 Memo 3 *20040805 刘军 .T. 07/04/85 170.3 memo 4 20040807 张平 .T. 06/13/85 175.0 Memo 5 * 李光辉 .T. 07/14/85 170.3 memo 6 张勇 .T. 11/17/85 177.6 Memo 7 * 罗丽 .F. 07/04/86 162.8 memo 8 欧阳德雷 .T. 03/18/85 175.0 Memo
2. 物理删除 命令格式:Pack 命令功能:将作了删除标记的记录从表中彻底删除,释放其所占的内存空间。 说明:要执行该命令,必须以独占方式打开表。 例如: Use C:\学籍管理\学生基本信息表.DBF exclusive Delete for 姓名=’李勇’ Pack Use
4. 记录的恢复 命令格式:RECALL [<范围>] [FOR <条件>] [WHILE <条件>] 命令功能:取消已打删除标记记录的删除标记。 命令参数: <范围>: 参见DELETE的命令参数说明。 For <条件>:指定要恢复记录的条件,依次对指定范围内的记录进行操作,若条件为真,对恢复记录,否则不恢复,然后再对下范围内的一个记录进行操作。 While <条件>:指定要恢复的条件,依次对指定范围内的记录进行操作,若条件为真,对恢复记录,若条件为假或已到范围内的最后一个记录则停止。
若省略范围、For <条件>和While <条件>参数,则只恢复当前记录。 In <工作区>|<表别名>:指定要进行恢复的表所在的工作区或表别名,若省略该参数,则是对当前工作区进行操作。 例如: Use C:\学籍管理\学生基本信息表.DBF 5 && 使第5号记录为当前记录 delete && 对第5号记录作删除标记录
7 && 使第5号记录为当前记录 delete && 对第7号记录作删除标记录 recall && 恢复第7号记录 recall all && 恢复所有记录 3.2.4 修改记录 对表记录的修改有两种方式:屏幕编辑方式和和程序方式 1. 屏幕编辑方式 l EDIT/CHANGE命令 命令格式:EDIT/CHANGE [FIELDS <字段名列表>][<范围>][FOR 条件][WHILE条件]
命令参数: FIELDS <字段名列表>:指定哪些字段可以被修改。 <范围>:参见DELETE命令说明。 For <条件>或While <条件>:指定要修改记录的条件,符合条件的记录才会在编辑窗口中显示并修改。 说明:EDIT和CHANGE的功能是完全相同的。 3.2.5 查询记录 把数据放在数据表中,是为了将来在需要时对其进行查询,查询操作是数据库操作中最常用的。 1. 用Browse命令进行浏览查询
命令格式: Browse [Scope] [Fileds <FieldList>] [for <条件表达式>] 功能:显示数据表中的记录。 参数说明: Scope:指定记录范围,该参数的取值可以是:All(所有记录)、Next n(当前记录及其之后的n个记录)、Record n(指定第n条记录)和Rest(当前记录及其之后的所有记录)。若省略该参数,缺省值为All。 Fields <FieldList>:指定要查询显示的字段名列表,若省该参数,则显示所有字段。 for <条件表达式>:指定要查询显示的记录应满足的条件。
例如: Set century on && 设置日期要显示世纪 Set date ansi && 设置日期显示格式为yyyy.mm.dd Open database c:\学籍管理\学生学籍库.DBC Use 学生基本信息 Browse for 出生日期>{^1980.05.23} Close 上面的程序运行过程中将打开一个查询窗口(如图3-14所示),可在其中浏览查询到的记录。
图 3-14 数据浏览查询窗口
2. 用Locate命令进行查询 命令格式: Locate [Scope][for <条件表达式>] 功能:将记录指针定位到指定记录范围内满足条件的第一条记录,若没有记录满足条件,记录移到记录末尾,Eof()函数返回“真”。 参数说明: Scope:指定记录范围,该参数的取值可以是:All(所有记录)、Next n(当前记录及其之后的n个记录)、Record n(指定第n条记录)和Rest(当前记录及其之后的所有记录)。若省略该参数,缺省值为All。 for <条件表达式>:指定要查找的记录应满足的条件。
3. 用Continue命令进行查询 命令格式: Continue 功能:激活Locate命令,继续顺查找。 例如: Set century on && 设置日期要显示世纪 Set date ansi && 设置日期显示格式为yyyy.mm.dd Open database c:\学籍管理\学生学籍库.DBC Use 学生基本信息 Locate for 出生日期={^1980.05.23}
Do while .T. If Eof()=.T. ?’没有满足条件的记录!’ exit else ?学号,姓名,性别,出生日期 Continue &&查找下一个出生日期为1980.05.23的记录 Endif Enddo Close all
3.2.6 从表向数组传递数据 在Visual FoxPro中对数组大小没有什么限制,主要取决于磁盘和内存空间的大小,数组存在于内存,运行处理速度很快。 当前记录传到数组中/数组中的数据送当前记录: 有关命令: 1. Scatter命令 命令格式: Scatter [Fields <字段名列表>] [Memo] TO <数组名> 功能:将当前表的当前复制到数组中。
参数说明: <字段名列表>:指定要复制到数组的字段,若省略该参数,则将所有字段复制到数组中(对于备注型字段需要Memo参数)。 Memo:指定复制备注型字段,若省略该参数,则不复制备注型字段到数组。 <数组名>:指定记录要复制到的数组。 说明:若要复制的字段个数大于数组的大小,系统会自动将数组的大小扩大,若数组未定义,系统会自动创建数组。
2. Gather命令 命令格式: Gather From <数组名> [Fields <字段名列表>] [Memo] 功能:将数组中的数据复制到当前表的当前记录中。 参数说明: <数组名>:指定要复制数据的数组。 <字段名列表>:指定要接收数据的字段,若省略该参数,则将对所有字段进行操作(对于备注型字段需要Memo参数)。
3.2.7 使用SQL语言对表进行操作 结构化查询语言SQL(Structured Query Language)是目前关系型数据库中应用最广泛的语言之一,美国国家标准协会(ANSI)早在1982年就开始着手SQL的标准化工作,并公布了SQL标准,目前SQL已成为关系型数据库语言的国际标准。 SQL语言具有如下特点: l 综合统一。SQL语言集数据操纵语言(DML)、数据语言(DDL)和数据控制语言的功能于一体,能独立完成数据库的全部活动。 l 高度非过程化。用SQL语言对数据进行操作时,用户只需提出“做什么”,而不需要指出“怎么做”,也不需要指出存取路径,存取路径和操作过程都由系统自动完成。
l 面向集合的操作方式。SQL语言的操作对象、查询结果都可以是元组的集合。 SQL语言即是自主型语言,又是嵌入式语言。当作为自主型语言使用时,用户通过联机方式直接在终端上键入SQL命令对数据库进行操作;SQL作为嵌入式语言可嵌入到其它高级语言中使用,例如C语言、Visual FoxPro等。 值得注意的是,实际系统中实施的SQL语言与标准SQL语言是有一定差异的,大部分的实际系统并没有完全支持标准的SQL,但在某些方面还对标准SQL语言进行了扩充。 1. SELECT-SQL数据查询命令
命令格式: Select <表达式1> [as 别名1],<表达式2> [as 别名2],…,<表达式n> [as 别名n] From <表1>,<表2>,…,<表m> [Into <输出目标>] [Where <条件表达式>] [group by <分组条件>] [having <条件表达式>] [order by <排序方式>]
参数说明: from:指定要查找的数据来自哪些表或视图。 Into:指出查询结果输出到哪里,若省该参数,屏幕上会出现查询窗口显示查询结果。 Where:指定查询条件,若省略该参数,则对所有的记录进行操作。 Group by:指定如何对查询结果进行分组,若省略该参数,则不对查询结果不进行分组。 Having:指定分组应满足的条件,与group by一起使用。 Order by:指定查询结果的排序方式,若省略该参数,则不对查询结果进行分组。
SELECT-SQL命令有多个子句,下面通过一些示例来说明其一般用法: 示例一: Select * from 学生基本信息表 查询“学生基本信息”表中所有字段(“*”号表示所有字段)和所有记录,如果表“学生基本信息表”没有打开,系统会自动打开,但命令执行完后表仍处于打开状态,查询结果如图3-16所示。
图3-16 Select使用示例一
示例二: Select 学号 As 学生学号, 姓名 As 学生姓名, ; 性别, 出生日期 ; From C:\学籍管理\学生基本信息表.DBF ; Where 性别=.t. “Where”指定查询条件,“As”指定列标题,如果不指定列标题,则用字段名作列标题。示例二的查询结果如图3-17所示。
图3-17 Select使用示例二
示例三: Select 学号, 姓名, iif(性别,’男’,’女’) As 性别, ; 2002-year(出生日期) As 年龄 ; From C:\学籍管理\学生基本信息表.DBF ; order by 学号 在Select命令中可以使用函数和表达式,查询结果按学号顺序排列。示例三的查询结果如图3-18所示。
图3-18 Select使用示例三
示例四: Select 学号, 姓名; Into array array1; From C:\学籍管理\学生基本信息表.DBF ; Where 出生日期>={^1985.05.03} list memory like array* && 显示内存变量 Select命令的查询结果输出到数组array1中,示例四的运行后的结果如图3-19所示。
图3-19 Select使用示例四
示例五: Select 学号, 姓名,max(出生日期) as 最大年龄; from C:\学籍管理\学生基本信息表.DBF 查询表中年龄最大的记录,运行结果如图3-20。
图3-20 Select使用示例五
2. INSERT-SQL数据插入命令 命令格式: Insert Into <表名> [(字段名1,字段名2,…,字段名n)] Values (表达式1 [,表达式2, [...,[表达式n]]]) 或 Insert Into <表名> [(字段名1,字段名2,…,字段名n)] From Array <数组名> 参数说明: Into <表名>:指定数据要插到哪一张表中。 (字段名1,字段名2,…,字段名n):指定要插入哪些字段内容,若省略该参数,则是要插入所有字段的值。
From Array <数组名>:将指定数组的内容插到表中。 下面通过示例来说明Insert-SQL命令的用法。 示例一: Use C:\学籍管理\学生基本信息表.dbf insert into 学生基本信息表(学号,姓名) ; values(‘20020889’,’罗明华’) 执行上述命令后,会在“学生基本信息表”的末尾插入一记录。
示例二: Use C:\学籍管理\学生基本信息表.dbf Dimension array1(2) Array1(1)= ‘20020890’ Array1(2)= ’张子华’ insert into 学生基本信息表(学号,姓名) from array array1 执行上述命令后,会在“学生基本信息表”的末尾插入一记录。
3.3 表的统计 对于数据库的操作来说,各种统计是经常要遇到的,Visual FoxPro为用户提供了功能强大的各种数据统计命令和函数方便用户编程。 3.3.1 记录统计 记录的统计就是统计表中的记录数有多少。 1. Count记录数统计命令 命令格式: Count [Scope] [For <条件表达式>] [To <变量名>]
参数说明: Scope:指定记录范围,该参数的取值可以是:All(所有记录)、Next n(当前记录及其之后的n个记录)、Record n(指定第n条记录)和Rest(当前记录及其之后的所有记录)。若省略该参数,缺省值为All。 For <条件表达式>:指定要查找的记录应满足的条件,若省略该参数,则是对指定记录范围内的所有记录进行统计。 To <变量名>:指定统计结果存放的变量,若省略该参数,统计结果显示在屏幕上。 注意:对于该命令,若Set delete被设置为Off,则统计的记录数包括被作了删除标记的记录;若Set delete被设置为On,则统计的记录数不包括被作了删除标记的记录。
例如: Set talk off Set delete off Use C:\学籍管理\学生基本信息表.dbf browse count to var1 Set delete on count to var2 ?’包括作了删除标记的记录数为:’,var1 ?’不包括作了删除标记的记录数为:’,var2
图3-21浏览“学生基本信息表”
从图3-21中可以看出有3个记录作了删除标记,关闭图3-21的窗体,程序显示记录的统计结果: 包括作了删除标记的记录数为: 8 不包括作了删除标记的记录数为: 4 3.3.2 累加值和平均值 累加值求某个或多个字段表达式的算术和。 1. Sum记录数统计命令 命令格式: Sum [<字段表达式列表>] [Scope] [For <条件表达式>] [To <内存变量> | To Array <数组名>]
参数说明: <字段表达式列表>:指定一个或多个要求累加和的字段表达式,表达式的值必须为数值型,若省略该参数,则是对所有数值字段求和。 Scope:指定记录范围,该参数的取值可以是:All(所有记录)、Next n(当前记录及其之后的n个记录)、Record n(指定第n条记录)和Rest(当前记录及其之后的所有记录)。若省略该参数,缺省值为All。 For <条件表达式>:指定参加求和的记录应满足的条件。 To <内存变量列表>:指定保存累加和结果的变量列表,变量个数应与<字段表达式列表>的个数相同,多个变量名之间用逗号“,”隔开。
To Array <数组名>:指定保存累加和结果的数组,若指定的数组不存在,Visual FoxPro会自动创建这个数组,若指定的数组元素不够多,Visual FoxPro会自动扩展数组元素的个数。 若省略“To <内存变量列表>”和“To Array <数组名>”参数,则计算结果直接显示在屏幕上。 例如:计算全班平均身高。 USE c:\学籍管理\学生基本信息表.dbf Sum 身高 to v1 &&计算全班身高总和 Count to v2 &&统计全班总人数 ?’全班平均身高:’,v1/v2 &&显示全班平均身高
2. Average计算平均值命令 命令格式: Average [<字段表达式列表>] [Scope] [For <条件表达式>] [To <内存变量> | To Array <数组名>] 参数说明: <字段表达式列表>:指定一个或多个要求平均值的字段表达式,表达式的值必须为数值型,若省略该参数,则是对所有数值字段求平均值。 Scope:指定记录范围,该参数的取值可以是:All(所有记录)、Next n(当前记录及其之后的n个记录)、Record n(指定第n条记录)和Rest(当前记录及其之后的所有记录)。若省略该参数,缺省值为All。
For <条件表达式>:指定参加求平均值的记录应满足的条件。 To <内存变量列表>:指定保存平均值结果的变量列表,变量个数应与<字段表达式列表>的个数相同,多个变量名之间用逗号“,”隔开。 To Array <数组名>:指定保存平均值结果的数组,若指定的数组不存在,Visual FoxPro会自动创建这个数组,若指定的数组元素不够多,Visual FoxPro会自动扩展数组元素的个数。 若省略“To <内存变量列表>”和“To Array <数组名>”参数,则计算结果直接显示在屏幕上。
例如:计算全班平均身高。 USE c:\学籍管理\学生基本信息表.dbf Average 身高 to v1 ?’全班平均身高:’,v1
3.4 表的索引 表中的记录是按录入的先后顺序排列的,通常是没有规律的,对于这种没有规律排列的记录,对其查找只能按从头至尾的方式进行查询,如果表中有10000个记录,则查询一个记录平均要遍历5000个记录,对于一些记录数较多的表来说,其查询时间可能非常长。 索引是对表中的记录按一定规律排序,从而可大大提高查询速度,索引并不是修改表中记录的排列顺序,而是新建一个索引文件,记录的关键字(即排序字段)在索引文件中按顺序排列。对于一个表可以建立多个索引,每个索引代表一种排列方式(如第1个索引为按学号排列,第2个索引按成绩排序等)
注意:当对表中的记录进行了修改、增加或删除操作,Visual FoxPro也会对相应的索引文件进行修改、增加或删除操作,因此对一个表不要建太多的索引,否则Visual FoxPro会在维护索引上耗费相当时间,使程序运行效率降低。 在Visual FoxPro中,索引有三种:结构复合索引(.CDX)、独立复合索引(.CDX)和独立索引(.IDX),用得最多的索引是结构复合索引(.CDX),其特点是: l 打开表时自动打开索引。 l 在同一索引文件中可以有多种排序方式,具有多个索引关键字。 l 在对表进行修改、增加或删除操作时,系统自动维护索引文件。
3.4.1 索引的建立 1.结构复合索引的建立 在Visual FoxPro的“项目管理器”中, 选择要建立索引的表(如图3-22所示),然后点击“修改”按钮,屏幕上出现“表设计器”窗口,在“表设计器”中选择“索引”卡(如图3-23所示)。
图3-22 选择要建立索引的表
图3-23 “表设计器”索引卡
在图2-23中的“索引名”输入框中输入索引名,在“类型”处选择索引类型,共有4种索引类型: l 主索引(Primary Indexs):要求其对应的索引表达式的值在表中是唯一的,不允许重复,如图3-23中的Sno就是主索引,要求表中每个学生的学号不能相同。数据库中的都可建立一个主索引,也可以没有主索引,自由表不能建立主索引。 l 候选索引(Candidate Indexs):也是具有唯一值的引索,数据表和自由表都可以建 立候选索引,一个表可以建立多个候选索引。 l 普通索引(Regular Indexs):允许索引对应的表达式值重复,一个表可建立多个普通索引。
l 唯一索引(Unique Indexs):主要是为了与以前的版本兼容,允许索引对应的表达式的值重复,但在唯一索引中只存储重复值第一次出现的记录,忽略重复值第二次和以后的记录。 在图3-23中,建立索引时还可以指定索引的排序方式:升序(↑)或是降序(↓),要改变索引的排序方式,选中要改变排序方式的索引,然后点击其左边的 即可。 对于一个索引还可以指定其“筛选条件”,要指定筛选条件,点击筛选输入框右连的按钮,屏幕上将会出现筛选“表达式生成器”窗口(如图3-24所示),可在图3-24的表达式输入筛选条件,对索引指定了筛选条件后,则只有符合筛选条件的记录才会在索引文件中出现。
图3-24 筛选“表达式生成器”对话框
在图3-23中输入完要建立的索引后,按“确定”按钮,屏幕上出现图3-25所示的对话框,在图3-25中,点击“确定”按钮,系统开始检测当前表中记录是否符合索引的设置(针对主索引和候选索引),若屏幕上出现图3-26所示的消息框,则说明当前表中的记录违返了索引唯一性要求,若没有新的窗口出现,则说明索建立成功了。
图3-25 表结构修改确认对话框 图3-26 Visual FoxPro消息框
当建立索引成功后,用户可以看到在与表相同的目录中会有一个与表同名,但扩展名为.CDX的索引文件。 2.独立索引的建立 命令格式: Index On <索引表达式> To <索引文件名> [Ascending|Descending] [For <条件表达式>][Unique] 参数说明: <索引表达式>:指定索引关键字。 To <索引文件名>:指定索引文件名。
Ascending:指定索引按升序排序。 Descending:指定索引按降序排序,若不指定排序方式,缺省是按升序排序。 For <条件表达式>:指定参加索引的记录应满足的条件,不满足条件的记录不会在索引中出现,若省略该参数,缺省是所有的记录。 Unique:指定建立唯一索引,即具有相同引索关键字的记录只有第1条记录出现在索引中。 例如,有一学生成绩表,按课程名称和学号排序。 Use 学生成绩表 exclusive
Browse && 按记录在表中的物理顺序浏览表中的记录 Index on 学号 to index1 Browse && 按索引顺序浏览表中的记录 Use &&关闭打开的表 注意:要为表建立索引文件,表必须以独占方式打开。 上面程序运行的结果如图3-27和3-28所示。
图3-27 按表中物理顺序显示记录
图3-28 按索引顺序显示表中记录
3.4.2 索引的使用 要使用索引,必须先打开索引文件,对于结构索引文件,不需要专门打开索引文件,当表打开时,其相应的索引文件就自动打开;对于独立索引文件,需要用专门命令来打开。 1. 打索引文件 l 在打开表时同时打开相应的索引文件 命令格式: Use <表名> index <索引文件名列表> 参数说明: <表名>:指定要打开的表。
<索引文件名列表>:指定同时要打开的索引文件,若有多个索引文件,则各个索引文件之间用逗号“,”隔开。 例如: Use 学生成绩 index index1 l 打开索引文件 命令格式: Set Index to <索引文件名列表> 功能:打开索引文件。
参数说明: <索引文件名列表>:指定要打开的索引文件,若要打开多个索引文件,索引文件之间用逗号“,”隔开。 说明:打开索引文件之前,必须先打开其对应的表。 当有多个索引文件同时打开时,只能有一个索引可以作为当前索引并起作用,其它索引虽然已打开,但不起作用,要设置当前索引,可用如下命令: Set Order To [<数值表达式>|<索引名>] <数值表达式>:指定索引文件列表中第几个作为当前索引。
<索引名>:指定作为当前索引的引索名。 若省略参数<数值表达式>和<索引名>,则是取消当前索引。 例如: Use 学生成绩表 index index1,index2,index3,index4 Set Order to index2 对于复合索引,不需要专门打开索引文件,当打开表时,其对应的索的索引文件也就自动打开了,但索引并不起作用,例如: Use 学生基本信息表 Browse
上面程序命令执后,显示结果如图界面3-29所示 图3-29 记录按物理顺序排列显示
若要使其按索引顺序显示,可按如下步骤操作: 选择主菜单“表”,然后选择“属性”菜单项。屏幕上出现如图3-30所示的窗口。 图3-30 工作区属性窗口
在图3-30中的“索引顺序”选择要使用的索引(如学生基本信息表 在图3-30中的“索引顺序”选择要使用的索引(如学生基本信息表.sno),系统默认的是“无顺序”,选择好后,按“确定”按钮,则屏幕显示如图3-31所示。 图3-31 按“学号”顺序显示记录
对于上面的示例,如果要在程序中使用索引,可按如下方式进行: Use 学生基本信息表 Set order to sno 建立索引文件的目的就是加快对表的查询,与表的索引查询有关的Visual FoxPro命令有2个:Find命令和Seek命令。
2. 索引查询 l Find命令 命令格式: Find <表达式> 参数说明: <表达式>:按索引查询的值,该表达式的值只能是常量值,若表达式是非数字字符串常量,在该命令中可以不使用字符定界符;若表达式是内存变量,则必须用宏代换。
例如: Use 学生基本信息表 Set order to sno Find ‘2004082’ && 在索引上(即学号)查询索引值的 && 前7个字符为“2004082”的记录。 Xh='2004082' Find Xh && 在索引上(即学号)查询索引值的 && 前2个字符为“Xh”的记录。 Find &Xh && 在索引上(即学号)查询索引值的
Find 李平 && 在索引上(即学号)查询索引值的前4 && 个字符为“李平”的记录。 l Seek命令 命令格式: Seek <表达式> 参数说明: <表达式>:按索引查询的值,该表达式中可以有变量,表达中的字符串常量必须使用字符串定界符。
Use 学生基本信息表 Set order to sno Seek ‘2004082’ && 在索引上(即学号)查询索引值的 && 前7个字符为“2004082”的记录。 Xh='2004082' Seek Xh && 在索引上(即学号)查询索引值的 Seek 李平 && 出错,因为没有定义变量“李平”
3.5 多表操作 在实际应用中,一次需要操作多个表的情况是很普遍的,利用Visual FoxPro提供的工作区,可同时打开多个表,工作区是Visual FoxPro在内存中开辟的一块区域,Visual FoxPro提供了32767个工作区,其编号从1到32767,因此在Visual FoxPro可同时打开32767个表,一个工作区一次只能打开一个表,若在一个工作区中已经打开了一个表,再打开另一个表,则系统会自动关闭前面已打开的表。 3.5.1 工作区与别名 正在被使用的工作区称为当前工作区,当Visual FoxPro刚启动时,当前工作区是1号工作区,Visual FoxPro的工作区有32767个,编号从1到32767,对于1~10号工作区,
Visual FoxPro还为其取了别名,分别是A~J。 要指定当前工作区,可使用Selec命令。 Select命令格式: Select <工作区号|工作区别名>|<表别名> 参数说明: <工作区号|工作区别名>:指定要选择的工作区号(1~32767)或工作区别名(A~J)。 <表别名>:指定表别名所在的工作区为当前工作区。 说明:Select 0表示选择当前未用的最小工作区号作为当前工作区。
例如: Select 1 &&选择1号工作区作为当前工作区 USE c:\学籍管理\学生成绩表.dbf Alias cj Select E &&选择E工作区(即5号工作区)作为当前 &&工作区 USE c:\学籍管理\学生基本信息表.dbf . Select 3 &&选择3号工作区作为当前工作区 Select cj &&选择表别名“cj”所在的工作区(即1号 &&工作区)作为当前工作区
Select 学生基本信息表 &&选择表别名“学生基本信息 &&表”所在的工作区(即5号工 &&作区)作为当前工作区 3.5.2 表的关联 表的关联就是在2个或多个表之间建立某种联系,例如,有如下2个表:三好学生和学生基本信息表。
三好学生 三好学生 学号 1 3 … 学号 1 3 … 2 65 姓名 张军 王平 刘丽 李华 性别 男 出生日期 1981.06.23 1982.01.20 1981.04.15 1980.05.11 备注 体优生 班长
这2个表之间的联系是:当“三好学生”表中记录指针移动时,“学生基本信息”表的记录指针也相应移动对应的“学号”记录上,表之间的这种联系就称为表间的关联,“三好学生”表称为父表,“学生基本信息”表称为子表。关联可以是临时性的,也可以是永久性的。 1. 建立表间的临时关联 可使用Set Relation To命令来建立表间的临时关联。 命令格式: Set Relation To [<关系表达式1> into <工作区1>| <表别名1>[,<关系表达式2> into <工作区2>| <表别名2>…][into <工作区>|<表别名>][Additive]
参数说明: <关系表达式n>:指定父表与子表之间建立的关系表达式。 <工作区n>|<表别名n>:指定子表所在的工作区或表别名。 <工作区>|<表别名>:指定父表所在的工作区或表别名,若省略该数,则以当前工作区的表作为父表。 Additive:指在建立表间新的关联时保留以当前工作区中已存在的关联,若省略该参数,则在建立表间新关联时取消所有已存在的关联。 说明:在使用该命令之前必须先对子表建立索引。
例如: Select 1 Use 学生基本信息 Index on 学号 to xh Select 2 Use 三好学生 Set relation to 学号 into a Goto 2 ?学号,A->学号,A->姓名
上述程序运行后,显示结果: 3 3 王平 说明:字段变量的引用格式为 [<工作区别名>|<表别名>]->字段变量 或 [<工作区别名>|<表别名>]->字段变量 参数说明: <工作区别名>:指定要引用的字段变量所在的工作区别(取值A~J)。 <表别名>:指定要引用的字段变量的表别名。
若在引用字段变量时未指定<工作区别名>和<表别名>,则缺省为当前工作区的在的表。 用Set Relation to命令建立的表间的关联是临时的,若下一次再打开这些表,它们之间的这种关联就消失了,若还要让它们关联,必须再用Set Relation to命令来建立它们之间的关联。 2. 建立表间的永久关联 可按如下步骤建立表间的永久关联: 在Visual FoxPro集成开发环境中,新建一个数据库,然后在“数据库设计器”中新建(或将表添加到数据库中)表,并为要建立关联的父表建成立一个主索引,为为要建立关联的子表建成立一个索引,如图3-32所示。
图3-32 “数据库”设计器窗口
在图3-32中选中父表(三好学生表)的主索引(sno),按住鼠标左键不放,将鼠标拖到子表(学生基本信息表)的索引上,然后松开鼠标,此时两表间的关联就建立了(如图3-33所示) 关联线 图3-33建立表间的关联
若要修改关联,在图3-33中,先选中“关联线”,然后点击鼠标右键,在出现的快捷菜单中选择“编辑关系”项,屏幕上出现“编辑关系”对话框(如图3-34所示),可在图3-34修改表和相关表的关联关系。 图3-34 “编辑关系”对话框
在图3-34中点击“参照完整性”按钮,屏幕上出现“参照完整性生成器”窗口(如图3-35所示),在“参照完整性生成器”窗口中可设置关联表间的更新规则、删除规则和插入规则。
图3-35“参照完整性生成器”窗口