5.1 创建查询
1. 查询的概念
查询:就是向一个数据库发出检索信息的请求,从中提取符合特定条件的记录。
查询文件:
即保存实现查询的SELECT-SQL命令的文件。查询文件保存时,系统自动给出扩展名 .qpr;查询被运行后,系统还会生成一个编译后的查询文件,扩展名为 .qpx
查询结果:
通过运行查询文件得到的一个基于表和视图的动态的数据集合。查询结果可以用不同的形式来保存。查询中的数据是只读的。
查询的数据源:可以是一张或多张相关的自由表、数据库表、视图。
2. 用查询设计器创建查询
20060108072607432.gif
基本步骤
打开查询设计器 添加创建查询所基于的数据表 定义输出内容 设置联接、筛选、排序、分组条件 选择查询结果的输出形式 保存查询文件 运行查询。
1) 打开查询设计器
方法 1
文件菜单或工具栏上单击 新建 查询 新建文件 进入查询设计器
方法 2
当所用到的数据表已在项目中时,从项目管理器窗口中单击 数据 查询 新建 新建查询 进入查询设计器
方法 3 从命令窗口中输入命令:
create query 查询文件名 & 创建新查询
modify query 查询文件名 & 修改已存在的查询
(2) 定义查询的输出内容
单击 字段选项卡 可用字段列表框中单击所需字段(当输出的列不是直接来源于表中的字段时,单击函数和表达式框边的… 按钮,打开表达式生成器,构造出所需的表达式) 单击 添加按钮 所需字段自动出现在 选定字段框中。
(3) 设置查询的筛选条件
筛选条件决定将哪些记录显示出来。
在筛选框中构造筛选条件表达式时,要注意在 实例框中输入不同数据类型时的格式:
1) 字符串可以不带引号(当与源表中的字段名相同时才用引号);
2) 日期型数值要用{ }括起来;
3) 逻辑型数据两侧要带 .号,如 .T.,.F.
(4) 设置查询结果的排序依据
排序决定查询输出结果中记录显示的顺序。
设置方法:
单击 排序依据 选定字段框选中字段 选择 升序降序 单击 添加
(5) 设置查询结果的分组依据
分组是指将一组类似的记录压缩成一个结果记录,目的是为了完成基于该组记录的计算,比如:求平均值、总和、统计个数、其中的最大值、最小值等。
几个常用的统计函数
功能
求平均值
求总和
求最大值
求最小值
统计个数
名称
AVG ()
SUM ()
MAX ()
MIN ()
COUNT ()
用于分组的字段不一定是选定输出的字段,但分组字段不能是一个计算字段。
可以用 满足条件… 来对分组结果进行进一步筛选。
6) 对查询结果的其他设置
可以排除查询结果中所有重复的行,并设置结果的记录范围。
7) 选择查询结果的输出类型
默认情况下,查询结果将输出在浏览窗口中,且其中的数据是只读的。
设置其他输出类型的方法:
打开 查询菜单 → 选择 查询去向 → 在查询去向对话框中选择一种。一般多选择 报表
8) 运行查询
在查询设计器打开的状态下,单击常用工具栏上的 按钮或从查询菜单中选择运行查询。其他情况下,可从项目管理器中选中查询文件并单击运行按钮,或从程序菜单中选择执行命令,或从命令窗口中输入: DO 查询文件名。
(9) 创建多表查询
打开查询设计器 将所需的多个相关表添加进来 设置联接条件 按上面(2)至(8)步进行。
3. 用查询向导创建查询
1) 创建标准查询:
打开待查询的数据表 文件菜单中单击 新建 新建对话框中选择 查询并单击 向导 选择 查询向导 从单张或多张相关的表中进行 字段选取 设置 筛选条件 设置 排序次序 选择查询结果的保存方式 给出查询 文件名并选择 保存位置 查询结果显示在查询窗口中。
注意:查询此时得到的数据是只读的,不可以更新。
2) 交叉表查询
打开待查询的数据表 文件菜单中单击 新建 新建对话框中选择 查询并单击 向导 选择 交叉表向导 从单张表中 选取字段 设计 布局 加入总和信息 选择查询结果的保存方式 给出查询 文件名并选择 保存位置 查询结果显示在查询窗口中。
注意:不是任何表都适宜采用交叉表的形式。
(3)用SELECT-SQL 命令创建查询
常用的格式:
SELECT 表名1 . 字段名1 [ AS 标题名1], 表名1 . 字段名2 [ AS 标题名2], …
FROM 数据库名! 表名1 [,数据库名! 表名2 ] [, 数据库名! 表名3 ]
[ TO FILE 文本文件名 | into table | into cursor 表文件名 ]
[ WHERE 选定条件]
[ GROUP BY 分组字段名 ]
[ HAVING 分组中的满足条件 ]
[ ORDER BY 排序字段名1 [ ASC | DESC] [, 排序字段名2 [ASC | DESC] ...]]
示例:
浏览学生中的查询学生 student.qpr :
SELECT 表xs.xh as 学号, 表xs.xm as 姓名, 表xs.xb as 性别, ;
表xs.csrq as 出生日期, 表xs.bj as 班级名称;
FROM 数据test!表xs;
WHERE 表xs.bj =cs1;
ORDER BY 表xs.xh;
INTO TABLE xs
浏览成绩中的按课程查询 sub_cj.qpr :
SELECT 表xs.bj as 班级名称, COUNT(表xs.xh) as 班级人数, AVG(表cj.cj) as 平均分, ;
MAX(表cj.cj) as 最高分, MIN(表cj.cj) as 最低分;
FROM 数据test!表xs, 数据test!表cj, 数据test!表kc;
WHERE 表cj.xh = 表xs.xh;
AND 表kc.kcm = 表cj.kcm;
AND 表cj.kcm = sc1;
GROUP BY 表xs.bj;
ORDER BY 表xs.bj;
INTO TABLE sub_cj
5.2 创建视图
1. 视图的特点
1) 视图是存在于数据库中的一个虚表,不以独立的文件形式保存;
2) 视图中的数据是可以更改的,它不仅具有查询的功能,且可以把更新结果反映到源数据表中;
3) 视图打开时,其基表自动打开,但视图关闭时,其基表并不随之自动关闭;
4) 视图的数据源可以是自由表、数据库表或另一个视图。
2. 用视图设计器创建本地视图
20060108072607117.gif从项目管理器中选择一个数据库 选择本地视图 单击新建按钮 选择新视图 添加所需的数据表 在视图设计器中按照与创建查询相同的步骤(2)~(6)建立视图 设置更新条件 保存视图 给出视图名称 关闭视图设计器(可以先运行一下看看)。
创建参数化视图:
在筛选页面的实例框中输入: 参数名 从查询菜单中选择视图参数 在对话框中给出参数名并选择参数类型 确定 保存视图 给出视图名称 关闭视图设计器(可以先运行一下看看)。
3. 用视图向导创建本地视图
从项目管理器中选择一个数据库 选择本地视图 单击新建按钮 选择视图向导 选取字段 关联表 记录操作范围 筛选记录 排序记录 选择保存方式 完成。
4. 用CREATE SQL VIEW 命令创建视图
打开数据库,用命令来创建视图:
OPEN DATABASE 数据库名
CREATE SQL VIEW 视图文件名 AS SQL-SELECT 语句
例: OPEN DATABASE SJ
CREAT SQL VIEW SCORE AS SELECT SJCJ.XH, SJCJ.CJ ;
FROM SJ!SJCJ WHERE SJCJ.KCH=”计算机基础”
5. 视图的使用
用菜单方式对视图中的记录进行编辑的方法与操作数据表相同。也可用以下命令操作。
视图操作基本命令
打开视图文件并浏览
OPEN DATABASE 数据库名
USE 视图文件名
BROWSE
修改视图
MODIFY VIEW 视图文件名
视图重命名
RENAME VIEW 原视图文件名 TO 新视图文件名
删除视图
DELETE VIEW  视图文件名
6 .利用视图更新源表数据
可在视图设计器的更新条件页面中进行如下设置来实现对源表数据的更新:
1)从表框中选择想要更新的源表;
2)在字段名框中单击一个字段前关键列 B 和更新列 ! ,使其作为主关键字和可更新字段;
3)将发送SQL 更新复选框选中
 
5.3 SQL 语言中的命令语句
SQL是一种日趋流行的标准的数据库系统管理语言,能使数据检索异常地方便、灵活。
VFP5.0 支持的7条SQL命令一览表
命令
功能
示例
备注
CREATE TABLE -SQL创建一个指定字段的表create table xs (;
xh c(4) default "1201" primary key,;
xm c(6), ;
xb c(2) check xb="男" or xb="女" error "性别只能是男或女" default "女",;
nl n(2) null )
新表的每个字段由名称、类型、精度、比例、是否支持 NULL 值和参照完整性规则来定义,可从命令本身或数组中获得这些定义。
CREATE CURSOR-SQL创建一个临时表CREATE CURSOR teacher ;
(TeacherID N(5), Name C(20), Address;
C(30),OfficeNo C(8) NULL, Specialty M)
ALTER TABLE - SQL以编程方式修改一个已存在的表的结构。ALTER TABLE xscj ADD COLUMN kcmc C(14)可以修改表中每个字段的名称、类型、精度、比例、是否支持 NULL 值和参照完整性规则。
ALTER TABLE cj;
ALTER COLUMN cj SET CHECK cj >= 0;
ERROR " 成绩不能为负数"
SELECT - SQL从一个或多个表中检索数据。SELECT 表xs.xh, 表xs.xm, 表xs.xb, ;
FROM 数据test!表xs;
WHERE 表xs.xh >'81991025';
ORDER BY 表xs.xh
可以用union命令连接两个条件。
DELETE - SQL使用 SQL 语句将表中的记录加上删除标记。DELETE FROM cj WHERE cj<60 
INSERT - SQL在已存在表的末尾追加一条新记录
INSERT INTO xs(xh,xm,xb) VALUES;
("8399101", "张丽", "女")
新记录包含的数据列在 INSERT 命令中,或者来自数组。
UPDATE - SQL更新表中的记录UPDATE cj SET cj = cj*1.05 WHERE cj>80可以基于 SELECT - SQL 语句结果更新记录