Visual Fox Pro保姆级学习笔记!!!计算机对口升学可用,持续更新

Visual Fox Pro

信息与数据

信息:可以被传递,可以被理解

数据:1.参与运算的数值类型(例如1,5,9)
2.不能参与运算的非数值型数据(例如“Hello World”,‘男’)

关系:信息用数据来表示,数据是信息的载体

数据处理

海量的数据通过加工处理得到想要的信息

例如:13 07 28 20050521 12 4 6
省份 城市 区县 出生日期 辖区派出所编号 性别 随机码

数据库系统
  1. 数据库(DB):放置数据的虚拟仓库
  2. 数据库管理系统(DBMS):维护和统筹规划数据库
  3. 数据库系统(DBS):应用程序,操作系统,服务器,数据库,是一个完整的数据生态。
数据库发展史
  1. 人工管理
    (入学资料,身份证复印件,户口本复印件,个人档案)

  2. 文件系统管理
    (Windows系统,每个文件相互独立)

  3. 数据库系统管理

    (vf,mysql,oracle…)

数据模型
  1. 层次模型
  2. 网状模型
  3. 关系模型
  4. 面向对象模型
关系型数据库特点
  1. 表中记录的增删不会影响到表的结构
  2. 每列中的字段是唯一的
  3. 不允许出现完全相同的两行
  4. 字段和记录的顺序可以随意更改
  5. 字段不可分割,原子性(原子是组成世界的最小单位)image-20230920153721835
常见的关系型数据库

Oracle MySql VFP SqlServer Access

vf发展史
  1. 1986 年 vf1.0
  2. 1998 年 vf6.0
vf启动
  1. 快捷方式
  2. 开始 ----> vf程序(狐狸图标)
vf关闭
  1. 点关闭按钮
  2. 文件 ----> 退出
  3. 命令窗口中输quit回车
环境配置
  1. 图形操作方式修改-----修改默认文件保存位置
  2. 使用命令方式修改-----modify window screen font “宋体”,32(修改控制台显示字体样式)
vf工作方式
  1. 交互操作方式(鼠标点击方式)
  2. 命令交互方式(每次只能执行一条命令)
  3. 程序执行方式(多条命令同时执行)
命令演示
*键盘输入数值,数值存储在age中
input to age
?age
*控制台打印字符串,数值以及运算结果
?"Hellow World"
?13
?12*21
*清空控制台
clear
*打印当前日期
?date()
*打印当前时间
?time()
命令规则
  1. 通常以命令动词开头create database input to a
  2. 各部分(不同的单词)之间要使用空格隔开
  3. 一般情况下一行只写一条口令,执行一条口令,如果一行写不下,使用续行符**;**连接
常用数据类型
数据类型取值范围说明
字符型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表示圆周率,其值固定,所以为常量
数值型常量
  1. ​ 整数:由数字组成,如0,-2,3

  2. ​ 实数:1.十进制表示形式:由数字,正负号,小数点组成。如0.23,-3.14

    ​ 2.指数形式:由数字,小数点,E或e组成 1.23*(10^3)------------->1.23E3

字符型常量

字符是使用定界符(“”‘’[])括起来的一些列有效字符,也称为字符串;字符串最大长度为254个字符

>?'123'
>?[看着我的"眼睛"]

❤注意❤:

  1. 如果字符串中包含一种定界符,必须使用另一种定界符括起来
  2. 定界符必须成对出现
  3. 空串和空格字符串不一样
  4. 字母的大小写不同
  5. 定界符内纯数字则为字符类型
逻辑型常量

只有**真(True)假(False)**两种值

表现方式:

  1. 逻辑真:.Y. .y. .T. .t.
  2. 逻辑假:.N. .n. .F. .f.
货币型常量

以$开头,四舍五入到小数点后4位

?$100.12345     &&输出结果为100.1235
日期型常量

必须使用**{ }**括起来

  1. 通用格式{mm/dd/yyyy}

  2. 严格格式{^yyyy-mm-dd}

  3. set strictdate to 0 设置通用

  4. set strictdate to 1 设置严格

    ❤通用格式与工具中区域设置相关联,使用前确定区域设置是否正确

日期时间型常量
  1. 1.通用格式:{mm/dd/yyyy[hh[:mm][:ss][a|p]]}

    ?{9/15/99 8:45}
    
  2. 2.严格格式:{^yyyy-mm-dd[hh[:mm][:ss][a|p]]}

    ?{^2008-08-08 08:08:08 p}
    
变量
  1. 值可以改变的量
  2. 分为字段变量和内存变量
  3. 变量拥有名称,统称为标识符
命名规则
  1. 由数字,字母,下划线组成
  2. 以字母,下划线开头
  3. 避免使用vf关键字
变量的定义和赋值
  1. 直接创建

    变量名 = 表达式 | 值

       x=2
       x = 3*3
    
  2. 同时为多个变量赋值

    store 表达式 | 值 to 变量名

    store 3 to a,b,c
    
显示变量内存

display memory [like 变量通配名]

​ 变量通配名中?表示一个字符,*表示任意个字符

删除内存变量
  1. clear memory —删除所有变量
  2. release 变量名 —删除指定变量(支持多个)
变量的输出?|??
  1. ? 换行输出
  2. ?? 不换行输出
数组
  1. 数组是按一定顺序排列的数据集合
  2. 数组中每一个数据称为一个元素
  3. 数组中每一个元素的序号称为下标(从1开始)
  4. 数组中的所有元素在内存中是连续存放的
image-20230921110258099
数组的定义

语法:dimension | declare 数组名(元素个数)

dimension Array1(3)
declare Array2(3)
&&以上两种方式都能进行数组的创建

❤数组定义后默认为每个元素赋值,默认值为**.F.**

&&定义成功后使用命令查看数组内元素
display memory
image-20230921111204577
数组的访问
  1. 使用元素下标访问对应元素

    &&打印数组中的元素
    ?Array1(1)
    ?Array1(2)
    ?Array1(3)
    
数组中元素的赋值
  1. 单独赋值

    &&使用数组下标对单个元素赋值
    Array1(2) = "中国"
    Array1(3) = "遥遥领先"
    
  2. 统一赋值

    &&使用变量赋值方式对数组中的所有元素进行统一赋值
    Array1 = "我爱VF"
    ?Array1(1),Array1(2),Array1(3)            &&"我爱VF"  "我爱VF"  "我爱VF"
    
二维数组
image-20230921112642377

语法: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])

分类:

  1. 数值函数

    函数名说明示例结果
    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)				&&自然对数
    
  2. 字符函数

    函数名说明示例结果
    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)
    
  3. 日期时间函数

    函数名说明示例结果
    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:sstime()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()
    
  4. 类型转换函数

    函数名说明示例结果
    str()将数值转换为字符串
    默认长度为10
    str(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)
    
  5. 其他函数

    函数名说明示例结果
    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)
    
数据库与表
数据库
  1. 数据库是数据库系统的核心,由表,视图,关系等组成,通俗的理解为存储数据的仓库。
  2. 数据库文件名.dbc
  3. 关联数据库备注文件.dct
  4. 关联索引文件.dcx
  1. 表是数据库中的基本元素,数据库是表的集合。
  2. 表中分为行与列,每一列为一个字段,每一行为一条完整的数据。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  3. 表的分类:
    1. 自由表:不属于任何数据库而独立存在的表。
    2. 数据库表:属于某一数据库的表
数据库设计步骤
  1. 明确设计目的
  2. 确定数据表
  3. 确定表中需要的字段
  4. 确定表之间的关系
  5. 优化设计
实操建库建表
  1. 创建项目

    1. 视图方式

      image-20231009172214485image-20231009172708294

    2. 命令方式:Create project 项目名

      ❤注意:项目存储路径为默认路径VF98,使用set default to 路径可修改默认路径

  2. 数据库操作

    1. 视图方式

      image-20231009173145112image-20231009173251705

    2. 命令方式:

      1. 创建:create database 数据库名

      2. 打开:open database 数据库名

      3. 指定数据库:set database 数据库名

      4. 打开数据库设计器:modify database 数据库名

      5. 关闭数据库:close database

      6. 删除数据库:delete database 数据库名

      7. 有效性检查:validate databse

      8. 清理缓存:pack database

  3. 创建表

    1. 视图方式:

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传image-20231009173830665image-20231009174102725

    2. 命令方式:

      语法:
      Create table|dbf 表名(
      字段名1 数据类型 (宽度),
      字段名2 数据类型 (宽度),
      ...
      )
      
      
      示例:
      create table 学生(姓名 c(10),年龄 n(10))
      
      1. 操作表

        add table 							&&将自由表添加到数据库中
        remove table						&&移去(将数据库表变为自由表)/删除表(物理删除)
        
        
        list|display structure				&&查看表结构						  
        
        modify	structure					  &&打开修改表结构窗口
        使用命令修改表结构
        alter table 表名
        add 字段名 字段类型 [字段宽度]			&&新增字段
        alter 字段名 字段类型 [字段宽度]		&&修改字段
        rename 旧字段名 to 新字段名			  &&修改字段名 
        drop 字段名						 &&删除字段
        
        
        copy files 表名.* to 新表名.*					&&复制表,复制时表必须是关闭状态
        示例:copy files 学生表.* to 学生表1.*			 &&因为表有附属文件,所有复制时使用通配符*
        
        type 文件名						 &&查看文本文件内容
        
      2. 数据操作

    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				&&无脑删除所有数据,只保留表结构
    
    1. 数据定位

      --绝对移动指针
      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()			&&返回当前表总记录数
      
    2. 数据表与数组之间的数据交换

      --将表中数据赋值给数组
      语法:
      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				&&将上述变量的值添加到表中的空白行
      
    3. 将多条记录与数组传递

      --将多条记录数据传送给数组
      语法:
      copy to array 数组名
      [fields 字段名]
      [范围]
      [for 条件] [while 条件]
      
      
      示例:
      dimension a(3,3)		&&定义二维数组
      copy to array a			&&从当前数据向下开始3条数据存储到二维数组a中
      
      
      --将数组中的内容添加到表数据中
      append from array 数组名
      
      示例:
      append from array b
      
    4. 记录的筛选与排序

      --记录的筛选
      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个字符构成)。每一个索引标识代表一种逻辑顺序

记录顺序的分类
  1. 物理顺序

    在表文件的实际排列顺序,每个记录对应一个记录号,标识记录的物理顺序

  2. 逻辑顺序

    按某个关键字或关键字表达式建立的一种有序的顺序

  3. 使用顺序

​ 实际操作的记录顺序。可以是物理顺序,也可以是逻辑顺序。

image-20231018090116561
索引文件分类

索引文件与表文件分别存储,属于表的附属文件,不能脱离数据表独立使用。

  1. 独立索引文件(.idx):只包含一个索引标识
  2. 复合索引文件(.cdx):包含多个索引标识
索引类型
  1. 主索引:又称主关键字,一个表中只能有一个,建立索引的关键字段值不能重复,确保数据的唯一性,自由表不能建立主索引。
  2. 候选索引:是在索引关键字中不允许出现重复值的索引,自由表也可使用,每个表中可建立多个候选索引。
  3. 普通索引:允许索引关键字值重复出现的索引
  4. 唯一索引:为兼容旧版本而设立,了解即可
索引的创建
  1. 视图方式(创建的索引都是复合索引)

    image-20231018150433424

    复合索引可以创建多个,所以创建完成后直接打开表不会生效,需要手动指定主控索引

    set order to 索引名

  2. 命令方式外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传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			
    

    删除索引

    1. 独立索引:文件可以直接在文件夹内直接删除.idx文件

    2. 复合索引:

      1. 使用视图方式在表设计器中删除

      2. 命令删除

        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. 工作区号可以直接使用1~32767
  2. 0表示切换当前没有使用的最小区号工作区
  3. 只有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

下列命令执行完在哪个工作区内image-20231026222701365

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

表之间建立关系
  1. 表的关系

    当前表与其他打开的表之间建立一对一或一对多的关系。建立关系后,当前表为主表,与之建立关系的表称为子表。建立了表关系后,主表记录指针移动时,系统会自动移动子表的记录指针指向匹配的数据。

  2. 分类

    1. 一对一关系:主表和子表均应按照相同的关键字建立主索引或候选索引
    2. 一对多关系:主表应该建立主索引或候补索引,子表可以建立普通索引
    3. 多对多关系:都是普通索引
  3. 永久关系

    永久关系建立后,每次使用表时不需要重新建立,但永久关系不能控制不同工作区中记录指针的移动

    1. 建立永久关系
      1. 打开数据库文件,进入数据库设计器窗口
      2. 建立索引。
        1. 一对一关系:父表中与子表中同名的字段均定义为主索引image-20231028105240418image-20231028105355458
        2. 一对多关系:父表定义为主索引,子表定义为普通索引image-20231028110528850
      3. 建立表间关系
        1. 一对一外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    ​ 2.一对多

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  4. 零时关系

    也称为关联表,就是是不同工作区的记录指针建立一种临时的联动关系,当一个表中的指针移动时另一个表的指针也随之移动。

    1. 前提条件

      1. 两个表,建立关系的为父表,被关联的为子表
      2. 父表与子表有相同的字段
      3. 为子表的关键字建立索引,并设置为当前索引
    2. 建立关系

      1. 视图方式

      2. 命令方式

        set relation to 索引表达式 into 子表

        1. 分别在不同工作区打开父表和子表

          use 基本信息 in 1
          use 成绩表 in 2
          
        2. 切换到子表工作区(工作区2|B)

          select 2
          
        3. 子表学号字段构建索引,并设置为主控索引

          index on 学号 tag xh
          set order to xh
          
        4. 切换到父表工作区(工作区1|A)

          select 1
          
        5. 构建父表和子表间的零时关系

          set relation to 学号 into 成绩
          
参照完整性
  1. 将两个表创建永久关系
  2. 在数据库菜单中选择清理数据库
  3. 鼠标右击表间连接线,选择“编辑参照完整性”

更新规则

  1. 级联:主表连接字段值修改子表跟着修改
  2. 限制:父表与子表存在关联数据则禁止父表修改对应数据
  3. 忽略:任意修改不做限制。

删除规则

  1. 级联:删除父表记录时自动删除子表关联记录
  2. 限制:删除附表记录时如果子表有关联记录则禁止删除父表记录
  3. 忽略:随意删除没有限制

插入规则

  1. 限制:插入子表记录时父表有关联数据才能插入成功
  2. 忽略:随意插入没有限制
查询视图
查询

​ 用户可以根据需求,选择要显示的字段,定义一些过滤规则,将查询结果保存为文件,这样以后在做数据查询时,只需要调出保存的查询文件即可。

建立查询

  1. 打开项目管理器中的数据选项卡,点击新建按钮

    image-20231031104651063
  2. 选择新建查询

    image-20231031104746763
  3. 选择要查询的数据库及其表,可以选择多个表,添加后点关闭按钮

    image-20231031104913230
  4. 根据需求添加要查询的字段,多表查询的话一定要给表建立永久关系(也可后期指定)。只添加主表关联字段,子表不添加

    image-20231031105625189
  5. 点击运行查看查询结果image-20231031105742827

  6. 点击保存,将查询文件保存为.qpr文件,下次使用可直接打开。

  7. 查询时指定表之间的关系

    image-20231031110809419
  8. 查询时也可添加删选条件

    image-20231031110724820
  9. 设置排序规则

    image-20231031110920233

运行查询

  1. 视图方式
  2. 命令方式:do 查询文件名.qpr

修改查询

  1. 视图方式
  2. 命令方式:modify query 查询文件名称

查询去向设置

image-20231031113515577
  1. 浏览:浏览窗口显示查询结果
  2. 临时表:查询结果存储在一个临时的只读文件中
  3. 表:查询结果存储在一个表(.dbf)文件中
  4. 图形:查询结果输出成图形文件
  5. 屏幕:查询结果输出到打印窗口中
  6. 报表:查询结果输出到一个报表文件中
  7. 标签:输出到一个标签文件中
视图

​ 视图是一个定制的虚拟表,是引用数据库的数据,类似于地方台转播中央台,基于数据库建立的,因此创建视图之前必须有数据库。

建立试图

  1. 文件------>新建-------->选择视图-------->新建文件
  2. 项目管理器中数据选项卡打开要建立视图的数据库,选择本地试图或远程视图image-20231031150218972
  3. 命令创建:create view

视图的使用

视图的使用与查询基本一致,相较于查询来讲多了一个更新条件。

为了通过视图能够更新基本表中的数据,需要勾选“发送SQL更新”复选框。image-20231031151753946

视图命令操作

  1. 创建视图:create view 视图名
  2. 修改,打开试图:modify view 视图名
  3. 删除视图文件:drop | delete view 视图名

视图与查询的区别

  1. 视图依赖于数据库,有数据库才能使用,而视图可以独立存在
  2. 查询结果以.qpr文件保存至硬盘,而视图没有独立文件,是保存在数据库中。
  3. 视图可以更新。
SQL语言

SQL(Structured Query Language,结构化查询语言)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理数据库系统。

分类
  1. DDL(数据定义语言):create、drop、alter等语句。
  2. DML(数据操作语言):insert、update、delete等语句。
  3. DQL(数据查询语言):select语句。
  4. DCL(数据控制语言):grank、revoke、commit、rollback等语句。
数据定义语言(DDL)
  1. 创建表

    create table 表名[free](字段名1 字段类型[宽度,小数位数] [primary key | unique],字段名2...

    free:定义表为自由表,如果表为数据库表则不加

    primary key:将该字段设置为主键

    unique:将该字段定义为候选索引关键字

    数据类型,宽度及小数位的字母代码如下:

    数据类型字母表示宽度小数位
    字符型Cn-
    数值型Nnd
    浮动型Fnd
    双精度型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:字段名重命名

    示例

    1. 为“教工”表添加“职称”C(10)字段并设置默认值为“讲师”。

      alter table 教工 add 职称(C,10) default "讲师"
      
    2. 为“教工”表中“姓名”字段类型修改为C(6)。

      alter table 教工 alter 姓名(C,6)
      
    3. 修改“读者”表中入学成绩的字段,成绩应该控制在500~750之间。

      alter table 读者 alter 入学成绩 set check 入学成绩>=500 and 入学成绩<=750
      
    4. 删除“读者”表中关于”入学成绩“的有效性规则。

      alter table 读者 alter 入学成绩 drop check
      
    5. 删除“教工”表中“入职时间”字段。

      alter table 教工 drop 入职时间
      
    6. 将“教工”表中“所学专业”字段名改为“所教课程”。

      alter table 教工 rename 所学专业 to 所教专业
      

    删除表

    drop table 表名
    

    物理删除自由表或数据库表,删除数据库表时必须打开其所属的数据库。

    示例

    删除“图书管理”数据库中的“教工”表

    open database 图书管理
    drop table 教工
    
数据操作(DML)
  1. 插入记录

    insert into 表名 (字段名1,字段名2...) values (1,值2...)
    

    示例

    在“图书管理”库中的“图书”表中插入一条记录(“001”,“操作系统”,“严一平”,“清华大学”,35.2)

    open database 图书管理
    insert into 图书(书号,书名,作者,出版社,定价)values(001”,“操作系统”,“严一平”,“清华大学”,35.2)
    

    练习

    微信图片_20231106155644
  2. 更新记录

    update 表名 set 字段1=1,字段2=2...where 条件
    

    示例:

    将“图书”表中出版社为“电子工业”的图书的定价增加10%

    update 图书 set 定价 = 定价*1.1 where 出版社="电子工业"
    

    练习

  3. 删除记录

    delete from 表名 where 条件
    

    删除操作是逻辑删除,如需物理删除还需使用pack,恢复记录使用recall命令

    示例

    删除“图书”表中的出版社为“北京大学”的记录。

    delete from 图书 where 出版社="北京大学"
    
数据查询(DQL)
  1. 简单查询

    语法: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 姓名="周正正"
    
  2. 嵌套查询

    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))
    
  3. 排序查询

    将查询结果根据字段做排序,可以设置根据多个字段排序。默认排序方式为升序。

    语法:select 查询字段 from 表 where 查询条件 order by 排序字段[asc|desc]

    示例:

    查询图书表中所有信息,结果按照定价从高到低排列。

    select * from 图书 order by 定价 desc
    

    查询图书表中的所有信息,按出版社升序,定价降序排列。

    select * from 图书 order by 出版社 asc,定价 desc
    
  4. 分组查询

    对查询结果进行分组

    select 查询项 from 表 where 查询条件 group by 分组字段 [having 条件]

    分组查询主要用于统计查询,因此经常配合sum()、avg()、count()、max()、min()函数使用

    having:分组之后去除不满足条件的记录。

    示例:

    查询各出版社中图书的种类以及最高单价

    select 出版社,count(书名) as 图书种类,max(定价) as 最高单价 from 图书 group by 出版社
    
  5. 查询去向

    将查询结果输出到打印机、显示在屏幕上,也可将查询结果保存到数组、临时表、表、文本文件中

    select 查询项 from 表名

    where 查询条件

    group by 分组字段

    order by 排序字段

    into array 数组名|cursor 临时表名|dbf 表名|table 表名

    to file additive|printer|prompt|screen

    printer:查询结果输出到打印机

    screen:查询结果显示在屏幕上

连接查询
  1. 内连接查询
  2. 左连接查询
  3. 右连接查询
  4. 全连接查询
合并查询

嵌套查询*

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))
  1. 排序查询

    将查询结果根据字段做排序,可以设置根据多个字段排序。默认排序方式为升序。

    语法:select 查询字段 from 表 where 查询条件 order by 排序字段[asc|desc]

    示例:

    查询图书表中所有信息,结果按照定价从高到低排列。

    select * from 图书 order by 定价 desc
    

    查询图书表中的所有信息,按出版社升序,定价降序排列。

    select * from 图书 order by 出版社 asc,定价 desc
    
  2. 分组查询

    对查询结果进行分组

    select 查询项 from 表 where 查询条件 group by 分组字段 [having 条件]

    分组查询主要用于统计查询,因此经常配合sum()、avg()、count()、max()、min()函数使用

    having:分组之后去除不满足条件的记录。

    示例:

    查询各出版社中图书的种类以及最高单价

    select 出版社,count(书名) as 图书种类,max(定价) as 最高单价 from 图书 group by 出版社
    
  3. 查询去向

    将查询结果输出到打印机、显示在屏幕上,也可将查询结果保存到数组、临时表、表、文本文件中

    select 查询项 from 表名

    where 查询条件

    group by 分组字段

    order by 排序字段

    into array 数组名|cursor 临时表名|dbf 表名|table 表名

    to file additive|printer|prompt|screen

    printer:查询结果输出到打印机

    screen:查询结果显示在屏幕上

连接查询
  1. 内连接查询
  2. 左连接查询
  3. 右连接查询
  4. 全连接查询
合并查询
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值