Visual Fox Pro
信息与数据
信息:可以被传递,可以被理解
数据:1.参与运算的数值类型(例如1,5,9)
2.不能参与运算的非数值型数据(例如“Hello World”,‘男’)
关系:信息用数据来表示,数据是信息的载体
数据处理
海量的数据通过加工处理得到想要的信息
例如:13 07 28 20050521 12 4 6
省份 城市 区县 出生日期 辖区派出所编号 性别 随机码
数据库系统
- 数据库(DB):放置数据的虚拟仓库
- 数据库管理系统(DBMS):维护和统筹规划数据库
- 数据库系统(DBS):应用程序,操作系统,服务器,数据库,是一个完整的数据生态。
数据库发展史
-
人工管理
(入学资料,身份证复印件,户口本复印件,个人档案) -
文件系统管理
(Windows系统,每个文件相互独立) -
数据库系统管理
(vf,mysql,oracle…)
数据模型
- 层次模型
- 网状模型
- 关系模型
面向对象模型
关系型数据库特点
- 表中记录的增删不会影响到表的结构
- 每列中的字段是唯一的
- 不允许出现完全相同的两行
- 字段和记录的顺序可以随意更改
- 字段不可分割,原子性(原子是组成世界的最小单位)
常见的关系型数据库
Oracle MySql VFP SqlServer Access
vf发展史
- 1986 年 vf1.0
- 1998 年 vf6.0
vf启动
- 快捷方式
- 开始 ----> vf程序(狐狸图标)
vf关闭
- 点关闭按钮
- 文件 ----> 退出
- 命令窗口中输quit回车
环境配置
- 图形操作方式修改-----修改默认文件保存位置
- 使用命令方式修改-----modify window screen font “宋体”,32(修改控制台显示字体样式)
vf工作方式
- 交互操作方式(鼠标点击方式)
- 命令交互方式(每次只能执行一条命令)
- 程序执行方式(多条命令同时执行)
命令演示
*键盘输入数值,数值存储在age中
input to age
?age
*控制台打印字符串,数值以及运算结果
?"Hellow World"
?13
?12*21
*清空控制台
clear
*打印当前日期
?date()
*打印当前时间
?time()
命令规则
- 通常以命令动词开头create database input to a
- 各部分(不同的单词)之间要使用空格隔开
- 一般情况下一行只写一条口令,执行一条口令,如果一行写不下,使用续行符**;**连接
常用数据类型
数据类型 | 取值范围 | 说明 |
---|---|---|
字符型C | 任意长度最大值255 | 任意文本 |
货币型Y | -922337203685477.5808~+ | 货币量 |
日期型 | 0001-01-01~9999-12-31 | 年月日 |
日期时间 | 0001-01-01 00:00:00 a | 日期和时间 |
逻辑型L | .T. .F. .t. .f. .Y. .N. .n. .y. | 布尔值 |
整型I | -2147483647~+ | 整数 |
数值型N | -0.9999999999E+19~0.9999999999E+20 | 整数或小数 |
浮点型 | 同上 | 同上 |
双精度 | +/-4.94065645841247E-324~+/-8.9884656743115E307 | 双精度浮点数 |
通用型G | 受可用空间限制 | OLE对象引用 |
备注型M | 数据块引用 |
常量
数据处理中其值固定不变的量称为常量
PI = 3.14
S = PI*r*r &&PI表示圆周率,其值固定,所以为常量
数值型常量
-
整数:由数字组成,如0,-2,3
-
实数:1.十进制表示形式:由数字,正负号,小数点组成。如0.23,-3.14
2.指数形式:由数字,小数点,E或e组成 1.23*(10^3)------------->1.23E3
字符型常量
字符是使用定界符(“”‘’[])括起来的一些列有效字符,也称为字符串;字符串最大长度为254个字符
>?'123'
>?[看着我的"眼睛"]
❤注意❤:
- 如果字符串中包含一种定界符,必须使用另一种定界符括起来
- 定界符必须成对出现
- 空串和空格字符串不一样
- 字母的大小写不同
- 定界符内纯数字则为字符类型
逻辑型常量
只有**真(True)和假(False)**两种值
表现方式:
- 逻辑真:.Y. .y. .T. .t.
- 逻辑假:.N. .n. .F. .f.
货币型常量
以$开头,四舍五入到小数点后4位
?$100.12345 &&输出结果为100.1235
日期型常量
必须使用**{ }**括起来
-
通用格式{mm/dd/yyyy}
-
严格格式{^yyyy-mm-dd}
-
set strictdate to 0 设置通用
-
set strictdate to 1 设置严格
❤通用格式与工具中区域设置相关联,使用前确定区域设置是否正确
日期时间型常量
-
1.通用格式:{mm/dd/yyyy[hh[:mm][:ss][a|p]]}
?{9/15/99 8:45}
-
2.严格格式:{^yyyy-mm-dd[hh[:mm][:ss][a|p]]}
?{^2008-08-08 08:08:08 p}
变量
- 值可以改变的量
- 分为字段变量和内存变量
- 变量拥有名称,统称为标识符
命名规则
- 由数字,字母,下划线组成
- 以字母,下划线开头
- 避免使用vf关键字
变量的定义和赋值
-
直接创建
变量名 = 表达式 | 值
x=2 x = 3*3
-
同时为多个变量赋值
store 表达式 | 值 to 变量名
store 3 to a,b,c
显示变量内存
display memory [like 变量通配名]
变量通配名中?表示一个字符,*表示任意个字符
删除内存变量
- clear memory —删除所有变量
- release 变量名 —删除指定变量(支持多个)
变量的输出?|??
- ? 换行输出
- ?? 不换行输出
数组
- 数组是按一定顺序排列的数据集合
- 数组中每一个数据称为一个元素
- 数组中每一个元素的序号称为下标(从1开始)
- 数组中的所有元素在内存中是连续存放的
数组的定义
语法:dimension | declare 数组名(元素个数)
dimension Array1(3)
declare Array2(3)
&&以上两种方式都能进行数组的创建
❤数组定义后默认为每个元素赋值,默认值为**.F.**
&&定义成功后使用命令查看数组内元素
display memory
数组的访问
-
使用元素下标访问对应元素
&&打印数组中的元素 ?Array1(1) ?Array1(2) ?Array1(3)
数组中元素的赋值
-
单独赋值
&&使用数组下标对单个元素赋值 Array1(2) = "中国" Array1(3) = "遥遥领先"
-
统一赋值
&&使用变量赋值方式对数组中的所有元素进行统一赋值 Array1 = "我爱VF" ?Array1(1),Array1(2),Array1(3) &&"我爱VF" "我爱VF" "我爱VF"
二维数组
语法:dimension | declare 数组名(行数,列数)
declare Array2(2,4) &&创建一个两行四列的数组
二维数组的访问
数组名(行数,列数)
?Array2(1,1)
?Array2(1,2)
?Array2(1,3)
?Array2(1,4)
二维数组的赋值
Array2(1,1) = "华为手机"
运算符
算数运算符
运算符 | 说明 |
---|---|
+ - * / | 与数学中用法相同 |
() | 子表达式分组,提高优先级 |
**或^ | 乘方 |
% | 模运算、取余操作 |
?3+2 &&结果为5
?3-2 &&结果为1
?3*2 &&结果为6
?3/2 &&结果为1.5
?(3-2)*3 &&结果为3
?3**2 &&结果为9
?3^2 &&结果为9
?10%3 &&结果为1
字符运算符
运算符 | 操作 |
---|---|
+ | 字符串连接 |
- | 字符串连接 ,删除连接处空格 |
$ | 包含运算 ,结果为逻辑型 |
a = "华为 "
b = "遥遥领先"
?a+b &&>华为 遥遥领先
?a-b &&>华为遥遥领先
?"abc"$"abcdefg" &&>.T.
日期和日期时间型运算
运算符 | 操作 |
---|---|
+ | {^2004-02-18}+10 {^2004-02-18 11:10 a}+10 |
{^2004-02-18}- {^2004-02-8} | |
- | {^2004-02-18 11:10} - {^2004-02-18 11:10} |
{^2004-02-18}-10 |
?{^2023-09-21}+10 &&2023-10-01
?{^2023-09-21}-10 &&2023-9-11
?{^2023-09-21 8:8:8 a}-10 &&2023-9-21 08:07:58 AM
?{^2023-09-21 16:28:30}-{^1996-03-14 08:30:00} &&868521510
❤两个日期不能相加;日期与日期时间型不能相减
关系运算符
运算符 | 操作 | 示例 |
---|---|---|
< 、 > | 小于、大于 | 10>20;10<20 |
= | 等于 | 10=20;’abc’=‘ab |
<>、#、!= | 不等于 | 10<>20 |
>= <= | 大于等于 小于等于 | 10>=20 10<=20 |
= = | 精确比较 ,针对字符串 | “abc”==“ab” |
逻辑运算符
运算符 | 操作 | 示例 |
---|---|---|
NOT | ! | 逻辑非 | NOT .F. |
AND | 逻辑与 | .T. AND .F. |
OR | 逻辑或 | T. OR .F. |
运算符优先级
数值运算符 > 关系运算符 > 逻辑运算符
表达式
由不同运算符组成的表达式
&&算数表达式
#DEFINE PI=3.14
R=10
S=PI*R*R
&&字符表达式
“姓名:”+TRIM(js.xm)
LEFT(“中华人民共和国”,4)
&&日期表达式
DATE()-{^2004-02-10}
{^2004-02-10}+10
&&关系表达式
30>30
‘A’==‘a’
DATE()-10>{^2004-02-10}
&&逻辑表达式
NOT (50>300)
‘A’=‘a’ AND .F.
.T. OR .F.
函数
定义:函数是一种预先编制好的程序代码,可供用户调用。
注意:函数可以接受0或多个参数
函数只能由一个返回值
使用:函数名([参数],[参数2])
分类:
-
数值函数
函数名 说明 示例 结果 abs() 求绝对值 abs(-5) 5 int() 取整 int(10.5) 10 round() 四舍五入 round(3.1415,2) 3.14 sqrt() 求算数平方根 sqrt(9) 3 log() 求自然对数 log(10) 2.3 max() 最大值 max(1,5,6,2) 6 min() 最小值 min(2,5,9,3) 2 mod() 取余 mod(10,3) 1 rand() 随机数,默认0~1随机数 int(rand()*10) 0~10随机数 ?abs(-5) &&绝对值 ?max(10,5,2) &&求最大值 ?int(10.5) &&求整 ?round(3.14159) &&四舍五入 ?round(3.14159,3) &&四舍五入 ?sqrt(9) &&开平方根 ?mod(10,3) &&取余 ?rand() &&随机数 ?int(rand()*10) &&随机数 ?log(10) &&自然对数
-
字符函数
函数名 说明 示例 结果 space() 生成空格 space(2) " " trim() 删除左右两边空格 trim(" abc ") “abc” ltrim() 删除左边空格 ltrim(" abc ") "abc " rtrim() 删除右边空格 rtrim(" abc ") " abc" alltrim() 删除左右两边空格 alltrim(" 132 ") “132” left() 从左边开始截取指定字符串 left(“abcd”,2) ab right() 从右边开始截取指定字符串 right(“abcd”,2) cd substr() 从指定位置开始,截取指定个个数字符串 substr(“abcdef”,3,2) cd len() 计算字符串的长度 len(“abc”) 3 at() 返回一个字符串在另一个字符串中出现的位置 at(‘b’,‘abcabc’) 2 ?trim(" 1 12 2 ") ?alltrim(" 1 12 2 ") ?left("abcd",2) ?right("abcd",2) ?substr("abcdef",2,3) ?len("jhfdk") ?AT('b','abcabc') ?AT('b','abcabc',2)
-
日期时间函数
函数名 说明 示例 结果 date() 返回当前系统日期 date() 09/26/23 year() 返回日期表达式年份 year({^2023-09-26}) 2023 month() 返回日期表达式月份 month({^2023-09-26}) 9 day() 返回日期表达式日的数值 day({^2023-09-26}) 26 time() 返回当时系统时间hh:mm:ss time() 10:56:31 datetime() 返回当时系统日期时间 datetime() 09/26/23 10:56:31 AM dow() 返回星期几的域 dow({^2023-09-26}) 3 ?DOW(DATE()) ?date() ?year({^2023-09-26}) ?month({^2023-09-26}) ?day({^2023-09-26}) ?time() ?datetime()
-
类型转换函数
函数名 说明 示例 结果 str() 将数值转换为字符串
默认长度为10str(123) “123” val() 将字符型数值转换为数值型数据 val(“132”) 123 ctod() 将字符型日期转换为日期型数据 ctod(“09/26/23”) 09/26/23 dtoc() 将日期类型转换为字符型类 dtoc({^2023-09-26}) 09/26/23 upper() 将小写字母转换为大写 upper(“abc”) ABC lower() 将大写字母转换为小写 lower(“ABC”) abc asc() 返回第一个字符的ASCII码 asc(“a”) 97 chr() 将数值转换为ASCII对应的字符 chr(97) a ?str(123) ?val("123") ?ctod("09/26/23") ?dtoc({^2023-09-26}) ?upper("abc") ?lower("ABC") ?asc("a") ?chr(97)
-
其他函数
函数名 说明 示例 结果 between() 判断是否位于某个区间内 BETWEEN(“b”,“a”,“c”) .T. inkey() 返回所摁键盘的键值 INKEY(),INKEY(0),INKEY(2) type() 返回查询的数据类型 type(123) N iif() 判断函数 iif(a=b,“T”,“F”) T diskspace() 返回空闲磁盘空间 diskspace() file() 查询文件是否存在 file(“c:\sparkraw.log”) .T. messagebox() 创建消息对话框 ?MESSAGEBOX(“是否重来”,4+32+256, “错” ) getfile 返回一个和指定路径中文件相对应的 File 对象 empty 测试是否为空 empty(“123”) .F. ?INKEY(),INKEY(0),INKEY(2) ?DISKSPACE() ?FILE("c:\sparkraw.log") ?MESSAGEBOX("是否重来",4+32+256, "错" ) ?empty(133)
数据库与表
数据库
- 数据库是数据库系统的核心,由表,视图,关系等组成,通俗的理解为存储数据的仓库。
- 数据库文件名.dbc
- 关联数据库备注文件.dct
- 关联索引文件.dcx
表
- 表是数据库中的基本元素,数据库是表的集合。
- 表中分为行与列,每一列为一个字段,每一行为一条完整的数据。
- 表的分类:
- 自由表:不属于任何数据库而独立存在的表。
- 数据库表:属于某一数据库的表
数据库设计步骤
- 明确设计目的
- 确定数据表
- 确定表中需要的字段
- 确定表之间的关系
- 优化设计
实操建库建表
-
创建项目
-
视图方式
-
命令方式:Create project 项目名
❤注意:项目存储路径为默认路径VF98,使用set default to 路径可修改默认路径
-
-
数据库操作
-
视图方式
-
命令方式:
-
创建:create database 数据库名
-
打开:open database 数据库名
-
指定数据库:set database 数据库名
-
打开数据库设计器:modify database 数据库名
-
关闭数据库:close database
-
删除数据库:delete database 数据库名
-
有效性检查:validate databse
-
清理缓存:pack database
-
-
-
创建表
-
视图方式:
-
命令方式:
语法: Create table|dbf 表名( 字段名1 数据类型 (宽度), 字段名2 数据类型 (宽度), ... ) 示例: create table 学生(姓名 c(10),年龄 n(10))
-
操作表
add table &&将自由表添加到数据库中 remove table &&移去(将数据库表变为自由表)/删除表(物理删除) list|display structure &&查看表结构 modify structure &&打开修改表结构窗口 使用命令修改表结构 alter table 表名 add 字段名 字段类型 [字段宽度] &&新增字段 alter 字段名 字段类型 [字段宽度] &&修改字段 rename 旧字段名 to 新字段名 &&修改字段名 drop 字段名 &&删除字段 copy files 表名.* to 新表名.* &&复制表,复制时表必须是关闭状态 示例:copy files 学生表.* to 学生表1.* &&因为表有附属文件,所有复制时使用通配符* type 文件名 &&查看文本文件内容
-
数据操作
-
use 表名称 &&打开数据表 use &&关闭当前打开表 --在窗口显示记录 browse &&显示所有记录 browse [fields 字段名] &&浏览显示表指定字段记录 --在输出窗口显示记录 list &&查看所有数据 list for 条件 &&根据条件删选显示 list for 条件 to file 文件名 &&将筛的数据输出到文件中 --追加记录 append &&打开视图窗口追加记录 append blank &&追加一条空白数据 --打开视图界面添加数据 insert &&在当前数据后添加一条数据 insert blank &&在当前数据后添加一条空白数据 insert before &&在当前数据前添加一条数据 insert before blank &&在当前数据前添加一条空白数据 --数据修改 语法:replace [范围] 字段名 with 值 [for 条件] replace all 身高 with 身高*1.02 for 性别="男" --范围子句 RECORD <N> 表示指定第N个记录; NEXT <N> 表示从当前记录开始的N个记录; ALL 表示数据库的所有记录; REST 表示从当前记录开始到最后一个记录。 --删除数据 --逻辑删除:给数据添加一个删除标记,数据并没有真正消失 --1.视图方式 --2.命令方式 语法:delete [范围] [for 条件] delete all for year(出生日期)<1985 --恢复数据 语法:recall [范围] [for 条件] recall all for year(出生日期)<1985 --物理删除:将数据从磁盘上彻底清除,无法恢复 pack &&将逻辑删除的数据彻底删除 zap &&无脑删除所有数据,只保留表结构
-
数据定位
--绝对移动指针 go|goto <数值表达式>|top|bottom &&将记录指针移动到相应位置 go 3 &&指针移动到第三条数据 go bottom &&指针移动到末数据 go top &&指针移动到首条记录 dislap &&显示指针指向的数据 --相对移动指针 skip [<数值表达式>] &&数值表达式为正数向下移动,负数向上移动,省略下移一条记录 go 2 &&指向第2条记录 skip &&指向第3条记录 skip 3 &&指向第6条记录 skip -2 &&指向第4条记录 --定位查找记录 locate [<范围>] for <条件> &&将指针定位到符合条件的第一条记录上,范围默认为all locate for 性别='男' continue &&继续指向符合条件的记录 --判断指针位置 bof() &&如果指针在第一条记录返回.T. eof() &&如果指针在最后一条记录返回.T. recno() &&返回当前指针指向的记录号 reccount() &&返回当前表总记录数
-
数据表与数组之间的数据交换
--将表中数据赋值给数组 语法: scatter [fields 字段名]|[memvar] to 数组名 [memo] fields:需要传入指定字段是后边加字段名 memo:需要将备注类型值传入的话加memo memvar:将数据赋值给同名变量,变量不需要定义 示例: dimension a(3) &&定义数组 go 1 &&指向第一条数据 scatter to a &&将第一条数据赋值给数组a ?a(1),a(2),a(3) scatter fields 姓名,性别,备注 to a memo &&将指定字段传入数组,并且传入备注内容 ?a(1),a(2),a(3) scatter memvar &&将当前数据赋值给同名变量 ?姓名,性别 --将变量中的值传给当前记录 语法: gather [memvar]|[from 数组名] memvar:将同名变量的值赋值给表中空白数据 示例: dimension b(3) b(1) = "1024" b(2) = "李松" b(3) = "男" gather from a &&将数组b中的值新增到表中当前数据之后 append blank &&某位新增一条空白数据 学号 = '1025' 姓名 = '崔永胜' 性别 = '男' gather memvar &&将上述变量的值添加到表中的空白行
-
将多条记录与数组传递
--将多条记录数据传送给数组 语法: copy to array 数组名 [fields 字段名] [范围] [for 条件] [while 条件] 示例: dimension a(3,3) &&定义二维数组 copy to array a &&从当前数据向下开始3条数据存储到二维数组a中 --将数组中的内容添加到表数据中 append from array 数组名 示例: append from array b
-
记录的筛选与排序
--记录的筛选 1.命令方式 set filter to 条件 &&根据筛选条件显示符合条件的数据 set filter to &&清楚筛选规则 示例: set filter to 性别="男" --记录的排序(物理排序) --将排序好的数据保存至新文件 语法: sort to 文件名 on 排序字段 [ /a | /d ],[排序字段2] a:升序(默认值) d:降序 示例代码: sort to 学生1 on 出生日期 /d &&按照出生日期降序排列 sore to 学生2 on 性别 /a,学号/d &&性别升序,性别相同的情况下按学号降序排列
-
索引
表记录在表文件中按照输入记录的顺序(物理顺序)排列,表中记录的排列是没有规律的。在数据处理中,为了高效方便地存取数据,需要对表进行重新组织,使表记录以一定的顺序排列或显示。索引则是对表中的记录进行的逻辑排序。通过索引,能够迅速地对记录进行查找。
基本概念
索引就是按照一定的规则对表中的记录进行逻辑排序,并将排序的结果形成索引文件。表的索引决定了记录的处理顺序,但并不改变表中记录的物理顺序(即不改变记录在表中的记录号),只是对记录的一种逻辑排序。
索引关键字
是建立索引的依据,指在数据表中建立索引时用的字段或字段表达式,可以是单个字段,也可是表中几个字段组成的表达式。不能是备注型字段。
索引标识
通过索引关键字建立的索引名称,由用户指定(不超过10个字符构成)。每一个索引标识代表一种逻辑顺序
记录顺序的分类
-
物理顺序
在表文件的实际排列顺序,每个记录对应一个记录号,标识记录的物理顺序
-
逻辑顺序
按某个关键字或关键字表达式建立的一种有序的顺序
-
使用顺序
实际操作的记录顺序。可以是物理顺序,也可以是逻辑顺序。
索引文件分类
索引文件与表文件分别存储,属于表的附属文件,不能脱离数据表独立使用。
- 独立索引文件(.idx):只包含一个索引标识
- 复合索引文件(.cdx):包含多个索引标识
索引类型
- 主索引:又称主关键字,一个表中只能有一个,建立索引的关键字段值不能重复,确保数据的唯一性,自由表不能建立主索引。
- 候选索引:是在索引关键字中不允许出现重复值的索引,自由表也可使用,每个表中可建立多个候选索引。
- 普通索引:允许索引关键字值重复出现的索引
- 唯一索引:为兼容旧版本而设立,了解即可
索引的创建
-
视图方式(创建的索引都是复合索引)
复合索引可以创建多个,所以创建完成后直接打开表不会生效,需要手动指定主控索引
set order to 索引名
-
命令方式
f
创建独立索引
语法: index on 索引表达式 to 文件名 示例: copy to stu1 &&将当前表复制生成新表,以免数据丢失 use stu1 &&打开测试表 index on 入学成绩 to xh &&创建索引名称为xh browse &&查看记录
单索引只支持数值类型的升序排列
如何实现成绩的降序排列呢?index on -1*成绩 to cj
曲线救国,正数越大相反数越小,利用这一特性将成绩变为相反数,进行升序排列,最终成绩会以降序方式排列
创建复合索引
语法: index on 索引表达式 tag 索引标识符 [desc] desc:降序 asc:升序(默认值) 示例: copy to stu2 &&将当前表复制生成新表,以免数据丢失 use stu2 &&打开测试表 index on 学号 tag xh desc &&创建复合索引,根据学号降序排列 browse
索引的使用
结构复合索引文件能随能随表的打开而自动打开,
其他索引文件必须用过用户的手工操作才能打开。
表与索引文件同时打开(独立索引)
use 表名称 index 索引文件名 示例: use 学生信息 index cj brow
打开表后单独打开索引文件(独立索引)
语法: set index to 索引文件名 [additive] 示例: use 学生信息表 brow &&表中数据显示按照添加数据顺序显示 set index to cj &&打开独立索引文件 brow
复合索引中指定主控索引文件
语法: set order to 索引文件名 示例: use stu2 brow &&数据采用默认排序 set order to xh &&将学号排序设置为主控索引
关闭索引
close indexes &&关闭所有打开的索引
重新索引
当对表中的数据进行新增,删除,修改时,系统会更新打开的索引文件。以保证索引的内容有效。但如果某些索引没有和表一起打开,当表中的数据进行修改时,没打开的索引不会更新,需要手动更新。
reindex
删除索引
-
独立索引:文件可以直接在文件夹内直接删除.idx文件
-
复合索引:
-
使用视图方式在表设计器中删除
-
命令删除
delete tag 索引标识 删除指定索引 delete tag all 删除所有索引
-
索引查找记录
之前我们讲过使用locate命令查找数据,但如果表中的数据很多,达到百万千万级别,那么查找记录的时间就会非常缓慢,效率很慢,为了提高查找数据的效率,在查找记录之前,必须先建立索引文件,被查找的内容必须与主控索引的索引表达式一致。
语法:seek 索引表达式值 示例:seek 9 &&指针指向学号为9的记录 语法:find 索引表达式值
数数据统计
计数:对符合条件的记录进行计数统计,统计结果存放到变量中
语法: count for 条件 to 变量名 count for 性别="男" to xb ?xb
求和:对指定数值类型字段进行求和,支持多个字段求和操作,结果显示在控制台中
语法: sum 字段名1[,字段名2] 示例: sum 入学成绩
数据分类汇总 TOTAL ON <汇总关键字> TO <表文件名>
-
设置字段属性
字段默认值
输入记录时如果某些字段的值比较固定,例如民族等,可以为该字段设置默认值。
信息:提示信息
默认值:为该字段设置默认值
字段有效性
通过设置有效性规则,判断输入的数据是否符合要求。例如限制性别字段只能输入’男’或’女’,输入其他值提示错误信息。
规则:字段有效性表达式
工作区
vf中存在多工作区的概念,每个工作区代表一个舞台,一个表表示一个节目,同一个舞台同时只能表演一个节目,同一个工作同时只能打开一个表。vf中提供32767个工作区。系统为每个工作区规定了一个工作区号,分别是132767,110号工作区也可以使用A~J表示,默认使用1号工作区。
选择工作区
视图方式
命令方式
select 工作区号
- 工作区号可以直接使用1~32767
- 0表示切换当前没有使用的最小区号工作区
- 只有select命令能够切换工作区
select 1 &&选择1号工作区
use 学生信息 &&在1号工作区打开学生信息表
select B &&选择2号工作区
use 成绩表 &&在2号工作区打开成绩表
select 0 &&选择没使用的最小区号工作区,3号工作区
use 学科表 &&在3号工作区打开学科表
select A &&选择1号工作区
查看当前工作区
?select()
打开表的同时为表指定别名
use 表名 alias 别名
use 学生信息 alias xsxx &&打开学生信息表,别名为xsxx
use 表名 in 工作区 alias 表别名
use 学生信息 in 2 alias xsxx &&在2号工作区打开学生信息表,别名为xsxx
下列命令执行完在哪个工作区内
表之间建立关系
-
表的关系
当前表与其他打开的表之间建立一对一或一对多的关系。建立关系后,当前表为主表,与之建立关系的表称为子表。建立了表关系后,主表记录指针移动时,系统会自动移动子表的记录指针指向匹配的数据。
-
分类
- 一对一关系:主表和子表均应按照相同的关键字建立主索引或候选索引
- 一对多关系:主表应该建立主索引或候补索引,子表可以建立普通索引
- 多对多关系:都是普通索引
-
永久关系
永久关系建立后,每次使用表时不需要重新建立,但永久关系不能控制不同工作区中记录指针的移动
- 建立永久关系
- 打开数据库文件,进入数据库设计器窗口
- 建立索引。
- 一对一关系:父表中与子表中同名的字段均定义为主索引。
- 一对多关系:父表定义为主索引,子表定义为普通索引。
- 一对一关系:父表中与子表中同名的字段均定义为主索引。
- 建立表间关系
- 一对一
- 一对一
2.一对多
- 建立永久关系
-
零时关系
也称为关联表,就是是不同工作区的记录指针建立一种临时的联动关系,当一个表中的指针移动时另一个表的指针也随之移动。
-
前提条件
- 两个表,建立关系的为父表,被关联的为子表
- 父表与子表有相同的字段
- 为子表的关键字建立索引,并设置为当前索引
-
建立关系
-
视图方式
-
命令方式
set relation to 索引表达式 into 子表
-
分别在不同工作区打开父表和子表
use 基本信息 in 1 use 成绩表 in 2
-
切换到子表工作区(工作区2|B)
select 2
-
子表学号字段构建索引,并设置为主控索引
index on 学号 tag xh set order to xh
-
切换到父表工作区(工作区1|A)
select 1
-
构建父表和子表间的零时关系
set relation to 学号 into 成绩
-
-
-
参照完整性
- 将两个表创建永久关系
- 在数据库菜单中选择清理数据库
- 鼠标右击表间连接线,选择“编辑参照完整性”
更新规则
- 级联:主表连接字段值修改子表跟着修改
- 限制:父表与子表存在关联数据则禁止父表修改对应数据
- 忽略:任意修改不做限制。
删除规则
- 级联:删除父表记录时自动删除子表关联记录
- 限制:删除附表记录时如果子表有关联记录则禁止删除父表记录
- 忽略:随意删除没有限制
插入规则
- 限制:插入子表记录时父表有关联数据才能插入成功
- 忽略:随意插入没有限制
查询视图
查询
用户可以根据需求,选择要显示的字段,定义一些过滤规则,将查询结果保存为文件,这样以后在做数据查询时,只需要调出保存的查询文件即可。
建立查询
-
打开项目管理器中的数据选项卡,点击新建按钮
-
选择新建查询
-
选择要查询的数据库及其表,可以选择多个表,添加后点关闭按钮
-
根据需求添加要查询的字段,多表查询的话一定要给表建立永久关系(也可后期指定)。只添加主表关联字段,子表不添加
-
点击运行查看查询结果
-
点击保存,将查询文件保存为.qpr文件,下次使用可直接打开。
-
查询时指定表之间的关系
-
查询时也可添加删选条件
-
设置排序规则
运行查询
- 视图方式
- 命令方式:do 查询文件名.qpr
修改查询
- 视图方式
- 命令方式:modify query 查询文件名称
查询去向设置
- 浏览:浏览窗口显示查询结果
- 临时表:查询结果存储在一个临时的只读文件中
- 表:查询结果存储在一个表(.dbf)文件中
- 图形:查询结果输出成图形文件
- 屏幕:查询结果输出到打印窗口中
- 报表:查询结果输出到一个报表文件中
- 标签:输出到一个标签文件中
视图
视图是一个定制的虚拟表,是引用数据库的数据,类似于地方台转播中央台,基于数据库建立的,因此创建视图之前必须有数据库。
建立试图
- 文件------>新建-------->选择视图-------->新建文件
- 项目管理器中数据选项卡打开要建立视图的数据库,选择本地试图或远程视图
- 命令创建:create view
视图的使用
视图的使用与查询基本一致,相较于查询来讲多了一个更新条件。
为了通过视图能够更新基本表中的数据,需要勾选“发送SQL更新”复选框。
视图命令操作
- 创建视图:create view 视图名
- 修改,打开试图:modify view 视图名
- 删除视图文件:drop | delete view 视图名
视图与查询的区别
- 视图依赖于数据库,有数据库才能使用,而视图可以独立存在
- 查询结果以.qpr文件保存至硬盘,而视图没有独立文件,是保存在数据库中。
- 视图可以更新。
SQL语言
SQL(Structured Query Language,结构化查询语言)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理数据库系统。
分类
- DDL(数据定义语言):create、drop、alter等语句。
- DML(数据操作语言):insert、update、delete等语句。
- DQL(数据查询语言):select语句。
- DCL(数据控制语言):grank、revoke、commit、rollback等语句。
数据定义语言(DDL)
-
创建表
create table 表名[free](字段名1 字段类型[宽度,小数位数] [primary key | unique],字段名2...)
free:定义表为自由表,如果表为数据库表则不加
primary key:将该字段设置为主键
unique:将该字段定义为候选索引关键字
数据类型,宽度及小数位的字母代码如下:
数据类型 字母表示 宽度 小数位 字符型 C n - 数值型 N n d 浮动型 F n d 双精度型 B - d 货币型 Y - - 日期型 D - - 日期时间型 T - - 整型 I - - 逻辑型 L - - 备注型 M - - 通用性 G - - 示例:
--创建“图书管理”数据库并创建“图书”表 --表结构(书号(C,10),书号(C,10),作者(C,10),出版社(C,10),定价(N,6,1)) create database 图书管理 &&创建图书管理数据库 create table 图书(书号 C(10) primary key,书名 C(10); &&;为续行符,将书号设置为主键 作者 C(10),出版社 C(10),定价 N(6,1))
练习:创建自由表“教工”(教工号(C,10),姓名(C,10),所教专业(C,10),所属系别(C,10),入职时间(d))
create table 教工 free(教工号 C(10),姓名 C(10),所学专业 C(10),所属系别 C(10),入职时间 D)
将自由表添加为数据库表
将自由表“教工”添加至“图书管理”数据库
open database 图书管理 add table 教工
定义字段有效性及默认值
create table 表名[free](字段名1 字段类型[宽度,小数位数] [check 表达式 error 提示信息] [default 表达式],字段名2...)
check:定义字段有效性
error:错误提示信息
default:设置默认值
示例:
在“图书管理”数据库中创建“读者”表(借书证号(C,6),姓名 (C,6),性别 (C,2),民族 (C,4),所在系(C,10),出生日期D,入学成绩(N,5,1)),其中“借书证号”为主关键字,“民族”字段默认值为“汉族”,“入学成绩”字段的取值范围为602~750。
open database 图书管理 create table 读者(借书证号 C(6) primary key,姓名 C(6),性别 C(2),名族 C(4) default "汉族"; 所在系 C(10),出生日期 D,入学成绩 N(5,1) check 入学成绩>=602 and 入学成绩<=750; error "入学成绩不合理!")
练习:在“图书管理”数据库中创建“借阅”表(借书证号 (C,6),借阅书号(C,10),借阅日期D,应还书日期 D,是否归还L,罚款金额(N,5,1))借阅日期默认为当天,罚款金额5~20
open database 图书管理 create table 借阅(借书证号 C(6),借阅书号 C(10),借阅日期 D default Date(),应还书日期 D; 是否归还 L,罚款金额 N(5,1) check 罚款金额>=5 and 罚款金额<=50)
修改表结构
alter table 表名 add 字段名 字段类型 [宽度,小数点位] alter 字段名 字段类型 [宽度,小数点位] [set check|default] drop 字段名 rename 旧字段名 to 新字段名
add:新增字段
alter 字段名:修改字段
drop:删除字段
drop check|default:删除规则或默认值
rename:字段名重命名
示例
-
为“教工”表添加“职称”C(10)字段并设置默认值为“讲师”。
alter table 教工 add 职称(C,10) default "讲师"
-
为“教工”表中“姓名”字段类型修改为C(6)。
alter table 教工 alter 姓名(C,6)
-
修改“读者”表中入学成绩的字段,成绩应该控制在500~750之间。
alter table 读者 alter 入学成绩 set check 入学成绩>=500 and 入学成绩<=750
-
删除“读者”表中关于”入学成绩“的有效性规则。
alter table 读者 alter 入学成绩 drop check
-
删除“教工”表中“入职时间”字段。
alter table 教工 drop 入职时间
-
将“教工”表中“所学专业”字段名改为“所教课程”。
alter table 教工 rename 所学专业 to 所教专业
删除表
drop table 表名
物理删除自由表或数据库表,删除数据库表时必须打开其所属的数据库。
示例
删除“图书管理”数据库中的“教工”表
open database 图书管理 drop table 教工
-
数据操作(DML)
-
插入记录
insert into 表名 (字段名1,字段名2...) values (值1,值2...)
示例
在“图书管理”库中的“图书”表中插入一条记录(“001”,“操作系统”,“严一平”,“清华大学”,35.2)
open database 图书管理 insert into 图书(书号,书名,作者,出版社,定价)values(“001”,“操作系统”,“严一平”,“清华大学”,35.2)
练习
-
更新记录
update 表名 set 字段1=值1,字段2=值2...where 条件
示例:
将“图书”表中出版社为“电子工业”的图书的定价增加10%
update 图书 set 定价 = 定价*1.1 where 出版社="电子工业"
练习
-
删除记录
delete from 表名 where 条件
删除操作是逻辑删除,如需物理删除还需使用pack,恢复记录使用recall命令
示例
删除“图书”表中的出版社为“北京大学”的记录。
delete from 图书 where 出版社="北京大学"
数据查询(DQL)
-
简单查询
语法:select [distinct] 查询项1 [as 别名1],查询项2 [as 别名2]…from 表名
distinct:去除查询结果中的重复项
查询项:要查询的字段,多字段使用逗号分隔,*号表示所有字段,也可使用标准函数。
as:为查询的字段起别名,别名为显示的列标题
from:指定查询的表函数查询项 含义 sum() 字段求和 avg() 字段求平均值 count() 统计记录条数,相同记录只统计一条 max() 求最大值 min() 求最小值 示例:
从”图书“表中检索出图书库中共包含哪些出版社的图书。
select distinct 出版社 from 图书
从图书库中检索出多个出版社出版的图书,要求输出”出版社“,”书名“和”单价“,其中”单价“即为表中的”定价“字段。
select 出版社,书名,定价 as 单价 from 图书
查询”图书“表中图书的种类、最高单价,最低单价以及平均价
select count(*) as 图书种类,max(定价) as 最高单价,min(定价) as 最低定价,avg(定价) as 平均价 from 图书
条件查询
语法:select [distinct] 查询项1 [as 别名1],查询项2 [as 别名2]…from 表名 where 条件
查询条件 内容 含义 比较运算符 = < > <= >= <> - 逻辑运算符 and or not - 字符匹配 like 模糊查询,_表示任意一个字符,%表示任意多个字符 区间 between…and… 范围查询 包含 in() not in() 是否包含(不包含)在括号内 空值 is null is not null 是否为(不为)空值 示例:
查询”图书“表中定价在45元以下的图书的书名、出版社及定价信息。
select 书名,出版社,定价 from 图书 where 定价<=45
查询“图书”表中刘姓作者的图书信息。
select * from 图书 where 作者 like "刘%"
查询“图书”表中清华大学出版社的价格在50元以下(含50元)的图书信息。
select * from 图书 where 出版社="清华大学" and 定价<=50
多表查询
要查询的字段项包含在多个表中时,就与要用到多表查询。
select 查询项 from 表名1,表2 where 查询条件 and 表1.字段=表2.字段
示例:
查询“周正正”同学所借图书的书名及作者信息。
select 姓名,书名,作者 from 读者,借阅,图书 where 读者.借书证号=借阅.借书证号 and 借阅.借阅书号=图书.书号 and 姓名="周正正"
-
嵌套查询
select查询语句中包含另一个select查询语句,通常将子查询语句的结果作为父查询语句的条件。
语法:select 查询项 from 表 where 查询条件 in|not in|=(select 查询项 from 表 where 查询条件)
示例:
查询所有已借图书的信息
方法一:(传统思路)
1.在借阅表中查询已借图书的图书编号
select distinct 借阅书号 from 借阅
2.根据上述查询结果在图书表中查询对应的图书信息
select * from 图书 where 书号 in(001,002,007,008,010)
方法二:嵌套查询,将第一条sql查询结果作为第二条sql的查询条件
select * from 图书 where 书号 in(select * from 图书 where 书号 in(001,002,007,008,010))
-
排序查询
将查询结果根据字段做排序,可以设置根据多个字段排序。默认排序方式为升序。
语法:select 查询字段 from 表 where 查询条件 order by 排序字段[asc|desc]
示例:
查询图书表中所有信息,结果按照定价从高到低排列。
select * from 图书 order by 定价 desc
查询图书表中的所有信息,按出版社升序,定价降序排列。
select * from 图书 order by 出版社 asc,定价 desc
-
分组查询
对查询结果进行分组
select 查询项 from 表 where 查询条件 group by 分组字段 [having 条件]
分组查询主要用于统计查询,因此经常配合sum()、avg()、count()、max()、min()函数使用
having:分组之后去除不满足条件的记录。
示例:
查询各出版社中图书的种类以及最高单价
select 出版社,count(书名) as 图书种类,max(定价) as 最高单价 from 图书 group by 出版社
-
查询去向
将查询结果输出到打印机、显示在屏幕上,也可将查询结果保存到数组、临时表、表、文本文件中
select 查询项 from 表名
where 查询条件
group by 分组字段
order by 排序字段
into array 数组名|cursor 临时表名|dbf 表名|table 表名
to file additive|printer|prompt|screen
printer:查询结果输出到打印机
screen:查询结果显示在屏幕上
连接查询
- 内连接查询
- 左连接查询
- 右连接查询
- 全连接查询
合并查询
嵌套查询*
select查询语句中包含另一个select查询语句,通常将子查询语句的结果作为父查询语句的条件。
语法:select 查询项 from 表 where 查询条件 in|not in|=(select 查询项 from 表 where 查询条件)
示例:
查询所有已借图书的信息
方法一:(传统思路)
1.在借阅表中查询已借图书的图书编号
select distinct 借阅书号 from 借阅
2.根据上述查询结果在图书表中查询对应的图书信息
select * from 图书 where 书号 in(001,002,007,008,010)
方法二:嵌套查询,将第一条sql查询结果作为第二条sql的查询条件
select * from 图书 where 书号 in(select * from 图书 where 书号 in(001,002,007,008,010))
-
排序查询
将查询结果根据字段做排序,可以设置根据多个字段排序。默认排序方式为升序。
语法:select 查询字段 from 表 where 查询条件 order by 排序字段[asc|desc]
示例:
查询图书表中所有信息,结果按照定价从高到低排列。
select * from 图书 order by 定价 desc
查询图书表中的所有信息,按出版社升序,定价降序排列。
select * from 图书 order by 出版社 asc,定价 desc
-
分组查询
对查询结果进行分组
select 查询项 from 表 where 查询条件 group by 分组字段 [having 条件]
分组查询主要用于统计查询,因此经常配合sum()、avg()、count()、max()、min()函数使用
having:分组之后去除不满足条件的记录。
示例:
查询各出版社中图书的种类以及最高单价
select 出版社,count(书名) as 图书种类,max(定价) as 最高单价 from 图书 group by 出版社
-
查询去向
将查询结果输出到打印机、显示在屏幕上,也可将查询结果保存到数组、临时表、表、文本文件中
select 查询项 from 表名
where 查询条件
group by 分组字段
order by 排序字段
into array 数组名|cursor 临时表名|dbf 表名|table 表名
to file additive|printer|prompt|screen
printer:查询结果输出到打印机
screen:查询结果显示在屏幕上
连接查询
- 内连接查询
- 左连接查询
- 右连接查询
- 全连接查询