Visual FoxPro中的数据查询功能
2009-10-26杜雪莲
杜雪莲
[摘要]Visual FoxPro是一个数据库开发和管理工具,SQL是结构化查询语言,包括数据查询、数据定义、数据操纵和数据控制功能等。因此熟练掌握一些简单常用的查询命令,会大大地提高数据查询的速度,有利于我们对数据库应用程序的进一步开发。
[关键词]数据库数据表SQL数据查询命令
中图分类号:TP2文献标识码:A文章编号:1671-7597(2009)0710070-02
数据查询是用户使用各种软件来管理数据的目的之一,也是各种数据库程序设计的重点。用户希望能方便有效快速地找到他们所需的信息,为各种事务处理提供有力的支持。所以,数据查询作为信息管理软件设计中要实现的一项重要功能,必须具有良好的数据界面和方便的操作及灵活的查询功能,这也是信息管理软件开发人员所追求的目标。在Visual FoxPro数据管理系统中,设置了查询命令和查询向导,可以进行数据库表记录的选择、分组查询、多表查询及查询结果数据的输出等功能,能够产生独立的查询文件,通过调用该文件可得到所需要的数据。但这些分散的功能命令和文件不适用于数据库应用程序的查询操作,使用这种方式设计的数据库应用程序,用户必须熟知VFP系统命令、操作、数据类型的匹配方式及各种数据表之间的关系才能有效的查询到自己所需的信息,这给用户进行数据查询操作带来极大的不便。
Visual FoxPro是一个优秀的可视化数据库编程工具,其中数据库管理系统的一个主要功能是数据查询。我们不仅可以创建和管理数据库,还可以创建各种简单的连接查询应用程序。SQL-Select命令可以实现对数据库的任何查询,本文主要讨论以查询命令方式来实现查询。查询的主要短语含义如下:
SELECT说明要查询的数据;
FROM说明要查询的数据来自哪个或哪些表,可以对单个表或多个表进行查询;
WHERE说明查询条件,即选择元组的条件;
GROUP BY短语用于对查询结果进行分组,可以利用它进行分组汇总;
HAVING短语必须跟随GROUP BY使用,它用来限定分组必须满足的条件;
ORDER By短语用来对查询的结果进行排序。
本文中主要针对以下几个表进行查询:
1.简单查询(基于一个表的查询)
例1:查询工资在1200以上的职工号。
SELE 职工号 FROM ZG WHER 工资>1200
例2:查询哪些城市里建了仓库。
SELE DIST 城市 FROM CK (DISTINCT是去掉重复值的短语)
2.简单的联接查询(基于多个表的查询)
例3:查询工资在1200以上的职工所在的城市。
SELE 职工号,城市 FROM ZG,CK WHER ZG.仓库号= CK.仓库号AND
工资>1200
3.嵌套查询
此查询所要求的结果出自一个关系,但相关条件却涉及多个关系。WHERE之后是一个相对独立的条件,这个条件或者为真,或者为假。但是,有时我们需要用另外的方式来表达检索要求,比如,当查询数据表X中的元组时,它的条件依赖于相关的数据表Y中的元组属性值,这种情况用嵌套查询功能非常方便。
例4:查询比职工E1 所挣工资高的所有职工。
SELE 职工号FROM ZG WHER工资>(SELE工资FROM ZG WHER 职工号="E1")
例5:查所有职工的工资都多于1200元的仓库信息。
SELE * FROM CK WHERE 仓库号 NOT IN
(SELE 仓库号 FROM ZG WHERE 工资<=1200)
注意:如果条件变成:查所有职工的工资都多于1200元的仓库信息,并且该仓库至少有一名职工。则可以这样写出查询语句:
SELE * FROM CK WHERE 仓库号 NOT IN
(SELE 仓库号 FROM ZG WHERE 工资<=1200)
AND 仓库号 IN(SELE 仓库号 FROM 职工)
4.使用特殊运算符的查询
例6:查询工资在1200到1300的职工信息。
SELE * FROM ZG WHERE 工资 BETWEEN 1200 AND 1300
例7:查询出所有工厂的信息。
SELE *FROM GYS WHERE 供应商名 LIKE “%厂”
注意:BETWEEN……AND是包含边界值的查询。
LIKE是字符串匹配运算符,通配符“%”代表若干个字符,“_”代表一个字符。
5.排序查询
例8:对ck表先按仓库号,再按面积排序并输出全部信息。
SELE * FORM CK ORDER BY 仓库号,面积
6.计算查询
SQL语言有以下几个用于计算检索的函数:
Sum( )求和
AVG( )求平均值
MAX( )求最大值(数值、字符、日期)
MIN( )求最小值(数值、字符、日期)
COUNT( )计数
例9:查询ZG表中应付职工工资的总数,并将产生的字段命名为“总工资”。
SELE SUM(工资)AS总工资FROM ZG
例10:查询在WH1仓库工作的职工的最低工资。
SELE MIN(工资)FROM ZG WHERE 仓库号=“WH1”
7.分组计算查询
Group by <列名>[,<列名>... ][having<筛选条件>]
这条命令可以按一列或多列分组,当要求分组满足某个条件时,可用having进一步限定分组的条件,并且having子句总是跟在group by子句之后,不可以单独使用。
例11:求每个仓库的职工的平均工资。
SELECT仓库号,AVG(工资)FROM ZG GROUP BY 仓库号
例12:求至少有两个职工的每个仓库的职工的平均工资。
SELECT仓库号,AVG(工资)FROM ZG GROUP BY 仓库号 HAVING COUNT(*)>=2
8.内外层相关嵌套查询
在查询的过程当中,有时候内层查询的条件需要外层查询提供值,而外层查询条件需要内层的查询结果,这时候我们用到的查询就是内外层相关嵌套查询。
例13:列出每个职工经手的具有最高总金额的订购单信息。
SELECT OUT. 职工号,OUT. 供应商号, OUT. 订购单号,OUT. 订购日期, OUT. 总金额
FROM DGD OUT WHERE 总金额=
(SELECT MAX (总金额) FROM DGD IN
WHERE OUT. 职工号= IN. 职工号)
9.超连接查询
在Visual FoxPro中提供了专门用于支持超连接查询的命令,格式为:
Select. . . . . .
From < 表名1 > inner| left| right| full join < 表名2>
On <连接条件>
Where. . . . . .
这里inner join 等价于join, 为普通的连接,也称内部联接,即只有满足连接条件的记录才出现在查询结果中; left join 为左连接,即除满足连接条件的记录出现在查询结果中外,第一个表中不满足连接条件的记录也出现在查询结果中,但相应部分为空值; right join 为右连接,即除满足连接条件的记录出现在查询结果中外,第二个表中不满足连接条件的记录也出现在查询结果中,但相应部分为空值; full join为全连接,即两个表中的记录不管是否满足连接条件将都在目标表中出现,不满足连接条件的记录对应部分为空值。
on < 连接条件>指定连接条件。
例14:查询职工所在仓库的信息和职工的信息。(内部联接)
SELECT CK.*,职工号,工资
FROM CK JOIN ZG
ON CK.仓库号=ZG.仓库号
例15:查询职工所在仓库的信息和职工的信息。(左联接)
SELECT CK.*,职工号,工资
FROM CK LEFT JOIN ZG
ON CK.仓库号=ZG.仓库号
注意:当JOIN 连接格式在连接多个表时,要注意JOIN 的顺序和ON 的顺序(相应的连接条件)正好相反。
10.利用空值查询
例16:找出没有确定供应商的订购单信息。
SELE * FROM DGD WHERE 供应商号 IS NULL
除了以上的查询功能,Visual FoxPro还提供了如别名与自连接查询,使用量词和谓词的查询,集合的并运算等等不再一一列举。以上是我对查询命令简单的总结,熟练掌握这些命令,能够方便迅速的查找我们想要查看的数据, 能够提高工作、学习的效率, 有利于我们对Visual Foxpro的进一步学习。
参考文献:
[1]银华强、刘普艳,Visual FoxPro8数据库项目案例导航[M].清华大学出版社,2005.1.
[2]张洪举,Visual FoxPro6.0-9.0 解决方案与范例大全[M].人民邮电出版社,2006.4.
[3]全国计算机等级考试二级教程Visual FoxPro程序设计[M].高等教育出版社,2004.5.