Visual FoxPro SQL查询中变量的使用方法

时间:2022-04-20 07:38:28

Visual FoxPro SQL查询中变量的使用方法

摘要:介绍了visual foxprosql查询的一般格式和变量的表现形式,阐述了变量在SELECT、FROM和WHERE子句中的具体使用方法

关键词:Visual FoxPro;SQL;变量

中图分类号:TP311文献标识码:A 文章编号:1009-3044(2008)05-10000-00

1 引言

SQL的全称是Structured Query Language(结构化查询语言),是关系数据库中最常用的语言。Visual FoxPro是一种关系数据库管理系统,包含8种SQL型命令,其中一种就是SQL-SELECT查询命令。SELECT命令具有强大的单表与多表查询功能,支持子查询和嵌套查询。子查询就是一个SELECT-FROM-WHERE表达式,其结果用于另一个查询。但Visual FoxPro并不支持在SELECT子句和FROM子句中使用子查询。通过变量的使用可以弥补这种遗憾。本文具体介绍在SELECT、FROM和WHERE子句中变量的使用方法。所有的查询均基于成绩表和学生档案表。见图1和图2。

图1 成绩表

图2 学生档案表

2 用SQL查询的一般格式

简单的SQL查询只包括SELECT子句、FROM子句和WHERE子句。SELECT子句和FROM子句在所有的查询中是不能省略的。SELECT子句选择列表,可以选择所有列也可以只选择部分列并指定它们的显示顺序;FROM子句指定查询相关的表或视图,可以同时指定多个表或视图;WHERE子句设置查询条件,过滤掉不需要的数据。另外,还可以使用ORDER BY子句对查询的结果进行升序或降序排列;使用GROUP BY和HAVING子句对符合条件的记录进行分组显示。例如对成绩表进行查询,要求显示数控技术成绩在80分以上的学生姓名和各项成绩,并按数控技术成绩降序排列,其SQL查询语句如下:

SELECT 姓名,NC AS 数控技术,VFP AS 数据库管理系统,PLC AS 可编程序控制器,VC AS C语言

FROM 成绩表 WHERE NC>80 ORDER BY NC DESC

再如查询学生档案表男生的人数和高考平均成绩,以及女生的人数和高考平均成绩,并按高考平均成绩降序排列。

SELECT 性别,COUNT(*),AVG(高考成绩) FROM 学生档案GROUP BY 性别 ORDER BY 3 DESC

但有些复杂的查询仅用几个子句的简单组合是无法实现的,比如查询数控技术成绩在平均分以上的学生的学号、姓名和各门功课的成绩,用下面的SQL语句则会出错,SQL不接受这种形式的查询条件(WHERE NC>AVG(NC))。

SELECT 学号,姓名,NC,VFP,PLC,VC FROM 成绩表 WHERE NC>AVG(NC)

有时候我们需要对相同结构的不同的表作相同的查询,在设计程序时,希望根据自己的选择只对某表作查询操作;亦或想让某一查询的结果显示在另一查询的列表中等等。这些特别的要求有的可以用子查询解决,但有的在Visual FoxPro中用子查询无法实现,这时我们应考虑使用变量。首先看看如何将一个查询结果赋值给一个变量。

3 将SQL查询结果赋给一个变量

SQL为查询结果提供去向的子句有INTO和TO子句,它们的作用如下表所示。

表1 SQL查询去向

因此,SQL语句查询的结果可以保存到数组中或形成临时表格,该查询结果就可以用于另一个查询中,等到整个查询结束,清除变量和关闭临时表即可。

例如上面提到的查询:查询数控技术成绩在平均分以上的学生的学号、姓名和各门功课的成绩,数控技术的平均成绩就可以用一个查询来实现,其结果保存到一个数组变量CJ或一个临时表CJ中。

SELECT AVG(NC) FROM 成绩表 INTO ARRAY CJ

SELECT AVG(NC) AS NCAVG FROM 成绩表 INTO CURSOR CJ

4 在WHERE子句中使用变量

既然数控技术的平均成绩已知,查询数控技术成绩在平均分以上的学生的学号、姓名和各门功课的成绩就可以使用下面的SQL语句:

SELECT 学号,姓名,NC,VFP,PLC,VC FROM 成绩表 WHERE NC>CJ&&CJ为数组名

SELECT 学号,姓名,NC,VFP,PLC,VC FROM 成绩表 WHERE NC>CJ.NCAVG&&CJ为临时表名

查询完毕,清除数组变量(RELEASE CJ)或关闭临时表(USE)。

实际上将求数控技术平均成绩的SELECT语句作为子查询整合到上一级查询中也可以实现查询的目的。

SELECT 学号,姓名,NC,VFP,PLC,VC FROM 成绩表 WHERE NC>(SELECT AVG(NC) FROM 成绩表)

上述三种方法查询结果相同,见图3。

图3 查询浏览窗口1

5在FROM子句中使用变量

FROM子句用于指定SELECT语句查询的表或视图。有时候,特别是对大量相同结构的表实施相同内容查询的时候,在FROM子句中使用变量可以大大缩短操作时间,提高工作效率。但在Visual FoxPro中不允许直接用变量名作为表名使用。这时可以用宏代换函数代替表名。下面一段程序就可以根据自己的意愿输入表名实施查询。

@5,10 SAY “请输入表名:”GET BM DEFAULT SPACE(10) &&定义变量BM并赋初值10个空格

READ&&比如输入表名:学生档案

BM=ALLTRIM(BM) &&删去两端的空格

SELECT 学号,姓名,高考成绩 FROM &BM&&实施查询

另外,在对大量数据特别是对多表进行查询操作的时候,由于限定条件多,SQL语句会特别长,不仅容易出错,而且浪费时间。这时我们可以先进行重合部分的查询,并将查询结果保存在临时表中,剩下的工作就只是对临时表(单表)实施查询,使操作大大简化。例如,如果要了解湖北籍、高考成绩大于560分学生的情况,比如共有多少人、各科的平均成绩、每门功课的最高分和最低分以及他们的年龄等等。操作方法如下:

首先,实施两表的连接查询,条件是湖北籍学生、高考成绩大于560分,查询结果保存在临时表HBXS中。

SELECT A.学号,A.姓名,A.NC,A.VFP,A.PLC,A.VC,B.性别,B.出生日期 FROM 成绩表 A,学生档案 B

WHERE A.学号=B.学号 AND LEFT(B.籍贯,4)='湖北' AND B.高考成绩>560 INTO CURSOR HBXS&&A,B分别是成绩表和学生档案表的别名

然后,对临时表HBXS进行查询操作。比如:

统计人数: SELECT COUNT(*) FROM HBXS

求各科平均成绩:SELECT AVG(NC),AVG(VFP),AVG(PLC),AVG(VC) FROM HBXS

每门课最高分和最低分:SELECT MAX(NC),MIN(NC),MAX(VFP),MIN(VFP),MAX(PLC),MIN(PLC),

MAX(VC),MIN(VC) FROM HBXS

他们的年龄:SELECT 姓名,INT((DATE()-出生日期)/365) AS 年龄 FROM HBXS

6 在SELECT子句中使用变量

SELECT子句指定查询列表及其排列顺序,一般的查询均能实现,但有些查询特别是含有集合函数的查询得到的结果与目标不一致。例如,运用查询显示每位同学数控技术成绩与平均分的差距。使用下面的SQL语句只能显示一个记录,见图4。

SELECT 学号,姓名,NC-AVG(NC) AS NC与平均分之差 FROM 成绩表

图4 查询浏览窗口2

为解决这一问题,我们引入变量NC_AVG,NC_AVG的值等于数控技术这门课的平均成绩,由另一个SELECT语句实现。因此用两个SQL语句就可以解决上面提出的问题。查询结果见图5。

SELECT AVG(NC) FROM 成绩表 INTO ARRAY NC_AVG

SELECT 学号,姓名,NC-NC_AVG FROM 成绩表

图5查询浏览窗口3

7 结束语

灵活使用变量可以简化复杂的SQL查询,但是变量使用之前必须先定义并赋值。从上面的示例中可以看出,SQL查询的结果一般保存在数组变量或临时表(字段变量)中,在引用这些变量时一定注意引用的格式。另外,SQL-SELECT具有强大的查询功能,如果能够通过子查询解决问题,尽量用子查询,保持SQL查询语句良好的可读性。

参考文献:

[1]史济民,汤观全.Visual FoxPro及其应用系统开发[M].北京:清华大学出版社,2005.

[2]高守传.SQL-结构化查询语言详解[M].北京:人民邮电出版社,2007.

[3]Rick F.van der Lans,王崧.SQL完全手册(第4版) [M].北京:电子工业出版社,2007.

[4]杨志姝,李光海.SQL应用与开发[M].北京:清华大学出版社,2006.

收稿日期:2008-01-12

作者简介:张金姣(1971-),女,湖北黄冈人,湖北工业大学讲师,硕士研究生,研究方向为机电一体化。

上一篇:基于微软Hyper-V的虚拟化技术 下一篇:一种基于XML的元数据模型设计方法的研究