第十三章 查询与视图
1,使用查询向导
2,使用查询设计器
3,直接编写 Select- SQL语句
VFP中用 SQL进行查询主要有三种方式:
13.1 查询
1,用查询向导进行查询
【 例 13-1】 利用查询向导查询 Xs.dbf中的所有记录 。
第一步:在 VFP窗口中,选 文件 ―> 新建 ―> 查询,
选“向导”
第二步:字段选取第三步:筛选记录第四步:排序记录第五步,完成
2,用交叉表向导进行查询 (见书,略)
3,用图形向导进行查询
4,使用查询设计器进行查询查询任务:
( 1) 单表查询
( 2) 多表的查询进入查询设计器的方式:
( 1) 菜单方式进入
( 2) 命令方式进入,Create Query Hello
其中,,Create Query”是命令,表示建立一个查询,,Hello”是建立的查询文件名,其扩展名为,qpr
【 例 13-4】 在 Xs.dbf 和 Xscj.dbf中查询学号,姓名,年龄,
数学,英语,数学和英语的平均分,并按数学降序排列。
要求查询的结果中,“数学”,“英语”,“平均分”用中文显示字段标题。
选 文件?新建?查询?新建文件,按提示输入待查的表
Xs.dbf,Xscj.dbf,得到如下界面查询设计器工具栏;界面的下半部分有 6个选项卡字段,可用来设置查询输出的字段或表达式筛选,若对查询进行限制,只查询满足某些条件的记录,可以使用设计器中的筛选功能 。
排序依据,可用来对查询输出的结果进行排序。
分组依据,将一组关键字相同的记录压缩成一条记录输出 。 如若按性别分组,则只输出,男,,,女,两条记录;如按系别分组,则同一个系只显示一条结果记录,本例中不分组 。
杂项,用来设置一些特殊的查询输出。如选复选框
“无重复记录”,则查询结果中不显示相同的记录联接,设置表之间的联接条件,,联接,有 4种类型 。
内联接 (Inner Join),两个表中的字段都满足联接条件,记录才加入查询结果左联接 (Left Outer Join):联接条件左边的表中的记录都包含在查询结果中,而右边的表中的记录只有满足联接条件时,才选入查询结果 。
右联接 (Right Outer Join):联接条件右边的表中的记录都包含在查询结果中,而左边的表中的记录只有满足联接条件时,才选入查询结果 。
完全联接 (Full Join):两个表中的记录不管是否满足条件都选入查询结果中 。
系统一般默认选内联接。
保存结果,
( 1)在文件菜单下选“保存”
( 2)直接按 Ctrl+S
( 3)按工具栏中的磁盘图标出现一个对话框,你可以选择相应的文件夹和文件名来进行保存。如文件取名为 Ex12_2,文件的扩展名为,qpr,系统自动加上,不必要输入。
察看查询结果:
( 1)在程序或命令窗口中用 Do Ex12_2.qpr
( 2)如果现在想看查询的结果,可用鼠标单击工具栏中的,!”或选菜单“查询”下面的“运行查询”,即可看到查询结果:
查询去向:
从菜单“查询”下面选“查询去向”,屏幕上会出现一个对话框如下图:
5,用 Select_ SQL语句进行查询
SQL具有强大的查询功能。上面我们用查询设计器得到的查询文件的内容就是一条 Select_SQL语句。
该语句主要由 3个关键字组成:
Select … From … Where …
前两个关键字是必不可少的。 Select…From 之间说明查询数据的范围,可以用一个,*”号表示选择所有的字段,
From…Where 之间主要说明数据的来源及去向,显示方式等要求,多个表进行查询时,还要选联接,Where 后对查询输出增加一些筛选条件,是否分组,输出时是否排序,
是否与另一个查询联合。这条命令,与查询设计器中的 6
个选项卡相对应。下面举一些常用例题,以说明该语句的使用。
【 例 13-5】 用 Select_SQL语句,查询 Xs.dbf中的全部数据 。 命令为 Select * From Xs
“*” 表示选择所有的字段 。 本例中如果想使字段 xh,xm,
nl,xb,bj分别用汉字显示,则将上面的命令改写如下:
Select xh As 学号,xm As 姓名,nl As 年龄,xb As 性别,
bj As 班级 From Xs
【 例 13-6】 查询所有李姓的学生 。
Select * From Xs Where,李” $Xm
【 例 13-7】 模糊查询姓名中含有,伟,字的学生名单 。
Select Xs.xm As 姓名,Xs.bj As 班级
From Xs Where,伟” $Xm
【 例 13-8】 查询该班男女学生的人数 。
本题查询中,其目标是统计男女学生人数,因此侧重点放在分组统计中,其中需要使用到一个函数 Count( ),
Count(*)表示对符合条件的所有记录进行统计 。 还需要用
Group By xb 对查询结果按性别进行分组 。 命令如下:
Select xb As 性别,bj As 班级,Count(*) As 人数 From
Xs Group By xb
【 例 13-9】 查询姓名,班级及各科成绩,其中要求姓名,
班级,数学用中文显示标题,并且只显示平均成绩在 80分以上的学生 。
分析:本题涉及到两个表 Xs.dbf和 Xscj.dbf的数据,命令如下:
Select Xs.xm As 姓名,bj As 班级,Fox,sx As 数学,
English,(Sx+Fox+English)/3 As 平均
From Xs,Xscj
Where Xs.xh=Xscj.xh And (Sx+Fox+English)/3>80
【 例 13-10】 查询数学成绩在 60—80之间的所有学生的姓名,班级,数学,且结果按数学成绩的降序排列,并将查询结果保存到数据表 Myquery.dbf。
方法一、命令
Select Xs.xm,Xs.bj,Xscj.sx From Xs,Xscj
Into Table Myquery
Where Xs.xh=Xscj.xh And sx>=60 And sx<=80
Order By Xscj.sx DESC
解释,Into Table Myquery 表示将查询的结果产生一个表 Myquery.dbf,该部分也可用 Into Dbf Myquery代替。
Order By Xscj.sx DESC 表示根据数学成绩排序,
DESC 表示降序,由高到低。如不加 DESC,默认的是升序
(ASC,可以省略不写 )
方法二、命令
Select Xs.xm,Xs.bj,Xscj.sx From Xs,Xscj
Into Table Myquery
Where Xs.xh=Xscj.xh And sx Between 60 And 80
Order By Xscj.sx DESC
这条命令与方法一的差别在,确定分数在 60—80时,
用 sx Between 60 And 80,
表示 60—80这个范围。
【 例 13-11】 用 Union进行联合查询 。 查询表 XS.dbf中性别为,男,的学生学号,或英语成绩高于 80分的女学生的学号 。
联合查询是对两个或多个查询进行并操作,要求查询的结果有相同的列数,且对应的列有相同的数据类型和长度当一个查询的结果受制于另一个查询时,可采用嵌套查询 。 方法是,在这个查询的 Where 子句中,用,IN”加入另一个查询 。 请看下例:
Select xh From Xs Where xb=”男,
Union Select xh From Xscj
Where English>80
【 例 13-12】 查询英语成绩高于 85分的学生的姓名,
性别,班级。命令:
Select xh,xm As 姓名,xb As 性别,bj As 班级
From Xs
Where xh In (Select xh From Xscj Where English>85)
也可以不使用嵌套查询的方法,而用一般的方法进行处理,命令如下:
Select Xs.xh,Xs.xm As 姓名,xb As 性别,bj As 班级
From Xs,Xscj
Where Xs.xh=Xscj.xh And Xscj.English>85
常用的系统函数
AVG(表达式 ):求平均值 。
COUNT(*):统计记录个数 。
MAX(表达式表 ):求最大值 。
MIN(表达式表 ):求最小值 。
SUM(表达式 ):求表达式的和 。
【 例 13-13】 查询男女生的各科平均成绩以及数学、英语的最高成绩和最低成绩。
Select xb As 性别,AVG(Fox) As FOX平均,
AVG(sx) As 数学平均,AVG(English) As 英语平均,
MAX(sx) As 数学最高,MIN(sx) As 数学最低,
MAX(english) As 英语最高,MIN(english) As 英语最低
From Xs,Xscj
Where Xs.xh=Xscj.xh
Group By xb
【 例 13-14】 查询姓名,性别,FOX,数学,英语,将结果放在表单的列表框中 。
操作步骤:
第一步,建立一个表单,在表单中加入列表框控件,在列表框上面加入 5个标签,将他们的 caption属性分别修改为姓名,性别,FOX,数学,英语,如图 13-23,
第二步,将 list1的属性作如下修改:
columncount 5
columnlines,F,&&若为,T.则每栏之间有线隔开
rowsource select xs.xm,xb,sx,english
from xs,xscj where xs.xh=xscj.xh
rowsourcetype 3—SQL 语句第三步,保存并运行,就可以得到查询结果选项补充说明:
ALL,表示查询的结果中可包括重复记录,系统默认 。
DISTINCT,表示查询结果中不包括重复记录 。
TOP <数值表达式>,表示只输出满足条件的前几个记录,输出的个数由<数值表达式>确定 。
TOP <数值表达式> PERCENT,表示只输出满足条件的前百分之几个记录,如 TOP 50 PERCENT,表示只输出满足条件的前 50%的记录 。
FORCE,表示严格按指定的联接条件来联接表,以免
VFP因进行联接优化而降低查询速度 。
INTO <目标 >,其中的 <目标 >有 3种选择:
(1) INTO ARRAY <数组名 >:表示将查询结果输出到数组 。
(2) INTO CURSOR <临时表名 >:表示将查询结果放到一个只读的临时表 。
(3) INTO DBF <表名 >:由查询结果产生一个表,与例
10方法一中的,into table <表名 >”结果相同 。
TO FILE <文本文件名 >,将查询结果输出到一个文本文件 。
TO PRINTER,将查询结果输出到打印机 。 如果有
PROMPT选项,则显示打印机的选择页面 。
PREFERENCE 子句,用于记载浏览窗口的配置参数,再次使用该子句时可用 <名字>引用此配置。
PLAIN,输出时不显示字段名,只显示对应的数据。
NOWAIT,显示浏览窗口后程序继续往下执行。
NOCONSOLE,输出结果不送到屏幕。
HAVING,该子句只能用在分组输出环境中,对分组输出进行限制。如按性别分组输出,则加上,having
count(*)>5”,则表示“男”或“女”的人数要大于 5
才显示视图与查询的区别:
(1)只能在数据库中建立视图。
(2)用 Select_SQL查询显示的结果是只读的,不能进行修改,但用视图查询的结果可以对某些字段进行修改。
13.2 视图视图:
视图的创建
( 1)命令方式:前提是要有打开的数据库。
用命令方式建立视图的一般形式为:
Create SQL View 视图名 As Select_SQL 语句
( 2)菜单方式(主要介绍)
视图分类
( 1)本地视图:可查询和修改本机上的表;
( 2)远程视图:可修改网络上其他用户的表。
( 1) 在 VFP系统菜单中,选 文件?新建?视图?新建文件 (或视图向导 ),即进入了视图设计器 。
注意,在上述步骤中出现,视图,为灰色不可用时,说明当前没有打开的数据库,这时是不可以建立视图的 。
( 2)在项目管理器中选数据库下的“本地视图”,点击命令按钮“新建”,出现“新建本地视图”的界面。
如选“视图向导”,则进入本地视图向导,根据系统的提示一步一步地建立视图。
1、创建视图
【 例 13-15】 建立学生成绩视图并允许更新数学成绩。
( 1)打开已经建好的项目文件 hello.pjx
( 2)从“数据”下面展开数据库 student选择“本地视图”
来新建视图。
然后选表 xs.dbf,xscj.dbf,分别添加,然后选关闭。这样,将两个有关的表添加到了数据环境中。
(3) 视图设计器与前面介绍过的查询设计器很相似,但有一个重要的不同之处,即在视图设计器下面的选项卡中,有一个“更新条件”选项卡,能用来对查询的数据进行更新,而在查询设计器中是没有这项功能的。
xs.dbf 与表 xscj.dbf 之间有一条连线,表示两个数据库表通过学号 (xh)建立了永久关系 。
( 1) 选取字段在“字段”选项卡中,按题目的要求将 xh,xm,bj,
fox,sx,english等与学生成绩相关的字段加入“选定字段”框当需要对某个字段的属性进行处理时,可以选中该字段,然后选“属性”,如选 xm,进入界面,
选项卡介绍图标,钥匙图标对应的字段被选中为关键字段;铅笔图标对应下的字段表示可修改的字段。如图 13-29,
在数学 (sx)前对应的铅笔图标位置下选中,表示运行视图过程中,可以修改数学成绩。这里要注意的是,
必须先选关键字段,然后才能选可修改字段。最后,
要选中“发送 SQL更新”。以上的选取可以理解为:
以 xh为关键字,将该学号对应的记录中的字段 sx修改后把结果传回到原表中,达到对原数据表真正的修改
( 2)更新条件在,更新条件,选项卡中,可对哪些允许更新的字段进行确定 。 如下图,在,表,框中,选需要更新字段的表,如 xscj.dbf。 在,字段名,框的左上角,
有一个钥匙图标和一个铅笔点击工具栏中的,!”或选菜单“查询”下面的“运行查询”,或直接按快捷键 CTRL+Q,就可以得到查询的结果
2、运行视图
3、远程视图
4、参数化视图