二级VF教案 - 图文 下载本文

SQL功能 命令动词 数据查询 SELECT 数据定义 CREATE、DROP、ALTER 数据操纵 INSERT、UPDATE、DELETE 数据控制 GRANT、REVOKE 一、查询功能

1、SQL语言的核心是查询。

查询的基本形式:SELECT<字段名/表达式>FROM<表名/视图名>WHERE<条件>

由于表是由行和列组成就像数学中所学的坐标由X轴和Y轴构成,所需确定某个点需要说明X为多少Y为多少。而表中需要查询某些数据就必需指明行和列,所以在查询时:

4 FROM<表名/视图名>:说明查询的数据来自于所需要的表或视图。若

某于多个表时,各个表之间用逗号隔开。

5 SELECT<字段名/表达式>:说明从表或视图中所查询结果是哪些字段

名或表达式的值(各字段名或表达式之间用逗号隔开)即针对表的列来操作(限定列) 6 WHERE<条件>:说明从表或视图中所查询结果是哪些行即记录针对表

的行来操作(限定行)

关于其它短语的说明: 短语 说明 * 来自于某(些)表的所有字段(属性) DISTINCT 去掉查询结果中的重复记录(元组) 相当于数学集合―∈‖只需属于其中一个元素(值)就是 IN 满足条件;NOT IN则不属于其中任意一个元素(值)就满足条件 BETWEEN?表示?和?之间,注意和第二章BETWEEN()函数的区别 AND 字符串匹配运算符,注意通配符是―&‖和 LIKE ―-‖与第二章LIKE()函数区别 对指定某个(些)字段排序,只能对最终的 ORDER BY 查询结果排序,不能用于子查询 GROUP BY 用于分组计算查询(指定分组依据) 对GROUP BY分组计算查询的结果进一步的加以限定即限定分组 (对分组之后的限定),必须跟GROUP连用,不能单独使用。 HAVING 但与WHERE条件无关,因WHERE条件是对分组之前限定某些 元组(记录)是否来参加分组。(注:HAVING与WHERE使用的区别) IS NULL 查询某字段为空值的记录(元组),但不能用―=NULL‖表示 查询某字段不为空值的记录(元组),但不能 IS NOT NULL 用―#NULL‖或―NOT IS NULL‖ ANY/SOME 子查询中只需一行为 .T.则外层就满足条件 ALL 子查询中所有的行都为 .T.则外层就满足条件 EXISTS 子查询中只需有结果(无论多少),则外层就满足条件 NOT EXISTS COUNT() MAX() MIN() AVG() SUM() [INNER] JOIN LEFT JOIN 子查询中只需有结果,则外层就满足条件 统计查询结果的记录(元组)条数 对某列(数值类型)求最大值 这五个函数只能跟在 对某列(数值类型)求最小值 或后面,不 能直接跟在其它短语后面 对某列(数值类型)求平均值 对某列(数值类型)求和 普通(内部)连接即只有满足条件的记录才出现在查询结果当中 左连接即除满足条件的记录外,第一个表不 满足条件的记录也出现在查询结果当中 右连接即除满足条件的记录外,第二个表不 RIGHT JOIN 满足条件的记录都会出现在查询结果当中 全连接即除满足条件的记录外,第一个表和第二个 FULL JOIN 表中不满足条件的记录都会出现在查询结果当中 SQL查询中唯一的一个并运算,将两个SELECT UNION 查询语句的查询的结果合并成一个查询结果 显示前面的部分记录,必须跟ORDER BY 连用。注意TOP必须书写TOP 在查 询结果第一个字段的前面如:SELECT TOP2 姓名,出生日期 FROM XS INTO ARRAY 把查询结果存储到某个数组当中 INTO 把查询结果存储到某个临时表当中 CURSOR INTO 把查询结果存储到某个永久表(自由表)中 TABLE/DBF TO FILE 把查询结果存储到某个文本文件当中 TO PRINTER 把查询结果输出到打印机 可以在3个区域中创建SELECT命令。 1 在命令窗口中; 2 在VFP程序中 3 在查询设计器中 注:

当FROM后面来自于多个表时,必须写连接条件(通常根据表的公共字段作为连接条件),此时在书写公共字段之前必须加以别名限定。 定义表的别名方法见教材P137,超连接的格式见教材P140 FROM书写不要写成=>FORM 二、查询方法: 1 简单查询:

例:从ZZ关系中检索所有的工资值。 检索ZZ关系中的所有字段值 SELECT 工资 FROM ZZ SELECT * FROM ZZ 如果要去掉重复值用:DISTINCT

例:检索哪些仓库有工资多于1260元的职工号

SELECT DISTICT 仓库号 FROM ZZ WHERE工资>1260

2 单击的连接查询:

类似于多个表的查询,与嵌套查询的区别是要查询的结果呆以出自多个表中。而嵌套查询的结果是基于一个表中。

例:找出工资多于1250元的职工号与他们所在的城市。

这里所要求检索的住处分别出自ZZ和CK两个关系,这样的检索肯定是基于多个关系的,这类查询一般用连接查询来实现。 SELECT 职工号,城市 FORM ZZ,CK;

WHERE(工资>1250)AND (ZZ.仓库号=CK.仓库号) 注:分号表示续行号 3 嵌套查询:

查询是基于多个关系的查询,查询的结果来自一个表,而查询的条件去涉及多个表。

注:VF只持两层查询,即内层查询块和外层查询块,不支持SQL的多层嵌套查询。

例:哪些城市至少有一个仓库的职工工资为1250元? SELECT 城市 FROM CK WHERE 仓库号 IN;

(SELECT 仓库号 FROM ZG WHERE 工资=1250)

结果也可写成:SELECT*FROM CK WHERE 仓库号 IN(―WH1‖,―WH2‖) 注:IN相当于集合运算符―包括于‖

注:这就是明显的外层查询和内层查询,在嵌套查询中,只能对外层查询结果进行排序,而不能对内存查询进行排。 三、几个特殊运算符:

1、BETWEEN??AND??

例:查询工资在1230到1280元之间的职工所有信息;

SELECT * FROM ZG WHERE 工资BETWEEN1230AND1280

=SELECT * FROM ZG WHERE (工资>1230)AND (工资<1280) 2、LIKE

3、不等于用―!=‖表示;(在SQL中)

例:查询出地址不在北京的甩有SS信息;

SELECT*FROM SS WHERE 地址!=―北京‖

SELECT*FROM SS WHERE NOT (地址=―北京‖) 四、排序:

命令格式为:ORDER BY Order_Item[ASC|DESC] [Order_Item[AESC]??] 例:按SS表中的工资值升序查找出所有职工信息

SELECT*FROM SS ORDER BY 工资

注:ORDER BY 是对最终结果进行排序,不能在子查询中使用。 五、简单的计算查询:

例:查询SS表中所在地的数目;SELECT COUNT(DISTINCT 地址)FROM SS

六、分组计算查询:

格式为:GROUP BY GROUPCOLUMN [GroupColumn ] [HAVING Filtercondition]

例:求每个仓库的职工平均工资。

SELECT 仓库号,AVG(工资)FROM SS GROUP BY 仓库号

注:GROUP BY 短语一般跟在WHERE短语后面,若没有WHERE短语,就跟在FROM短语后面。另外,GROUP BY 还可以根据多个属性进行分组,在分组查询时,有时要求查询满足条件的记录时,可以用HAVING短语来限定分组。 七、利用空值查询:

SQL支持NULL,所以也可以利用空值进行查询。NULL值具有以下特点: 4 等价于没有任何值;

5 与0、空格和空字符串不同 6 排序时具有最大的优先权。

7 可以用于计算和大多数的函数中。

8 NULL值不改变变量或字段的数据类型。 9 NULL值会影响命令、函数、表达式的执行。 例:查询已经确定供应商号的SS信息:

SELECT *FROM SS WHERE 供应商号 IS NOT NULL

注:查询空值时使用IS NULL =NULL是无效的,空值是一个不确定的值,所以不能用等于号进行比较。 八、自连接与别名查询:

注:别名并不是必需的,在关系的自连接操作中,别名是必不可少的,SQL不仅可以以对多个表进行连接操作,还可以将同一关系与其自身进行连接,这种连接就称为自连接,可以进行自连接的关系,实际上它们之间存在着一种特殊的递归联系。

1 内外层相互关联的嵌套查询 2 使用量词和谓词的查询: 3 超连接查询: 4 集合并运算;

并运算的格式:UNION[ALL] SELCTCommand

一、VFP中SQL SELECT的几个特殊选项; 1、显示部分结果:

命令格式为:TOP nExpr[PERCENT]

注:符号查询条件的所有记录中,选择指定数量或百分比的记录;

TOP子句必须与ORDER BY 子句同时使用;当不使用PERCENT时,nExpr可以是1-32767之间的整数,显示查询结果的前几个记录;

当使用PERCENT时,nExpr是0.01-99.99之间的实数,显示查询结果的前百分之几个记录。

例:显示工资最高的4位职工的信息。

SELECT * TOP 4 SS ORDER 工资 DESC 二、将查询结果放到数组中:

命令格式为:INTO ARRAY ArrayName(数组变量名) 可以将查询结果存放到二维数组中,每行对应一条记录。 例:将查询到的AA信息存放在数组ABC中。