关系数据库标准语言SQL12课件.ppt

上传人(卖家):晟晟文业 文档编号:4106605 上传时间:2022-11-11 格式:PPT 页数:41 大小:1.32MB
下载 相关 举报
关系数据库标准语言SQL12课件.ppt_第1页
第1页 / 共41页
关系数据库标准语言SQL12课件.ppt_第2页
第2页 / 共41页
关系数据库标准语言SQL12课件.ppt_第3页
第3页 / 共41页
关系数据库标准语言SQL12课件.ppt_第4页
第4页 / 共41页
关系数据库标准语言SQL12课件.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、1职工职工仓库号仓库号职工号职工号工资工资仓库仓库仓库号仓库号城市城市面积面积供应商供应商供应商号供应商号供应商名供应商名地址地址订购单订购单职工号职工号供应商号供应商号订购单号订购单号订购日期订购日期2本章首页本章首页本节首页本节首页上一页上一页(六)分组及计算查询(六)分组及计算查询 SQL语言是完备的,也就是说,只要数据按关系方式存入数据库,语言是完备的,也就是说,只要数据按关系方式存入数据库,就能有构造合适的就能有构造合适的SQL命令把它检索出来。事实上,命令把它检索出来。事实上,SQL不仅具有一不仅具有一般的检索能力,而且还有般的检索能力,而且还有计算方式计算方式的检索,比如检索职工

2、的平均工资、的检索,比如检索职工的平均工资、检索某个仓库中职工的最高工资值等。用于计算检索的函数有:检索某个仓库中职工的最高工资值等。用于计算检索的函数有:1COUNT计数计数2SUM 求和求和3AVG 计算平均值计算平均值4MAX 求最大值求最大值5MIN 求最小值求最小值 这些函数可以用在这些函数可以用在SELECT短语中对查询结果进行计算。短语中对查询结果进行计算。3本章首页本章首页本节首页本节首页上一页上一页例例20找出供应商所在地的找出供应商所在地的数目数目。SELECT COUNTCOUNT(DISTINCT DISTINCT 地址)地址)FROM 供应商;供应商;供应商关系共有三

3、个地址:北京、西安和郑州,所以结果为三。注意,除供应商关系共有三个地址:北京、西安和郑州,所以结果为三。注意,除非对关系中的元组个数进行计数,一般非对关系中的元组个数进行计数,一般 COUNT函数应该使用函数应该使用DISTINCT 。比如:比如:SELECT COUNT(*)FROM 供应商;供应商;将给出供应商关系中的记录数。将给出供应商关系中的记录数。供应商供应商(供应商号供应商号,单位单位,地址地址)例例21求支付的工资总数。求支付的工资总数。SELECT SUMSUM(工资)工资)FROM 职工;职工;结果是:结果是:6160 这个结果是职工关系中工资值这个结果是职工关系中工资值的总

4、和,它并不管是否有重复值。的总和,它并不管是否有重复值。这时若使用命令:这时若使用命令:SELECT SUM(DISTINCT 工资)工资)FROM 职工;职工;将得出错误的结果将得出错误的结果4910 职工职工仓库号仓库号职工号职工号工资工资供应商供应商供应商号供应商号供应商名供应商名地址地址4例例22求北京和上海的仓库职工的工资总和。求北京和上海的仓库职工的工资总和。SELECT SUM(工资)工资)FROM 职工;职工;WHERE 仓库号仓库号 IN(SELECT 仓库号仓库号 FROM 仓库仓库 WHERE 城市城市=“北京北京”OR 城市城市=“上海上海”););结果是结果是:493

5、0 例例23求所有职工的工资都多于求所有职工的工资都多于1210元的仓库的平均面积。元的仓库的平均面积。SELECT AVFAVF(面积)面积)FROM 仓库仓库WHERE 仓库号仓库号 NOT INNOT IN (SELECT 仓库号仓库号 FROM 职工职工 WHERE 工资工资=1210);结果是结果是:36667 本章首页本章首页本节首页本节首页上一页上一页职工职工仓库号仓库号职工号职工号工资工资仓库仓库仓库号仓库号城市城市面积面积5本章首页本章首页本节首页本节首页上一页上一页 这里要注意,以上结果的运算包这里要注意,以上结果的运算包含了尚没有职工的含了尚没有职工的WH4仓库。如果仓库

6、。如果要排除此仓库,语句应该改为:要排除此仓库,语句应该改为:SELECT AVG(面积)面积)FROM 仓库仓库WHERE 仓库号仓库号 NOT IN (SELECT 仓库号仓库号 FROM 职工职工 WHERE 工资工资=2=2;WH1 2 1230WH2 2 1235 结果是结果是:HAVINGHAVING子句总是跟在子句总是跟在GROUP GROUP BYBY子句之后,不可以单独使用。子句之后,不可以单独使用。HAVING子句和子句和WHERE子句不子句不矛盾,在查询中是矛盾,在查询中是先用先用WHERE子句子句限定元组,限定元组,然后进行分组然后进行分组,最后再用,最后再用HAVIN

7、G子句限定分组。子句限定分组。职工职工仓库号仓库号职工号职工号工资工资7本章首页本章首页本节首页本节首页上一页上一页COMPUTE子句的格式子句的格式 GROUP BY子句能完成汇总,但是却不能显示细节。当我们希望在子句能完成汇总,但是却不能显示细节。当我们希望在分组分组的细节的细节后显示汇总结果时,后显示汇总结果时,GROUP BY子句就无能为力了。子句就无能为力了。这时我们可以使用这时我们可以使用COMPUTECOMPUTE子句子句,该子句的功能和,该子句的功能和GROUP BY子句子句有相似之处,即可以完成分组汇总的功能;不同之处是利用有相似之处,即可以完成分组汇总的功能;不同之处是利用

8、COMPUTE子句,子句,汇总结果汇总结果是是附加在细节之后显示附加在细节之后显示的,这样用户既能看到细节,又能看到汇总的,这样用户既能看到细节,又能看到汇总行。行。COMPUTE(),()BY,这里这里只能是用于只能是用于SELECT计算查询的函数计算查询的函数SUMSUM、AVGAVG、MINMIN、MAXMAX和和COUNTCOUNT。COMPUTE子句中的子句中的BYBY子句子句是用来是用来说明分组说明分组的,如果在的,如果在COMPUTE子句中子句中不使用不使用BY子句,则是对整个表进行汇总。子句,则是对整个表进行汇总。需要强调的是如果这里使用需要强调的是如果这里使用BY子句,子句,

9、也必须使用也必须使用ORDER BYORDER BY子句子句,BYBY 子句指出的列必须和子句指出的列必须和ORDER BYORDER BY 子句指出的列顺序相同,但子句指出的列顺序相同,但BY子句的子句的列数可以少于列数可以少于ORDER BY子句的列数。子句的列数。8SELECTDISTINCTFROMWHEREBYGROUPHAVINGBYORDERASCDESC9本章首页本章首页本节首页本节首页上一页上一页比如,比如,ORDER BY子句是:子句是:ORDER BY a,b,cORDER BY a,b,c COMPUTEBy子句的三种形式:子句的三种形式:COMPUTEBy a,b,c

10、 COMPUTEBy a,b COMPUTEBy a例例27列出职工全部记录并计算各仓库的平均工资小计,最后给出全体职工列出职工全部记录并计算各仓库的平均工资小计,最后给出全体职工的平均工资和工资总和(使用的平均工资和工资总和(使用COMPUTEBY)。)。SELECT 仓库号,职工号,工资仓库号,职工号,工资FROM 职工职工ORDER BY ORDER BY 仓库号仓库号COMPUTE AVG(工资),工资),SUM(工资)工资)BY BY 仓库号仓库号COMPUTE AVG(工资),工资),SUM(工资);工资);职工职工仓库号仓库号职工号职工号工资工资10 sum =1230 avg

11、=1232 sum =6160结果是:结果是:WH1 E3 1210 WH1 E7 1250 avg =1230 sum =2460 WH2 E1 1220 WH2 E4 1250 avg =1235 sum =2470 WH3 E6 1230 avg =1230例例28列出职工全部记录并计算全体职工列出职工全部记录并计算全体职工 的平均工资和工资总和(使用的平均工资和工资总和(使用 COMPUTE)。)。SELECT 仓库号,职工号,工资仓库号,职工号,工资FROM 职工职工COMPUTE AVG(工资),工资),SUM(工资);工资);结果是:结果是:WH2 E1 1220WH1 E3 1

12、210WH2 E4 1250WH3 E6 1230WH1 E7 1250 avg =1232 sum =6160 职工职工仓库号仓库号职工号职工号工资工资11职工号职工号供应商号供应商号订购单号订购单号订购日期订购日期E3 E1 E7 E6 E3 E1 E3 E3OR67 OR73 OR76 OR77 OR79 OR80 OR90 OR91S7 S4 S4S4S31998/06/23 1998/07/28 1998/05/251998/06/131998/07/13(七七)利用空值查询利用空值查询 假设在假设在订购单订购单关系中,一名职工正在准备订购单,但尚未选定供应商,这关系中,一名职工正在

13、准备订购单,但尚未选定供应商,这样若把信息存入数据库,则供应商号和订购日期两个属性均为空值,如下表所样若把信息存入数据库,则供应商号和订购日期两个属性均为空值,如下表所示。示。E6 OR77E1 OR80E3 OR90 注意,查询空值时要使用注意,查询空值时要使用IS NULL;而而=NULL是无效的,因为空值不是一是无效的,因为空值不是一个确定的值,所以不能用个确定的值,所以不能用“=”这样的这样的运算符进行比较。运算符进行比较。SELECT*FROM 订购单订购单WHERE 供应商号供应商号 IS NULLIS NULL;结果是结果是(参见上表参见上表):例例29找尚未确定供应商的订购单。

14、找尚未确定供应商的订购单。订购单订购单12表4-4 常用的查询条件查询条件查询条件谓谓 词词比比 较较=、=、=、!=、!、!;确定范围确定范围BETWEEN AND,NOT BETWEEN AND确定集合确定集合IN,NOT IN字符匹配字符匹配LIKE,NOT LIKE%和和 _ _空 值IS NULL,IS NOT NULL多重条件多重条件AND,OREXISTS、NOT EXISTS UNIQUE ALL、ANY13 例例30列出已经确定了供应商的订购单信息。列出已经确定了供应商的订购单信息。E3 S7 OR67 1998/06/28E1 S4 OR73 1998/07/28E7 S4

15、 OR76 1998/05/25E3 S4 OR79 1998/06/13E3 S3 OR91 1998/07/13 SELECT*FROM 订购单订购单WHERE 供应商号供应商号 IS IS NOT NULL;结果是结果是:本章首页本章首页本节首页本节首页上一页上一页订购单订购单职工号职工号供应商号供应商号订购单号订购单号订购日期订购日期14(一)简单查询(一)简单查询(二)连接查询(二)连接查询 (三)嵌套查询(三)嵌套查询 (四)几个特殊算符(四)几个特殊算符 (六)分组及计算查询(六)分组及计算查询 (七)利用空值查询(七)利用空值查询 (五)排序查询(五)排序查询 SQLSQL查询

16、语句查询语句15SELECT 城市城市FROM 仓库仓库WHERE 仓库号仓库号 IN (SELECT 仓库号仓库号 FROM 职工职工 WHERE 职工号职工号 IN (SELECT 职工号职工号 FROM订订 订购单订购单 WHERE 供应商号供应商号 IN (SELECT 供应商号供应商号 FROM 供应商供应商 WHERE 地址地址=“北京北京”);结果是结果是:北京北京 上海上海(八)多层嵌套查询(八)多层嵌套查询 例例3131找出找出哪些城市哪些城市的仓库向的仓库向北京北京的的供应商供应商发出了发出了订购单订购单。这里我们所要求的信息出自仓库关系,但相关条件与订购单关系有关,为这里

17、我们所要求的信息出自仓库关系,但相关条件与订购单关系有关,为此又要涉及到职工关系和订购单关系和此又要涉及到职工关系和订购单关系和供应商供应商关系,也就是说这个查询将涉及关系,也就是说这个查询将涉及到四个关系。到四个关系。事实上,我们希望检索的是仓库元组,最后这个订购单元组要对应一个地事实上,我们希望检索的是仓库元组,最后这个订购单元组要对应一个地址属性值为址属性值为“北京北京”的供应商元组。完成这个查询的的供应商元组。完成这个查询的SQL命令是:命令是:职工职工仓库号仓库号职工号职工号工资工资仓库仓库仓库号仓库号城市城市面积面积供应商供应商供应商号供应商号供应商名供应商名地址地址订购单订购单职

18、工号职工号供应商号供应商号订购单号订购单号订购日期订购日期16例例32给出有给出有北京仓库订购单北京仓库订购单的的北京供应商北京供应商的名称。的名称。SELECT 供应商名供应商名FROM 供应商供应商WHERE 地址地址=“北京北京”ANDAND 供应商号供应商号 ININ (SELECT 供应商号供应商号 FROM 订购单订购单 WHERE 职工号职工号 IN (SELECT 职工号职工号 FROM 职工职工 WHERE 仓库号仓库号 IN (SELECT 仓库号仓库号 FROM 仓库仓库 WHERE 城市城市=“北京北京”);结果是:结果是:爱华电子厂爱华电子厂华通电子公司华通电子公司

19、职工职工仓库号仓库号职工号职工号工资工资仓库仓库仓库号仓库号城市城市面积面积供应商供应商供应商号供应商号供应商名供应商名地址地址订购单订购单职工号职工号供应商号供应商号订购单号订购单号订购日期订购日期17(九)别名和自连接查询(九)别名和自连接查询 SELECT 供应商名供应商名FROM 供应商,订购单,职工,仓库供应商,订购单,职工,仓库WHERE 地址地址=“北京北京”AND 仓库仓库.城市城市=“北京北京”AND 供应商供应商.供应商号供应商号=订购单订购单.供应商号供应商号 AND 订购单订购单.职工号职工号=职工职工.职工号职工号 AND 订购单订购单.仓库号仓库号=仓库仓库.仓库号

20、;仓库号;例例33用用连接操作连接操作完成上例的查询。完成上例的查询。这是一个基于多个关系的连接操作。一般能用嵌套查询完成的操作,这是一个基于多个关系的连接操作。一般能用嵌套查询完成的操作,都能用等价的连接查询完成;但是,反之却不一定。一般当都能用等价的连接查询完成;但是,反之却不一定。一般当查询的数据查询的数据出出自多个关系时,就不适合用嵌套查询自多个关系时,就不适合用嵌套查询,能用连接查询。能用连接查询。职工职工仓库号仓库号职工号职工号工资工资仓库仓库仓库号仓库号城市城市面积面积供应商供应商供应商号供应商号供应商名供应商名地址地址订购单订购单职工号职工号供应商号供应商号订购单号订购单号订购

21、日期订购日期18(九)别名和自连接查询(九)别名和自连接查询 例例33用用连接操作连接操作完成上例的查询。完成上例的查询。在连接操作中,经常需要使用关系名作前缀,有时这样显得很麻烦。因此,在连接操作中,经常需要使用关系名作前缀,有时这样显得很麻烦。因此,SQL允许在允许在FROM短语中为关系名定义别名,格式为:短语中为关系名定义别名,格式为:比如,刚才的连接比如,刚才的连接语句可以写为:语句可以写为:SELECT 供应商名供应商名FROM 供应商供应商 S,订购单订购单 P,职工职工 E,仓库仓库 WWHERE 地址地址=“北京北京”AND W.城市城市=“北京北京”AND S.供应商号供应商

22、号=P.供应商号供应商号 AND P.职工号职工号=E.职工号职工号 AND E.仓库号仓库号=W.仓库号仓库号 职工职工仓库号仓库号职工号职工号工资工资仓库仓库仓库号仓库号城市城市面积面积供应商供应商供应商号供应商号供应商名供应商名地址地址订购单订购单职工号职工号供应商号供应商号订购单号订购单号订购日期订购日期19 在这个例子中,别名并不是必须的,但是在关系的在这个例子中,别名并不是必须的,但是在关系的自连接操作自连接操作中,别名就中,别名就是必不可少的了。是必不可少的了。SQL不仅可以对多个关系实行连接操作,也可以将同一关系不仅可以对多个关系实行连接操作,也可以将同一关系与其自身进行连接,

23、这种连接就称为与其自身进行连接,这种连接就称为自连接自连接。在可以进行这种自连接操作的关。在可以进行这种自连接操作的关系上,实际存在着一种特殊的递归联系,即关系中的一些元组,根据出自同一系上,实际存在着一种特殊的递归联系,即关系中的一些元组,根据出自同一个值域的两个不同的属性,可以与另外一些元组有一种对应关系(一对多的联个值域的两个不同的属性,可以与另外一些元组有一种对应关系(一对多的联系)。系)。本章首页本章首页本节首页本节首页上一页上一页为了说明自连接,我们假设有一个雇员关系:为了说明自连接,我们假设有一个雇员关系:雇员(雇员号,雇员姓名,经理)雇员(雇员号,雇员姓名,经理)其中雇员号和经

24、理两个属性出自同一个值域,同一元组的这两个属性值是其中雇员号和经理两个属性出自同一个值域,同一元组的这两个属性值是“上、下级上、下级”关系。侧图说明了雇员关系和它的一个实例。关系。侧图说明了雇员关系和它的一个实例。20雇员姓名雇员姓名雇员号雇员号经理经理1:n雇员雇员雇员号雇员号 雇员姓名雇员姓名经理经理E3 E4 E6 E8赵涌赵涌 钱潮钱潮 孙洁孙洁 李渌李渌E3 E3 E3 E6例例34根据雇员关系列出上一级经理及其职员(被其领导)的清单。根据雇员关系列出上一级经理及其职员(被其领导)的清单。SELECT S.雇员姓名,雇员姓名,“领导领导”,E.雇员姓名;雇员姓名;FROM 雇员雇员

25、S,雇员雇员 EWHERE S.雇员号雇员号=E.经理经理;结果是:结果是:赵涌赵涌 领导领导 钱潮钱潮 赵涌赵涌 领导领导 孙洁孙洁 孙洁孙洁 领导领导 李渌李渌 这里通过定义别名形成了两个逻辑关系,一个是经理关系这里通过定义别名形成了两个逻辑关系,一个是经理关系S,一个是职员一个是职员关系关系E,结果在关系结果在关系S和和E上的连接实现了我们的检索要求。另外,在上的连接实现了我们的检索要求。另外,在SELECT短语中可以有常量,如这里的短语中可以有常量,如这里的“领导领导”。本章首页本章首页本节首页本节首页上一页上一页21(十)内、外层互相关嵌套查询(十)内、外层互相关嵌套查询 事实上,有

26、时也需要内、外层互相关的查询。事实上,有时也需要内、外层互相关的查询。比如,我们在订购单关系中加入一个新字段比如,我们在订购单关系中加入一个新字段总金额总金额,说明完成该订购单所,说明完成该订购单所应付出的总金额数,新的订购单关系如下表所示。应付出的总金额数,新的订购单关系如下表所示。职工号职工号 供应商号供应商号 订购单号订购单号 订购日期订购日期总金额总金额E3 E1 E7 E6 E3 E1 E3 E3S7 S4 S4 S6 S4 S6 S6 S3OR67 OR73 OR76 OR77 OR79 OR80 OR90 OR911998/06/23 1998/07/28 1998/05/25

27、1998/06/29 1998/06/13 1998/07/29 1998/06/22 1998/07/13 35000 12000 7250 6000 30050 25600 7690 12560订购单订购单例例35列出每个职工经手的具有列出每个职工经手的具有最高总金额最高总金额的订购单信息。的订购单信息。SELECT out.职工号职工号,out.供应商号供应商号,out.订购单号订购单号,out.订购日期订购日期,out.总金额总金额FROM 订购单订购单 outoutWHERE 总金额总金额=(SELECT MAX(总金额)总金额)FROM 订购单订购单 innerinner WHER

28、E out.职工号职工号=inner.职工号职工号););22 在这个查询中,外层查询和内层查询使用同一个关系,给它们分别指定在这个查询中,外层查询和内层查询使用同一个关系,给它们分别指定别名别名out和和inner。外层查询提供外层查询提供out关系中的每个元组的职工号值给内层查询关系中的每个元组的职工号值给内层查询使用;内层查询利用这个职工号值,确定该职工经手的具的最高总金额的订使用;内层查询利用这个职工号值,确定该职工经手的具的最高总金额的订购单的总金额;随后外层查询再根据购单的总金额;随后外层查询再根据out关系的同一元组的总金额值与该总金关系的同一元组的总金额值与该总金额值进行比较,

29、如果相等,则该元组被选择。额值进行比较,如果相等,则该元组被选择。(十一)超(十一)超(OUT)连接查询连接查询 在新的在新的SQL标准中还支持两个标准中还支持两个新的关系连接运算符新的关系连接运算符,它们与原来我们所,它们与原来我们所了解的了解的等值连接等值连接和和自然连接自然连接不同。原来的连接是只有满足连接条件,相应的不同。原来的连接是只有满足连接条件,相应的结果才会出现在结果表中;而这两个新的连接运算是,首先保证一个表中满结果才会出现在结果表中;而这两个新的连接运算是,首先保证一个表中满足条件的元组都在结果表中,然后将满足连接条件的元组与另一表的元组进足条件的元组都在结果表中,然后将满

30、足连接条件的元组与另一表的元组进行连接,不满足连接条件的则将来自另一表的属性值置为空值。两个超连接行连接,不满足连接条件的则将来自另一表的属性值置为空值。两个超连接运算符的含义见下表。运算符的含义见下表。运算符运算符含义含义*=在结果表中包含第一个表中满足条件的所有记录;如果是在连接条件在结果表中包含第一个表中满足条件的所有记录;如果是在连接条件上匹配的元组,则第二个表返回相应值,否则第二个表返回空值。上匹配的元组,则第二个表返回相应值,否则第二个表返回空值。=*在结果表中包含第二个表中满足条件的所有记录;如果是在连条件上在结果表中包含第二个表中满足条件的所有记录;如果是在连条件上匹配的元组,

31、则第一个表返回相应值,否则第一个表返回空值。匹配的元组,则第一个表返回相应值,否则第一个表返回空值。23则结果是:则结果是:WH1 北京北京 370 E3 1210 WH1 北京北京 370 E7 1250 WH2 上海上海 500 E1 1220 WH2 上海上海 500 E4 1250 WH3 广州广州 200 E6 1230 如果是如果是左部超连接:左部超连接:SELECT 仓库仓库.仓库号仓库号,城市城市,面积面积,职工号职工号,工资工资 FROM 仓库仓库,职工职工 WHERE 仓库仓库.仓库号仓库号*=职工职工.仓库号;仓库号;则结果是:则结果是:WH1 北京北京 370 E3 1

32、210 WH1 北京北京 370 E7 1250 WH2 上海上海 500 E1 1220 WH2 上海上海 500 E4 1250 WH3 广州广州 200 E6 1230 WH4 武汉武汉 400 如果是如果是自然连接自然连接:SELECT 仓库仓库.仓库号仓库号,城市城市,面积面积,职工号职工号,工资工资 FROM 仓库仓库,职工职工 WHERE 仓库仓库.仓库号仓库号=职工职工.仓库号;仓库号;设有仓库和职工两个关系设有仓库和职工两个关系职工职工仓库号仓库号职工号职工号工资工资仓库仓库仓库号仓库号城市城市面积面积24作业作业 4.4 p1034.4 p103学生(学号,姓名,性别,年龄

33、,所在系)学生(学号,姓名,性别,年龄,所在系)课程(课程号,课程名,学分)课程(课程号,课程名,学分)选课(学号,课程号,成绩)选课(学号,课程号,成绩)UPDATE 选课选课 SET 成绩成绩 0 FROM 学生,课程,选课学生,课程,选课 WHERE (选课选课.学号学号 学生学生.学号学号 AND 选课选课.课程号课程课程号课程.课程号课程号)AND(姓名姓名LIKE 刘刘*AND 课程名课程名高等数学高等数学)UPDATE 学生信息学生信息 INNER JOIN(课程课程 INNER JOIN 成绩成绩 ON 课程课程.课程号课程号=成绩成绩.课程号课程号)ON 学生信息学生信息.学

34、号学号=成绩成绩.学号学号 SET 成绩成绩.期末成绩期末成绩=0 WHERE(学生信息学生信息.姓名姓名 Like“刘刘*”)AND(课程课程.课程名课程名 Like“高等数学高等数学”);254.7 嵌入式嵌入式 SQL SQL语言提供了两种工作方式:交互式语言提供了两种工作方式:交互式SQL、嵌入式嵌入式 SQL 前面介绍的前面介绍的SQL,是作为独立的数据语言可以直接以交互的方式使用是作为独立的数据语言可以直接以交互的方式使用的,除此之外,的,除此之外,SQL 还可以作为子语言嵌入在宿主语言中使用,这里还可以作为子语言嵌入在宿主语言中使用,这里所说的宿主语言就是指我们常见的高级程序设计

35、语言,如所说的宿主语言就是指我们常见的高级程序设计语言,如C、C+、Java等等。下边主要介绍等等。下边主要介绍SQL作为子语言嵌入在宿主语言中使用的一作为子语言嵌入在宿主语言中使用的一般方法。般方法。把把SQL嵌入到宿主语言中使用必须要解决以下三个方面的问题:嵌入到宿主语言中使用必须要解决以下三个方面的问题:1.嵌入识别问题嵌入识别问题。宿主语言的编译程序不能识别。宿主语言的编译程序不能识别SQL语句,所以首要的问语句,所以首要的问 题就是要解决如何区分宿主语言的语句和题就是要解决如何区分宿主语言的语句和SQL语句。语句。2.宿主语言与宿主语言与SQL语言的语言的数据交互问题数据交互问题。S

36、QL语句的查询结果必须能够交语句的查询结果必须能够交 给宿主语言处理,宿主语言的数据也要能够交给给宿主语言处理,宿主语言的数据也要能够交给SQL语句使用。语句使用。3.语言的语言的单记录与单记录与SQL的多记录的问题的多记录的问题。宿主语言一般一次处理一条记录,。宿主语言一般一次处理一条记录,而而SQL常常处理的是常常处理的是记录(元组)的集合记录(元组)的集合,这个矛盾必须解决。,这个矛盾必须解决。26 宿主语言的编译系统不能识别宿主语言的编译系统不能识别SQL语句。解决这个问题的一般方语句。解决这个问题的一般方法是,法是,为为SQL语句加一个特殊的前缀语句加一个特殊的前缀,在用宿主语言的编

37、译系统编译,在用宿主语言的编译系统编译源程序之前,首先由预编译系统将源程序之前,首先由预编译系统将SQL语句转换为宿主语言的合法函语句转换为宿主语言的合法函数调用。数调用。常用的前缀格式是:常用的前缀格式是:EXEC SQLEXEC SQL 如如:EXEC SQLEXEC SQL INSERT INTO 职工职工 VALUES(“WH8”,“E20”,1560););下图示意了嵌入了下图示意了嵌入了SQL的应用程序的执行过程。嵌入了的应用程序的执行过程。嵌入了SQL语句的应用程语句的应用程序,首先要经过预编译转换成宿主语言源程序,接着由宿主语言的编译系统序,首先要经过预编译转换成宿主语言源程序

38、,接着由宿主语言的编译系统产生中间代码,然后根据中间代码、宿主语言函数库和产生中间代码,然后根据中间代码、宿主语言函数库和SQL函数据库连接产函数据库连接产生可执行程序,执行程序时由生可执行程序,执行程序时由SQL语句通过语句通过DBMS访问数据库。访问数据库。应用程序应用程序预编译预编译编编 译译连连 接接执行执行应用程序应用程序DBMS源程序源程序SQL库函数库函数宿主语言宿主语言库函数库函数中间代码中间代码可执行程序可执行程序数据库数据库(一)嵌入识别与预编译(一)嵌入识别与预编译 27(二)数据通信区与主变量(二)数据通信区与主变量 在嵌入使用在嵌入使用SQL语句的程序中,一般在程序的

39、前部都要有一条:语句的程序中,一般在程序的前部都要有一条:INCLUDE SQLCA 这里的这里的SQLCA即是即是SQL与宿主语言的通信区与宿主语言的通信区,它类似于结构变量,它类似于结构变量,各个分量分别反映各个分量分别反映SQL语句的各种执行状态。语句的各种执行状态。负责负责 SQL 语句与宿主语言语句语句与宿主语言语句数据交换的是主数据交换的是主(Host)变量变量,这,这种变量既可以用在种变量既可以用在SQL语句中,又可以用在宿主语言语句中。语句中,又可以用在宿主语言语句中。本章首页本章首页本节首页本节首页上一页上一页这种变量必须在这种变量必须在DECLARE SECTION中说明,

40、说明的格式是:中说明,说明的格式是:BEGIN DECLARE SECTION 主变量说明主变量说明 END DECLARE SECTION 28 经以上方式说明的经以上方式说明的主变量主变量可以在可以在SQL语句中使用,只是用在语句中使用,只是用在SQL语句中语句中时,必须冠以时,必须冠以冒号前缀冒号前缀,如:,如:UPDATE 仓库仓库 SET 面积面积=:wh_area WHERE 仓库号仓库号=:whnumb;主变量用在宿主语言语句中时,和一般程序变量的使用方法是一样的。主变量用在宿主语言语句中时,和一般程序变量的使用方法是一样的。本章首页本章首页本节首页本节首页上一页上一页下面是在下

41、面是在C语言程序中说明主变量的例子:语言程序中说明主变量的例子:EXEC SQL BEGIN DECLARE SECTION char whnumb5 char city12 int wh_areaEXEC SQL END DECLARE SECTION;29(三)游标(三)游标(Cursor)宿主语言一般只能在单记录方式下工作,即一次处理一个记录。而宿主语言一般只能在单记录方式下工作,即一次处理一个记录。而SQL语语句的查询结果常常是一张表,它包含多个记录,为此需要用句的查询结果常常是一张表,它包含多个记录,为此需要用 游标游标(Cursor)作为桥梁做一些特殊处理作为桥梁做一些特殊处理。与

42、。与游标有关的命令共有四条:游标有关的命令共有四条:DECLARE CURSOROPENFETCHCLOSE 通过下面的介绍我们会发现游标类似于文件的概念,游标有时的含义是整通过下面的介绍我们会发现游标类似于文件的概念,游标有时的含义是整个个“文件文件”,有时的含义是指向某个记录的指针。下面我们通过具体的几条,有时的含义是指向某个记录的指针。下面我们通过具体的几条语句来理解游标的概念。语句来理解游标的概念。定义游标的定义游标的DECLARE CURSOR语句的格式是:语句的格式是:EXEC SQL DECLARE CURSOR FOR ;该语句用该语句用定义一个游标(文件),它的内容是定义一个

43、游标(文件),它的内容是:的查询结果(多个记录组成的表)。的查询结果(多个记录组成的表)。30启动或打开游标(文件)的语句是启动或打开游标(文件)的语句是OPEN,其格式是:其格式是:EXEC SQL OPEN ;该语句的功能是打开或启动指出的游标。该语句的功能是打开或启动指出的游标。该游标名是用该游标名是用DECLAER CURSOR语句已经定义好的。语句已经定义好的。执行该语句意味着执行在执行该语句意味着执行在DECLARE CURSOR语句中定义的语句中定义的SELECT查查询,并使询,并使游标(指针)指向查询结果的第一条记录游标(指针)指向查询结果的第一条记录。31读记录的读记录的FE

44、TCH语句语句的格式是:的格式是:EXEC SQL FETCH INTO :,:;该语句的功能是取出游标所指该语句的功能是取出游标所指记录记录并并送入主变量送入主变量,同时向前拨动游标,同时向前拨动游标,使游标指向下一条记录。使游标指向下一条记录。这里的游标必须是已经说明并打开了的,这里的游标必须是已经说明并打开了的,INTO 后的主变量要与在后的主变量要与在DECLARE CURSOR中中SELECT的字段相对应。的字段相对应。当查询当查询结果为空,或游标已经指向查询结果集的结尾时,结果为空,或游标已经指向查询结果集的结尾时,SQLCA.sqlcode的代码的代码将为将为-1,说明游标没有指

45、向新记录。,说明游标没有指向新记录。关闭游标(文件)的关闭游标(文件)的CLOSE语句的格式是:语句的格式是:EXEC SQL CLOSE;该语句的功能是关闭或停止指出的游标。该语句的功能是关闭或停止指出的游标。与程序设计语言中的文件相对照,与程序设计语言中的文件相对照,DECLARE CURSOR 相当于说明了一相当于说明了一个文件,个文件,OPEN相当于打开文件,相当于打开文件,FETCH相当于读一条记录,相当于读一条记录,CLOSE相当相当于关闭文件。于关闭文件。EXEC SQL DECLARE CURSOR FOR ;324.7.3 嵌入式嵌入式SQL的使用技术的使用技术1.不涉及游标

46、的不涉及游标的SQL DML 语句语句【例例4.43】给出在给出在C语言中不涉及游标的嵌入式语言中不涉及游标的嵌入式SQL DML 语句的使用语句的使用 例子。例子。(1)在学生表中,根据共享变量)在学生表中,根据共享变量sno的值查询学生的姓名、性别和年龄。的值查询学生的姓名、性别和年龄。EXEC SQL SELECT 姓名,姓名,性别,性别,年龄年龄 INTO :name,:sex,:age FROM 学生学生 WHERE 学号学号=:sno;这里,这里,sno、name、sex、age都是共享变量,已在主程序中定义,都是共享变量,已在主程序中定义,并用并用SQL的的DECLARE语句说明

47、,在使用时加上语句说明,在使用时加上“:”作为标识,作为标识,以区别数据库中的变量。以区别数据库中的变量。主程序中已先赋值给主程序中已先赋值给sno,SELECT的查询的查询结果(结果(一条记录一条记录)送到共享变量)送到共享变量name、sex、age中。中。33(2)在学生表中插入)在学生表中插入一条新纪录一条新纪录,数据已在相关的共享变量中。,数据已在相关的共享变量中。EXEC SQL INSERT 学生(学号,姓名,性别,年龄)学生(学号,姓名,性别,年龄)VALUES(:sno,:name,:sex,:age);如果某个属性值未给出,则自动置为空值。如果某个属性值未给出,则自动置为空

48、值。(3)从选课表中删除)从选课表中删除一个学生一个学生的各个成绩,学号在共享变量的各个成绩,学号在共享变量sno中。中。EXEC SQL DELETE FROM 选课选课 WHERE 学号学号=:sno;(4)将所有学生的)将所有学生的“MATHS”课程成绩增加某个值(在共享变量课程成绩增加某个值(在共享变量a中)。中)。EXEC SQL UPDATE 选课选课 SET 成绩成绩=成绩成绩+:a WHERE 课程号课程号 IN (SELECT 课程号课程号 FROM 课程课程 WHERE 课程名课程名=MATHS);342.涉及游标的涉及游标的SQL DML 语句语句 当当SELECT语句的

49、查询结果为语句的查询结果为多个元组多个元组时,宿主语言程序无法时,宿主语言程序无法使用,所以一定要有游标机制将多个元组一次一个地传送给宿使用,所以一定要有游标机制将多个元组一次一个地传送给宿主语言程序进行处理。具体有以下步骤:主语言程序进行处理。具体有以下步骤:先用游标定义语句定义先用游标定义语句定义一个游标一个游标和某个和某个SELECT语句对应。语句对应。游标打开后,处于活动状态,此时游标指向查询结果集的游标打开后,处于活动状态,此时游标指向查询结果集的第一第一个元组前个元组前。每执行一次每执行一次FETCH语句,游标指向下一个元组,并把其值送到语句,游标指向下一个元组,并把其值送到共享变

50、量,供程序处理,如此反复,直到所有查询结果处理完共享变量,供程序处理,如此反复,直到所有查询结果处理完毕。毕。最后关闭游标;关闭的游标也可以重新打开,与新的查询结果最后关闭游标;关闭的游标也可以重新打开,与新的查询结果集相对应,在没有打开前不能使用。集相对应,在没有打开前不能使用。35【例例4.44】在教学数据库中检索成绩不及格的学生信息(学号,姓名,在教学数据库中检索成绩不及格的学生信息(学号,姓名,课程,成绩),下面是该查询的一个课程,成绩),下面是该查询的一个C函数。函数。#define NO_MORE_TUPLES !(strcmp(SQLSTATE,“02000”)Void sel(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(关系数据库标准语言SQL12课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|