410 likes | 551 Vues
第 5 章 关系数据库标准语言 SQL. 本章要点. SQL 概述以及特点 查询功能,简单查、简单的联接查询、嵌套查询 、 SQL SELECT 中特殊运算符 、排序、简单的计算查询、分组与计算查询、利用空值查询、别名与自联接查询、内外层相互关联的嵌套查询、使用量词和谓词的查询、超联接查询、集合的并运算. 5.1 SQL 概述. 1 . SQL 定义 SQL 是一种非过程化的语言,也是结构化查询语言的缩写,是关系数据库的标准语言。 2 . SQL 特点 SQL 是一种一体化的语言,包括数据定义、数据查询、数据操纵和数据控制等方面的功能。
E N D
本章要点 • SQL概述以及特点 • 查询功能,简单查、简单的联接查询、嵌套查询 、SQL SELECT中特殊运算符 、排序、简单的计算查询、分组与计算查询、利用空值查询、别名与自联接查询、内外层相互关联的嵌套查询、使用量词和谓词的查询、超联接查询、集合的并运算
1.SQL定义 • SQL是一种非过程化的语言,也是结构化查询语言的缩写,是关系数据库的标准语言。 • 2.SQL特点 • SQL是一种一体化的语言,包括数据定义、数据查询、数据操纵和数据控制等方面的功能。 • SQL是一种高度非过程化的语言,用户不必告诉计算机怎么去做,只需告诉计算机做什么。 • SQL语言非常简洁。 • SQL可以直接以命令方式交互使用,也可以嵌入到程序设计语言中以程序方式使用。
1.SQL • SQL的核心是查询,SQL的查询命令也称SELECT命令,它提供了简单而又丰富的SELECT数据查询语句。 • SELECT-SQL命令指定查询条件并执行查询命令,从而从一个表或多个表中检索数据。 • 2.创建SELECT命令 • 在命令窗口中创建 • 在VFP程序中创建 • 在查询设计器中创建
3. SELECT命令 • 语法格式: • SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT][Alias.] Select_Item [AS Column_Name][,[Alias.] Select_Item [AS Column_Name]…]FROM [FORCE][DatabaseName!] Table [[AS] Local_Alias][[INNER |LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN[DatabaseName!] Table [[AS] Local_Alias][ON JoinCondition]]…][[INTO Destination][TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT]| TO SCREEN]][PREFERENCE PreferenceName][NOCONSOLE][PLAIN][NOWAIT] [WHERE JoinCondition [AND JoinCondition…][AND |OR FilterCondition [AND | OR FilterCondition…]]][GROUP BY GroupColumn [,GroupColumn…]][HAVING FilterCondition][UNION [ALL] SELECTCommand][ORDER BY Order_Item [ASC | DESC][,Order_Item [ASC | DESC]…]]
命令说明: • FROM子句指出要查询的数据来自哪个或哪些表,可以对单个表或多个表进行查询。 • DISTINCT短语将在查询结果中排除重复的行。 • TOP nExpr [PERCENT]表示在符合条件的所有记录中,选取指定数量或百分比的记录。 • Select_Item指定包括在查询结果中的项。 • AS Column_Name指查询结果中列的标题。 • FROM列出所有表中检索数据的表。 • INTO Destination指定在何处保存查询结果。
命令说明:(续) • WHERE指定查询条件。 • JoinCondition指定一个字段,该字段连接。 • GROUP BY按列的值对查询结果的行进行分组。 • HAVING指定包括在查询结果中的组必须满足的筛选条件,HAVING应该同GROUP BY一起使用。 • ADDITIVE使查询结果追加到TO FILE FileName所指定文本文件的内容后面。 • TO PRINTER使查询结果定向输出到打印机。 • TO SCREEN使查询结果定向输出到VFP主窗口或活动的用户自定义窗口中。
5.2.1 简单查询 • 1.定义: • 简单查询是针对单个表的查询,由SELECT和FROM短语构成无条件查询或由SELECT、FROM和WHERE短语构成条件查询。 • 2.举例: • 例1 从zg关系中检索所有的工资值。 • 例2 检索gys关系中的所有字段。 • 例3 检索工资多于1250元的职工号。 • 例4 检索哪些仓库有工资多于1260元的职工号。
例5 给出在仓库“WH2”或“WH1”工作,并且工资少于1250元的职工号。 • 3.说明: • 如果有WHERE子句,系统首先根据指定的条件依次检验关系中的每个字段。 • 如果没有指定WHERE子句,则不进行检验,然后选出满足条件的字段,显示SELECT子句中满足条件的记录。
5.2.2 简单的联接查询 • 1.定义: • 简单联接查询也是一类基于多个表的查询,与嵌套查询的区别是要查询的结果可以出自多个表中,而嵌套查询的结果是基于一个表中。 • 2.举例: • 例6 找出工资多于1250元的职工号与他们所在的城市。 • 例7 找出工作在面积大于300的仓库的职工号和职工所在的城市。
3.说明: • 如果在检索命令的FROM之后有两个关系,那么这两个关系之间肯定有一种联系,否则无法构成检索表达式。 • 在联接中如果需要查询不同表中的相同字段名时,必须用关系前缀指明字段所属的表,运算符为“.”,即<表名>.<字段名>。 • WHERE短语后面也用表名作前缀,但通常是在FROM短语后为表名定义别名,这样可以方便输入。
5.2.3 嵌套查询 • 1.定义: • 嵌套查询基于多个关系的查询,查询的结果是来自一个表,而查询的条件却涉及到多个表。 • 2.举例: • 例8 哪些城市至少有一个仓库的职工工资为1250元? • 例9 查询所有职工工资都多于1200元的仓库信息。 • 例10 查询和E4工资相同的所有职工记录。
5.2.4 几个特殊运算符 • 1.LIKE和“!=” • 2.举例: • 例12 从gys表中查询出全部公司的信息,不要工厂或其他gys信息。 • SELECT *FROM gys WHERE 供应商名 LIKE“%公司” • LIKE运算符是字符串匹配运算符,可以用“*”表示0个或多个字符,另外还有一个通配符“_”表示一个字符。
例13 查询出地址不在北京的所有gys信息。 • SELECT *FROM gys WHERE地址!=“北京” • 与上述查询命令等价的命令为: • SELECT *FROM gys WHERE NOT(地址=“北京”) • SQL中,不等于用“!=”表示。
5.2.5 排序 • 1.排序短语 • ORDER BY • 2.格式: • ORDER BY Order_Item [ASC | DESC][,Order_Item [ASC |DESC]…] • 每个Order_Item都必须对应查询结果中的一列。 • ASC指定查询结果根据排序项以升序排列,系统系统的是升序排列。 • DESC指定查询结果以降序排列。 • 如果不使用ORDER BY指定查询结果的排列顺序,则查询结果不排序。
3.举例: • 例14 按zg表中的工资值升序查找出所有职工信息。 • 例15 将zg表中的值排序,先按仓库号排序,再按工资排序并查询所以zg表中的信息。
5.2.6 简单的计算查询 • 1.字段函数 • COUNT • 计算列中选定项的数目,计算查询输出的行数。 • SUM • 计算列中数值的和。 • AVG • 计算列中数值的平均值。 • MAX • 确定列中的最大值。 • MIN • 确定列中的最小值。
2.举例: • 例16 查询gys表中所在地的数目。 • SELECT COUNT(DISTINCT 地址) FROM gys • 上例中,若查询gys表中的记录数,应使用命令: • SELECT COUNT(*) FROM gys。 • 一般COUNT函数应该使用DISTINCT短语,除了对表中的记录个数进行统计。例10 查询和E4工资相同的所有职工记录。
2.举例: • 例17 求zg表中支付的工资总数。 • 例18 求北京和西安的ck,zg表中的所有工资总和。 • 例19 求所有zg表中的工资都大于1120元的ck的平均面积。 • 例20 求在WH1仓库工作的zg最高工资值。 • 例21 求在WH1仓库工作的zg最低工资值。
5.2.7 分组与计算查询 • 1.格式 • GROUP BY GroupColumn [, GroupColumn…] [HAVING FilterCondition] • 2.说明 • GroupColumn可以是常规的表字段名,也可是一个包含SQL字段函数的字段名或一个数值表达式,指定查询结果表中的列位置。 • 可以按一列或多列分组,还可以用HAVING进一步限定分组的条件。
3.举例: • 例22 求每个仓库的zg平均工资。 • 例23 求至少有3个zg的仓库的平均工资。 • GROUP BY短语一般跟在WHERE短语后面,若没有WHERE 短语,就跟在FROM短语后面。 • GROUP BY还可以根据多个属性进行分组。 • 在分组查询时,有时要求查询满足条件的记录时,可以用HAVING短语来限定分组。 • HAVING必须同GROUP BY一起使用,不能单独使用,HAVING与WHERE短语一起使用时,首先由WHERE限制满足筛选条件的记录,然后再由HAVING子句来限定分组。
5.2.8 利用空值查询 • 1.NULL值 • 特点 • 等价于没有任何值。 • 与0、空格和空字符串不同。 • 排序时具有最大的优先权。 • 可以用于计算和大多数的函数中。 • NULL值不改变变量或字段的数据类型。 • NULL值会影响命令、函数、表达式的执行。 • 2.举例: • 例24 查询已经确定供应商号的dgd信息。 • 查询空值时使用IS NULL,=NULL是无效的,空值是一个不确定的值,所以不能用等于号进行比较。
5.2.9 别名与自联接查询 • 1.格式 • <关系名><别名> • 2.举例: • 例如:SELECT 供应商空值是一个不确定的值,所以不能用等于号进行比较。名 FORM gys,dgd,zg, ck;WHERE 地址=“北京”AND 城市=“北京”; AND dgd.职工号=zg. 职工号;AND zg.仓库号=ck. 仓库号;AND gys.供应商号=dgd.供应商号。
下面是使用别名的同样的联接查询语句 • SELECT 供应商名 FORM gys A,dgd B,zg C,ck D;WHERE 地址=“北京”AND 城市=“北京”;AND A.供应商号= B.供应商号;AND B.职工号= C. 职工号;AND C.仓库号= D. 仓库号 • 别名并不是必须的,在关系的自联接操作中,别名是必不可少的。 • SQL不仅可以对多个表进行联接操作,也可以将同一关系与其自身进行联接,这种联接就称为自联接。
1.举例: • 例26 列出每个职工办理的具有最高总金额的订购单信息。 • SELECT out.职工号,out.供应商号,out.订购单号,out.订购日期,out.总金额;FROM dgd out WHERE 总金额=;(SELECT MAX(总金额)FROM dgd inner1;WHERE out.职工号= inner1. 职工号) • 在上述查询中,内层和外层查询使用的是同一个关系,分别命名为inner1和out。
5.2.11 使用量词和谓词的查询 • 1.格式说明: • <表达式><比较运算符>[ANY|ALL|SOME] (子查询)[NOT] EXISTS(子查询) • ANY、ALL和SOME是量词,其中ANY和SOME在查询中有一行能使结果为真,则结果为真,ALL是要求子查询中的所有行都使结果为真时,结果为真。 • EXISTS是谓词,EXISTS或NOT EXISTS是用来查询在子查询中是否有结果返回,即存在元组或不存在元组。
1.举例: • 例27 查询哪些仓库中至少有一名职工的仓库信息。 • SELECT *FROM ck WHERE EXISTS; (SELECT *FROM zg WHERE zg.仓库号=ck.仓库号) • 上述的查询命令与以下查询命令等价: • SELECT *FROM ckWHERE IN(SELECT 仓库号FROM zg) • 例28 查询有职工的工资大于或等于WH2仓库中的任何一名职工工资的信息。
3.举例: • 例28 列出每个职工办理的具有最高总金额的订购单信息。 • SELECT DISTINCT * FROM zg WHERE工资>=ANY;(SELECT工资FROM zg WHERE 仓库号=“WH2”) • 上述的查询命令与以下查询命令等价: • SELECT DISTINCT * FROM zg WHERE工资>=;SELECT MIN(工资)FROM zg WHERE 仓库号=“WH2”)
3.举例: • 例29 查询有职工的工资大于或等于WH2仓库中的所有职工工资的信息。 • SELECT DISTINCT * FROM zg WHERE工资>=ALL;(SELECT工资FROM zg WHERE 仓库号=“WH2”) • 上述的查询命令与以下查询命令等价: • SELECT DISTINCT * FROM zg WHERE工资>=;(SELECT MAX(工资)FROM zg WHERE 仓库号=“WH2”)
5.2.12超联接查询 • 1.分类 • 左联接 • 右联接 • 完全联接 • 2.命令格式: • SELECT……FROM Table INNER | LEFT | RIGHT | FULL JOIN Table ON JoinCondition WHERE…… • 3.命令说明: • INNER JOIN等价于JOIN,为普通联接,在Visual FoxPro中称为内部联接。
LEFT JOIN为左联接。在查询结果中包含JOIN左侧表中的所有记录,以及JOIN右侧表中匹配的记录。 • RIGHT JOIN为右联接。在查询结果中包含JOIN右侧表中的所有记录,以及JOIN左侧表中匹配的记录。 • FULL JOIN为全联接,在查询结果中包含JOIN两侧所有的匹配和不匹配的记录。 • ON JoinCondition表示联接条件。 • 超联接查询的联接条件在ON短语中给出,而不在WHERE短语中给出,联接类型在FROM短语中给出。
3.举例: • 例30 普通联接,也就是只有满足条件的记录才出现在查询的结果中。 • SELECT ck.仓库号,ck.面积,zg.职工号,zg.工资;FROM ck JOIN职工;ON ck.仓库号=zg.仓库号 • 与上述查询显示结果相同的命令如下: • SELECT ck.仓库号,ck.面积,zg.职工号,zg.工资;FROM ck INNER JOIN职工;ON ck.仓库号=zg.仓库号 • 和 • SELECT ck.仓库号,ck.面积,zg.职工号,zg.工资;FROM ck,zg WHERE ck.仓库号=zg.仓库号
例31 左联接,也就是除满足条件的记录出现在查询结果外,第一个表中不满足条件的记录也出现在查询结果中。 • SELECT ck.仓库号,ck.面积,zg.职工号,zg.工资;FROM ck LEFT JOIN职工;ON ck.仓库号=zg.仓库号 • 例32 右联接,也就是除满足条件的记录出现在查询结果外,第二个表中不满足条件的记录也出现在查询结果中。 • SELECT ck.仓库号,ck.面积,zg.职工号,zg.工资; FROM ck RIGHT JOIN职工;ON ck.仓库号=zg.仓库号
例33 全联接,也就是除满足条件的记录出现在查询结果外,两个表中不满足条件的记录也出现在查询结果中。 • SELECT ck.仓库号,ck.面积,zg.职工号,zg.工资;FROM ck FULL JOIN职工;ON ck.仓库号=zg.仓库号 • JOIN联接格式在连接多个表时应注意其书写方式,JOIN的顺序和ON的顺序是很重要的。 • JOIN和ON的顺序应相反
5.2.13 集合的并运算 • 1.定义: • 并运算是将两个SELECT语句的查询结果合并成一个查询结果。 • 2.运算符 • UNION • 3.UNION子句遵守的规则: • 不能使用UNION来组合子查询。 • 两个SELECT命令的查询结果中的列数必须相同。 • 两个SELECT查询结果中的对应列必须有相同的数据类型和宽度。 • 只有最后的SELECT中可以包含ORDER BY子句,并且必须按顺序指出所输出的列。
4.举例: • 例34 查询结果是城市是北京和西安的仓库信息。 • 在SQL语句中不能使用UNION来组合子查询。 • 用UNION运算时,两个SELECT命令的查询结果中的列数必须相同。 • 两个SELECT查询中的对应列必须有相同的数据类型和宽度。
5.2.14 SOL SELECT的几个特殊选项 • 1.显示部分结果 • SQL命令可以显示部分结果,使用TOP子句。 • 2.将查询结果放到数组中 • 要将查询结果放到数组中,使用INTO ARRAY 短语。 • 3.将查询结果放到临时文件中 • 要将查询结果存放到临时文件中,使用INTO CURSOR短语。 • 4.将查询结果存放到永久表中 • 使用短语INTO DBF | TABLE将查询结果存放到永久表中。
5.将查询结果存放到文本文件中 • 可以将查询结果存放到文本文件中,使用TO FILE 短语。 • 6.将查询结果直接输出到打印机 • 可以将查询结果直接输出到打印机,使用TO PRINTER子句。 • 例35 显示工资最高的四位职工的信息。 • 例36 显示工资最低的那30%职工的信息。 • 例37 显示工资最高的那30%职工的信息。