1 / 42

第 5 章 关系数据库标准语言 SQL

第 5 章 关系数据库标准语言 SQL. 本章要点. SQL 概述以及特点 查询功能,简单查、简单的联接查询、嵌套查询 、 SQL SELECT 中特殊运算符 、排序、简单的计算查询、分组与计算查询、利用空值查询、别名与自联接查询、内外层相互关联的嵌套查询、使用量词和谓词的查询、超联接查询、集合的并运算. 5.1 SQL 概述. 1 . SQL 定义 SQL 是一种非过程化的语言,也是 结构化查询语言 的缩写,是关系数据库的标准语言。 2 . SQL 特点 SQL 是一种一体化的语言,包括数据定义、数据查询、数据操纵和数据控制等方面的功能。

kaloni
Download Presentation

第 5 章 关系数据库标准语言 SQL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第5章 关系数据库标准语言SQL

  2. 本章要点 • SQL概述以及特点 • 查询功能,简单查、简单的联接查询、嵌套查询 、SQL SELECT中特殊运算符 、排序、简单的计算查询、分组与计算查询、利用空值查询、别名与自联接查询、内外层相互关联的嵌套查询、使用量词和谓词的查询、超联接查询、集合的并运算

  3. 5.1 SQL概述

  4. 1.SQL定义 • SQL是一种非过程化的语言,也是结构化查询语言的缩写,是关系数据库的标准语言。 • 2.SQL特点 • SQL是一种一体化的语言,包括数据定义、数据查询、数据操纵和数据控制等方面的功能。 • SQL是一种高度非过程化的语言,用户不必告诉计算机怎么去做,只需告诉计算机做什么。 • SQL语言非常简洁。 • SQL可以直接以命令方式交互使用,也可以嵌入到程序设计语言中以程序方式使用。

  5. 5.2 查询功能

  6. 1.SQL • SQL的核心是查询,SQL的查询命令也称SELECT命令,它提供了简单而又丰富的SELECT数据查询语句。 • SELECT-SQL命令指定查询条件并执行查询命令,从而从一个表或多个表中检索数据。 • 2.创建SELECT命令 • 在命令窗口中创建 • 在VFP程序中创建 • 在查询设计器中创建

  7. 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]…]]

  8. 命令说明: • FROM子句指出要查询的数据来自哪个或哪些表,可以对单个表或多个表进行查询。 • DISTINCT短语将在查询结果中排除重复的行。 • TOP nExpr [PERCENT]表示在符合条件的所有记录中,选取指定数量或百分比的记录。 • Select_Item指定包括在查询结果中的项。 • AS Column_Name指查询结果中列的标题。 • FROM列出所有表中检索数据的表。 • INTO Destination指定在何处保存查询结果。

  9. 命令说明:(续) • WHERE指定查询条件。 • JoinCondition指定一个字段,该字段连接。 • GROUP BY按列的值对查询结果的行进行分组。 • HAVING指定包括在查询结果中的组必须满足的筛选条件,HAVING应该同GROUP BY一起使用。 • ADDITIVE使查询结果追加到TO FILE FileName所指定文本文件的内容后面。 • TO PRINTER使查询结果定向输出到打印机。 • TO SCREEN使查询结果定向输出到VFP主窗口或活动的用户自定义窗口中。

  10. 5.2.1 简单查询 • 1.定义: • 简单查询是针对单个表的查询,由SELECT和FROM短语构成无条件查询或由SELECT、FROM和WHERE短语构成条件查询。 • 2.举例: • 例1 从zg关系中检索所有的工资值。 • 例2 检索gys关系中的所有字段。 • 例3 检索工资多于1250元的职工号。 • 例4 检索哪些仓库有工资多于1260元的职工号。

  11. 例5 给出在仓库“WH2”或“WH1”工作,并且工资少于1250元的职工号。 • 3.说明: • 如果有WHERE子句,系统首先根据指定的条件依次检验关系中的每个字段。 • 如果没有指定WHERE子句,则不进行检验,然后选出满足条件的字段,显示SELECT子句中满足条件的记录。

  12. 5.2.2 简单的联接查询 • 1.定义: • 简单联接查询也是一类基于多个表的查询,与嵌套查询的区别是要查询的结果可以出自多个表中,而嵌套查询的结果是基于一个表中。 • 2.举例: • 例6 找出工资多于1250元的职工号与他们所在的城市。 • 例7 找出工作在面积大于300的仓库的职工号和职工所在的城市。

  13. 3.说明: • 如果在检索命令的FROM之后有两个关系,那么这两个关系之间肯定有一种联系,否则无法构成检索表达式。 • 在联接中如果需要查询不同表中的相同字段名时,必须用关系前缀指明字段所属的表,运算符为“.”,即<表名>.<字段名>。 • WHERE短语后面也用表名作前缀,但通常是在FROM短语后为表名定义别名,这样可以方便输入。

  14. 5.2.3 嵌套查询 • 1.定义: • 嵌套查询基于多个关系的查询,查询的结果是来自一个表,而查询的条件却涉及到多个表。 • 2.举例: • 例8 哪些城市至少有一个仓库的职工工资为1250元? • 例9 查询所有职工工资都多于1200元的仓库信息。 • 例10 查询和E4工资相同的所有职工记录。

  15. 5.2.4 几个特殊运算符 • 1.LIKE和“!=” • 2.举例: • 例12 从gys表中查询出全部公司的信息,不要工厂或其他gys信息。 • SELECT *FROM gys WHERE 供应商名 LIKE“%公司” • LIKE运算符是字符串匹配运算符,可以用“*”表示0个或多个字符,另外还有一个通配符“_”表示一个字符。

  16. 例13 查询出地址不在北京的所有gys信息。 • SELECT *FROM gys WHERE地址!=“北京” • 与上述查询命令等价的命令为: • SELECT *FROM gys WHERE NOT(地址=“北京”) • SQL中,不等于用“!=”表示。

  17. 5.2.5 排序 • 1.排序短语 • ORDER BY • 2.格式: • ORDER BY Order_Item [ASC | DESC][,Order_Item [ASC |DESC]…] • 每个Order_Item都必须对应查询结果中的一列。 • ASC指定查询结果根据排序项以升序排列,系统系统的是升序排列。 • DESC指定查询结果以降序排列。 • 如果不使用ORDER BY指定查询结果的排列顺序,则查询结果不排序。

  18. 3.举例: • 例14 按zg表中的工资值升序查找出所有职工信息。 • 例15 将zg表中的值排序,先按仓库号排序,再按工资排序并查询所以zg表中的信息。

  19. 5.2.6 简单的计算查询 • 1.字段函数 • COUNT • 计算列中选定项的数目,计算查询输出的行数。 • SUM • 计算列中数值的和。 • AVG • 计算列中数值的平均值。 • MAX • 确定列中的最大值。 • MIN • 确定列中的最小值。

  20. 2.举例: • 例16 查询gys表中所在地的数目。 • SELECT COUNT(DISTINCT 地址) FROM gys • 上例中,若查询gys表中的记录数,应使用命令: • SELECT COUNT(*) FROM gys。 • 一般COUNT函数应该使用DISTINCT短语,除了对表中的记录个数进行统计。例10 查询和E4工资相同的所有职工记录。

  21. 2.举例: • 例17 求zg表中支付的工资总数。 • 例18 求北京和西安的ck,zg表中的所有工资总和。 • 例19 求所有zg表中的工资都大于1120元的ck的平均面积。 • 例20 求在WH1仓库工作的zg最高工资值。 • 例21 求在WH1仓库工作的zg最低工资值。

  22. 5.2.7 分组与计算查询 • 1.格式 • GROUP BY GroupColumn [, GroupColumn…] [HAVING FilterCondition] • 2.说明 • GroupColumn可以是常规的表字段名,也可是一个包含SQL字段函数的字段名或一个数值表达式,指定查询结果表中的列位置。 • 可以按一列或多列分组,还可以用HAVING进一步限定分组的条件。

  23. 3.举例: • 例22 求每个仓库的zg平均工资。 • 例23 求至少有3个zg的仓库的平均工资。 • GROUP BY短语一般跟在WHERE短语后面,若没有WHERE 短语,就跟在FROM短语后面。 • GROUP BY还可以根据多个属性进行分组。 • 在分组查询时,有时要求查询满足条件的记录时,可以用HAVING短语来限定分组。 • HAVING必须同GROUP BY一起使用,不能单独使用,HAVING与WHERE短语一起使用时,首先由WHERE限制满足筛选条件的记录,然后再由HAVING子句来限定分组。

  24. 5.2.8 利用空值查询 • 1.NULL值 • 特点 • 等价于没有任何值。 • 与0、空格和空字符串不同。 • 排序时具有最大的优先权。 • 可以用于计算和大多数的函数中。 • NULL值不改变变量或字段的数据类型。 • NULL值会影响命令、函数、表达式的执行。 • 2.举例: • 例24 查询已经确定供应商号的dgd信息。 • 查询空值时使用IS NULL,=NULL是无效的,空值是一个不确定的值,所以不能用等于号进行比较。

  25. 5.2.9 别名与自联接查询 • 1.格式 • <关系名><别名> • 2.举例: • 例如:SELECT 供应商空值是一个不确定的值,所以不能用等于号进行比较。名 FORM gys,dgd,zg, ck;WHERE 地址=“北京”AND 城市=“北京”; AND dgd.职工号=zg. 职工号;AND zg.仓库号=ck. 仓库号;AND gys.供应商号=dgd.供应商号。

  26. 下面是使用别名的同样的联接查询语句 • SELECT 供应商名 FORM gys A,dgd B,zg C,ck D;WHERE 地址=“北京”AND 城市=“北京”;AND A.供应商号= B.供应商号;AND B.职工号= C. 职工号;AND C.仓库号= D. 仓库号 • 别名并不是必须的,在关系的自联接操作中,别名是必不可少的。 • SQL不仅可以对多个表进行联接操作,也可以将同一关系与其自身进行联接,这种联接就称为自联接。

  27. 1.举例: • 例26 列出每个职工办理的具有最高总金额的订购单信息。 • SELECT out.职工号,out.供应商号,out.订购单号,out.订购日期,out.总金额;FROM dgd out WHERE 总金额=;(SELECT MAX(总金额)FROM dgd inner1;WHERE out.职工号= inner1. 职工号) • 在上述查询中,内层和外层查询使用的是同一个关系,分别命名为inner1和out。

  28. 5.2.11 使用量词和谓词的查询 • 1.格式说明: • <表达式><比较运算符>[ANY|ALL|SOME] (子查询)[NOT] EXISTS(子查询) • ANY、ALL和SOME是量词,其中ANY和SOME在查询中有一行能使结果为真,则结果为真,ALL是要求子查询中的所有行都使结果为真时,结果为真。 • EXISTS是谓词,EXISTS或NOT EXISTS是用来查询在子查询中是否有结果返回,即存在元组或不存在元组。

  29. 1.举例: • 例27 查询哪些仓库中至少有一名职工的仓库信息。 • SELECT *FROM ck WHERE EXISTS; (SELECT *FROM zg WHERE zg.仓库号=ck.仓库号) • 上述的查询命令与以下查询命令等价: • SELECT *FROM ckWHERE IN(SELECT 仓库号FROM zg) • 例28 查询有职工的工资大于或等于WH2仓库中的任何一名职工工资的信息。

  30. 3.举例: • 例28 列出每个职工办理的具有最高总金额的订购单信息。 • SELECT DISTINCT * FROM zg WHERE工资>=ANY;(SELECT工资FROM zg WHERE 仓库号=“WH2”) • 上述的查询命令与以下查询命令等价: • SELECT DISTINCT * FROM zg WHERE工资>=;SELECT MIN(工资)FROM zg WHERE 仓库号=“WH2”)

  31. 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”)

  32. 5.2.12超联接查询 • 1.分类 • 左联接 • 右联接 • 完全联接 • 2.命令格式: • SELECT……FROM Table INNER | LEFT | RIGHT | FULL JOIN Table ON JoinCondition WHERE…… • 3.命令说明: • INNER JOIN等价于JOIN,为普通联接,在Visual FoxPro中称为内部联接。

  33. LEFT JOIN为左联接。在查询结果中包含JOIN左侧表中的所有记录,以及JOIN右侧表中匹配的记录。 • RIGHT JOIN为右联接。在查询结果中包含JOIN右侧表中的所有记录,以及JOIN左侧表中匹配的记录。 • FULL JOIN为全联接,在查询结果中包含JOIN两侧所有的匹配和不匹配的记录。 • ON JoinCondition表示联接条件。 • 超联接查询的联接条件在ON短语中给出,而不在WHERE短语中给出,联接类型在FROM短语中给出。

  34. 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.仓库号

  35. 例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.仓库号

  36. 例33 全联接,也就是除满足条件的记录出现在查询结果外,两个表中不满足条件的记录也出现在查询结果中。 • SELECT ck.仓库号,ck.面积,zg.职工号,zg.工资;FROM ck FULL JOIN职工;ON ck.仓库号=zg.仓库号 • JOIN联接格式在连接多个表时应注意其书写方式,JOIN的顺序和ON的顺序是很重要的。 • JOIN和ON的顺序应相反

  37. 5.2.13 集合的并运算 • 1.定义: • 并运算是将两个SELECT语句的查询结果合并成一个查询结果。 • 2.运算符 • UNION • 3.UNION子句遵守的规则: • 不能使用UNION来组合子查询。 • 两个SELECT命令的查询结果中的列数必须相同。 • 两个SELECT查询结果中的对应列必须有相同的数据类型和宽度。 • 只有最后的SELECT中可以包含ORDER BY子句,并且必须按顺序指出所输出的列。

  38. 4.举例: • 例34 查询结果是城市是北京和西安的仓库信息。 • 在SQL语句中不能使用UNION来组合子查询。 • 用UNION运算时,两个SELECT命令的查询结果中的列数必须相同。 • 两个SELECT查询中的对应列必须有相同的数据类型和宽度。

  39. 5.2.14 SOL SELECT的几个特殊选项 • 1.显示部分结果 • SQL命令可以显示部分结果,使用TOP子句。 • 2.将查询结果放到数组中 • 要将查询结果放到数组中,使用INTO ARRAY 短语。 • 3.将查询结果放到临时文件中 • 要将查询结果存放到临时文件中,使用INTO CURSOR短语。 • 4.将查询结果存放到永久表中 • 使用短语INTO DBF | TABLE将查询结果存放到永久表中。

  40. 5.将查询结果存放到文本文件中 • 可以将查询结果存放到文本文件中,使用TO FILE 短语。 • 6.将查询结果直接输出到打印机 • 可以将查询结果直接输出到打印机,使用TO PRINTER子句。 • 例35 显示工资最高的四位职工的信息。 • 例36 显示工资最低的那30%职工的信息。 • 例37 显示工资最高的那30%职工的信息。

  41. 谢谢观看!!

More Related