版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1職工倉庫號(hào)職工號(hào)工資倉庫倉庫號(hào)城市面積供應(yīng)商供應(yīng)商號(hào)供應(yīng)商名地址訂購單職工號(hào)供應(yīng)商號(hào)訂購單號(hào)訂購日期1職工倉庫號(hào)職工號(hào)工資倉庫倉庫號(hào)城市面積供應(yīng)商供應(yīng)商號(hào)供應(yīng)商2本章首頁本節(jié)首頁上一頁(六)分組及計(jì)算查詢 SQL語言是完備的,也就是說,只要數(shù)據(jù)按關(guān)系方式存入數(shù)據(jù)庫,就能有構(gòu)造合適的SQL命令把它檢索出來。事實(shí)上,SQL不僅具有一般的檢索能力,而且還有計(jì)算方式的檢索,比如檢索職工的平均工資、檢索某個(gè)倉庫中職工的最高工資值等。用于計(jì)算檢索的函數(shù)有:1COUNT計(jì)數(shù)2SUM 求和3AVG 計(jì)算平均值4MAX 求最大值5MIN 求最小值 這些函數(shù)可以用在SELECT短語中對(duì)查詢結(jié)果進(jìn)行計(jì)算。 2本章
2、首頁本節(jié)首頁上一頁(六)分組及計(jì)算查詢 3本章首頁本節(jié)首頁上一頁例20找出供應(yīng)商所在地的數(shù)目。 SELECT COUNT(DISTINCT 地址)FROM 供應(yīng)商; 供應(yīng)商關(guān)系共有三個(gè)地址:北京、西安和鄭州,所以結(jié)果為三。注意,除非對(duì)關(guān)系中的元組個(gè)數(shù)進(jìn)行計(jì)數(shù),一般 COUNT函數(shù)應(yīng)該使用DISTINCT 。 比如: SELECT COUNT(*) FROM 供應(yīng)商; 將給出供應(yīng)商關(guān)系中的記錄數(shù)。 供應(yīng)商(供應(yīng)商號(hào), 單位, 地址)例21求支付的工資總數(shù)。 SELECT SUM(工資) FROM 職工; 結(jié)果是:6160 這個(gè)結(jié)果是職工關(guān)系中工資值的總和,它并不管是否有重復(fù)值。這時(shí)若使用命令:
3、SELECT SUM(DISTINCT 工資) FROM 職工; 將得出錯(cuò)誤的結(jié)果4910 職工倉庫號(hào)職工號(hào)工資供應(yīng)商供應(yīng)商號(hào)供應(yīng)商名地址3本章首頁本節(jié)首頁上一頁例20找出供應(yīng)商所在地的數(shù)目。 S4例22求北京和上海的倉庫職工的工資總和。 SELECT SUM(工資)FROM 職工;WHERE 倉庫號(hào) IN(SELECT 倉庫號(hào) FROM 倉庫 WHERE 城市=“北京” OR 城市=“上?!保?; 結(jié)果是: 4930 例23求所有職工的工資都多于1210元的倉庫的平均面積。 SELECT AVF(面積)FROM 倉庫WHERE 倉庫號(hào) NOT IN (SELECT 倉庫號(hào) FROM 職工 WH
4、ERE 工資=1210); 結(jié)果是:36667 本章首頁本節(jié)首頁上一頁職工倉庫號(hào)職工號(hào)工資倉庫倉庫號(hào)城市面積4例22求北京和上海的倉庫職工的工資總和。 SELECT 5本章首頁本節(jié)首頁上一頁 這里要注意,以上結(jié)果的運(yùn)算包含了尚沒有職工的WH4倉庫。如果要排除此倉庫,語句應(yīng)該改為: SELECT AVG(面積)FROM 倉庫WHERE 倉庫號(hào) NOT IN (SELECT 倉庫號(hào) FROM 職工 WHERE 工資=2; WH1 2 1230WH2 2 1235 結(jié)果是: HAVING子句總是跟在GROUP BY子句之后,不可以單獨(dú)使用。 HAVING子句和WHERE子句不矛盾,在查詢中是先用WH
5、ERE子句限定元組,然后進(jìn)行分組,最后再用HAVING子句限定分組。 職工倉庫號(hào)職工號(hào)工資6本章首頁本節(jié)首頁上一頁例25求每個(gè)倉庫的職工平均工資。 7本章首頁本節(jié)首頁上一頁COMPUTE子句的格式 GROUP BY子句能完成匯總,但是卻不能顯示細(xì)節(jié)。當(dāng)我們希望在分組的細(xì)節(jié)后顯示匯總結(jié)果時(shí),GROUP BY子句就無能為力了。 這時(shí)我們可以使用COMPUTE子句,該子句的功能和GROUP BY子句有相似之處,即可以完成分組匯總的功能;不同之處是利用COMPUTE子句,匯總結(jié)果是附加在細(xì)節(jié)之后顯示的,這樣用戶既能看到細(xì)節(jié),又能看到匯總行。COMPUTE(),()BY, 這里只能是用于SELECT計(jì)算
6、查詢的函數(shù)SUM、AVG、MIN、MAX和COUNT。 COMPUTE子句中的BY子句是用來說明分組的,如果在COMPUTE子句中不使用BY子句,則是對(duì)整個(gè)表進(jìn)行匯總。 需要強(qiáng)調(diào)的是如果這里使用BY子句,也必須使用ORDER BY子句,BY 子句指出的列必須和ORDER BY 子句指出的列順序相同,但BY子句的列數(shù)可以少于ORDER BY子句的列數(shù)。7本章首頁本節(jié)首頁上一頁COMPUTE子句的格式 8SELECTDISTINCT*,FROM,WHEREBYGROUP,HAVINGBYORDERASCDESC ;8SELECTDISTINCT*,FROM,9本章首頁本節(jié)首頁上一頁比如,ORDER
7、 BY子句是:ORDER BY a,b,c COMPUTEBy子句的三種形式: COMPUTEBy a,b,c COMPUTEBy a,b COMPUTEBy a例27列出職工全部記錄并計(jì)算各倉庫的平均工資小計(jì),最后給出全體職工的平均工資和工資總和(使用COMPUTEBY)。 SELECT 倉庫號(hào),職工號(hào),工資FROM 職工ORDER BY 倉庫號(hào)COMPUTE AVG(工資),SUM(工資)BY 倉庫號(hào)COMPUTE AVG(工資),SUM(工資); 職工倉庫號(hào)職工號(hào)工資9本章首頁本節(jié)首頁上一頁比如,ORDER BY子句是:OR10 sum = 1230 avg = 1232 sum = 6
8、160結(jié)果是: 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列出職工全部記錄并計(jì)算全體職工 的平均工資和工資總和(使用 COMPUTE)。 SELECT 倉庫號(hào),職工號(hào),工資FROM 職工COMPUTE AVG(工資),SUM(工資); 結(jié)果是:WH2 E1 1220WH1 E3 1210WH2 E4 1250WH3 E6 1230WH1 E7 1250 avg = 1232 sum = 6160 職工倉庫
9、號(hào)職工號(hào)工資10 sum 11職工號(hào)供應(yīng)商號(hào)訂購單號(hào)訂購日期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(七) 利用空值查詢 假設(shè)在訂購單關(guān)系中,一名職工正在準(zhǔn)備訂購單,但尚未選定供應(yīng)商,這樣若把信息存入數(shù)據(jù)庫,則供應(yīng)商號(hào)和訂購日期兩個(gè)屬性均為空值,如下表所示。 E6 OR77E1 OR80E3 OR90 注意,查詢空值時(shí)要使用IS NULL;而=NULL是無效的,因?yàn)榭罩挡皇且粋€(gè)確定的值
10、,所以不能用“=”這樣的運(yùn)算符進(jìn)行比較。 SELECT *FROM 訂購單WHERE 供應(yīng)商號(hào) IS NULL; 結(jié)果是(參見上表):例29找尚未確定供應(yīng)商的訂購單。 訂購單11職工號(hào)供應(yīng)商號(hào)訂購單號(hào)訂購日期E3 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、ANY12表4-4 常用的查詢條件查詢條件謂 詞比 1
11、3 例30列出已經(jīng)確定了供應(yīng)商的訂購單信息。 E3 S7 OR67 1998/06/28E1 S4 OR73 1998/07/28E7 S4 OR76 1998/05/25E3 S4 OR79 1998/06/13E3 S3 OR91 1998/07/13 SELECT *FROM 訂購單WHERE 供應(yīng)商號(hào) IS NOT NULL; 結(jié)果是:本章首頁本節(jié)首頁上一頁訂購單職工號(hào)供應(yīng)商號(hào)訂購單號(hào)訂購日期13 例30列出已經(jīng)確定了供應(yīng)商的訂購單信息。 E3 14(一)簡單查詢(二)連接查詢 (三)嵌套查詢 (四)幾個(gè)特殊算符 (六)分組及計(jì)算查詢 (七)利用空值查詢 (五)排序查詢 SQL查詢語句
12、14(一)簡單查詢(二)連接查詢 (三)嵌套查詢 (四)幾個(gè)15SELECT 城市FROM 倉庫WHERE 倉庫號(hào) IN (SELECT 倉庫號(hào) FROM 職工 WHERE 職工號(hào) IN (SELECT 職工號(hào) FROM訂 訂購單 WHERE 供應(yīng)商號(hào) IN (SELECT 供應(yīng)商號(hào) FROM 供應(yīng)商 WHERE 地址= “北京”); 結(jié)果是: 北京 上海 (八)多層嵌套查詢 例31找出哪些城市的倉庫向北京的供應(yīng)商發(fā)出了訂購單。 這里我們所要求的信息出自倉庫關(guān)系,但相關(guān)條件與訂購單關(guān)系有關(guān),為此又要涉及到職工關(guān)系和訂購單關(guān)系和供應(yīng)商關(guān)系,也就是說這個(gè)查詢將涉及到四個(gè)關(guān)系。 事實(shí)上,我們希望檢索
13、的是倉庫元組,最后這個(gè)訂購單元組要對(duì)應(yīng)一個(gè)地址屬性值為“北京”的供應(yīng)商元組。完成這個(gè)查詢的SQL命令是: 職工倉庫號(hào)職工號(hào)工資倉庫倉庫號(hào)城市面積供應(yīng)商供應(yīng)商號(hào)供應(yīng)商名地址訂購單職工號(hào)供應(yīng)商號(hào)訂購單號(hào)訂購日期15SELECT 城市結(jié)果是:(八)多層嵌套查詢 例3116例32給出有北京倉庫訂購單的北京供應(yīng)商的名稱。 SELECT 供應(yīng)商名FROM 供應(yīng)商WHERE 地址=“北京” AND 供應(yīng)商號(hào) IN (SELECT 供應(yīng)商號(hào) FROM 訂購單 WHERE 職工號(hào) IN (SELECT 職工號(hào) FROM 職工 WHERE 倉庫號(hào) IN (SELECT 倉庫號(hào) FROM 倉庫 WHERE 城市=
14、“北京”); 結(jié)果是:愛華電子廠華通電子公司 職工倉庫號(hào)職工號(hào)工資倉庫倉庫號(hào)城市面積供應(yīng)商供應(yīng)商號(hào)供應(yīng)商名地址訂購單職工號(hào)供應(yīng)商號(hào)訂購單號(hào)訂購日期16例32給出有北京倉庫訂購單的北京供應(yīng)商的名稱。 SEL17(九)別名和自連接查詢 SELECT 供應(yīng)商名FROM 供應(yīng)商,訂購單,職工,倉庫WHERE 地址= “北京” AND 倉庫.城市= “北京” AND 供應(yīng)商.供應(yīng)商號(hào)=訂購單.供應(yīng)商號(hào) AND 訂購單.職工號(hào)=職工.職工號(hào) AND 訂購單.倉庫號(hào)=倉庫.倉庫號(hào); 例33用連接操作完成上例的查詢。 這是一個(gè)基于多個(gè)關(guān)系的連接操作。一般能用嵌套查詢完成的操作,都能用等價(jià)的連接查詢完成;但是,
15、反之卻不一定。一般當(dāng)查詢的數(shù)據(jù)出自多個(gè)關(guān)系時(shí),就不適合用嵌套查詢, 能用連接查詢。 職工倉庫號(hào)職工號(hào)工資倉庫倉庫號(hào)城市面積供應(yīng)商供應(yīng)商號(hào)供應(yīng)商名地址訂購單職工號(hào)供應(yīng)商號(hào)訂購單號(hào)訂購日期17(九)別名和自連接查詢 SELECT 供應(yīng)商名例3318(九)別名和自連接查詢 例33用連接操作完成上例的查詢。 在連接操作中,經(jīng)常需要使用關(guān)系名作前綴,有時(shí)這樣顯得很麻煩。因此,SQL允許在FROM短語中為關(guān)系名定義別名,格式為: 比如,剛才的連接語句可以寫為: SELECT 供應(yīng)商名FROM 供應(yīng)商 S,訂購單 P,職工 E,倉庫 WWHERE 地址=“北京” AND W.城市= “北京” AND S.供
16、應(yīng)商號(hào)=P.供應(yīng)商號(hào) AND P.職工號(hào)=E.職工號(hào) AND E.倉庫號(hào)=W.倉庫號(hào) 職工倉庫號(hào)職工號(hào)工資倉庫倉庫號(hào)城市面積供應(yīng)商供應(yīng)商號(hào)供應(yīng)商名地址訂購單職工號(hào)供應(yīng)商號(hào)訂購單號(hào)訂購日期18(九)別名和自連接查詢 例33用連接操作完成上例的查詢19 在這個(gè)例子中,別名并不是必須的,但是在關(guān)系的自連接操作中,別名就是必不可少的了。SQL不僅可以對(duì)多個(gè)關(guān)系實(shí)行連接操作,也可以將同一關(guān)系與其自身進(jìn)行連接,這種連接就稱為自連接。在可以進(jìn)行這種自連接操作的關(guān)系上,實(shí)際存在著一種特殊的遞歸聯(lián)系,即關(guān)系中的一些元組,根據(jù)出自同一個(gè)值域的兩個(gè)不同的屬性,可以與另外一些元組有一種對(duì)應(yīng)關(guān)系(一對(duì)多的聯(lián)系)。 本章
17、首頁本節(jié)首頁上一頁為了說明自連接,我們假設(shè)有一個(gè)雇員關(guān)系: 雇員(雇員號(hào),雇員姓名,經(jīng)理) 其中雇員號(hào)和經(jīng)理兩個(gè)屬性出自同一個(gè)值域,同一元組的這兩個(gè)屬性值是“上、下級(jí)”關(guān)系。側(cè)圖說明了雇員關(guān)系和它的一個(gè)實(shí)例。 19 在這個(gè)例子中,別名并不是必須的,但是在關(guān)20雇員姓名雇員號(hào)經(jīng)理1:n雇員雇員號(hào)雇員姓名經(jīng)理E3 E4 E6 E8趙涌 錢潮 孫潔 李淥E3 E3 E3 E6例34根據(jù)雇員關(guān)系列出上一級(jí)經(jīng)理及其職員(被其領(lǐng)導(dǎo))的清單。 SELECT S.雇員姓名,“領(lǐng)導(dǎo)”,E.雇員姓名;FROM 雇員 S,雇員 EWHERE S.雇員號(hào)= E.經(jīng)理; 結(jié)果是: 趙涌 領(lǐng)導(dǎo) 錢潮 趙涌 領(lǐng)導(dǎo) 孫潔 孫
18、潔 領(lǐng)導(dǎo) 李淥 這里通過定義別名形成了兩個(gè)邏輯關(guān)系,一個(gè)是經(jīng)理關(guān)系S,一個(gè)是職員關(guān)系E,結(jié)果在關(guān)系S和E上的連接實(shí)現(xiàn)了我們的檢索要求。另外,在SELECT短語中可以有常量,如這里的 “領(lǐng)導(dǎo)”。 本章首頁本節(jié)首頁上一頁20雇員姓名雇員號(hào)經(jīng)理1:n雇員雇員號(hào)雇員姓名經(jīng)理E3 21(十)內(nèi)、外層互相關(guān)嵌套查詢 事實(shí)上,有時(shí)也需要內(nèi)、外層互相關(guān)的查詢。 比如,我們?cè)谟嗁弳侮P(guān)系中加入一個(gè)新字段總金額,說明完成該訂購單所應(yīng)付出的總金額數(shù),新的訂購單關(guān)系如下表所示。 職工號(hào)供應(yīng)商號(hào)訂購單號(hào)訂購日期總金額E3 E1 E7 E6 E3 E1 E3 E3S7 S4 S4 S6 S4 S6 S6 S3OR67 OR
19、73 OR76 OR77 OR79 OR80 OR90 OR911998/06/23 1998/07/28 1998/05/25 1998/06/29 1998/06/13 1998/07/29 1998/06/22 1998/07/13 35000 12000 7250 6000 30050 25600 7690 12560訂購單例35列出每個(gè)職工經(jīng)手的具有最高總金額的訂購單信息。 SELECT out.職工號(hào),out.供應(yīng)商號(hào),out.訂購單號(hào),out.訂購日期,out.總金額FROM 訂購單 outWHERE 總金額=(SELECT MAX(總金額) FROM 訂購單 inner WHE
20、RE out.職工號(hào)= inner.職工號(hào));21(十)內(nèi)、外層互相關(guān)嵌套查詢 事實(shí)上,有時(shí)也需要內(nèi)、外層22 在這個(gè)查詢中,外層查詢和內(nèi)層查詢使用同一個(gè)關(guān)系,給它們分別指定別名out和inner。外層查詢提供out關(guān)系中的每個(gè)元組的職工號(hào)值給內(nèi)層查詢使用;內(nèi)層查詢利用這個(gè)職工號(hào)值,確定該職工經(jīng)手的具的最高總金額的訂購單的總金額;隨后外層查詢?cè)俑鶕?jù)out關(guān)系的同一元組的總金額值與該總金額值進(jìn)行比較,如果相等,則該元組被選擇。 (十一)超(OUT)連接查詢 在新的SQL標(biāo)準(zhǔn)中還支持兩個(gè)新的關(guān)系連接運(yùn)算符,它們與原來我們所了解的等值連接和自然連接不同。原來的連接是只有滿足連接條件,相應(yīng)的結(jié)果才會(huì)出
21、現(xiàn)在結(jié)果表中;而這兩個(gè)新的連接運(yùn)算是,首先保證一個(gè)表中滿足條件的元組都在結(jié)果表中,然后將滿足連接條件的元組與另一表的元組進(jìn)行連接,不滿足連接條件的則將來自另一表的屬性值置為空值。兩個(gè)超連接運(yùn)算符的含義見下表。 運(yùn)算符含義*=在結(jié)果表中包含第一個(gè)表中滿足條件的所有記錄;如果是在連接條件上匹配的元組,則第二個(gè)表返回相應(yīng)值,否則第二個(gè)表返回空值。 =*在結(jié)果表中包含第二個(gè)表中滿足條件的所有記錄;如果是在連條件上匹配的元組,則第一個(gè)表返回相應(yīng)值,否則第一個(gè)表返回空值。 22 在這個(gè)查詢中,外層查詢和內(nèi)層查詢使用同一23則結(jié)果是: WH1 北京 370 E3 1210 WH1 北京 370 E7 125
22、0 WH2 上海 500 E1 1220 WH2 上海 500 E4 1250 WH3 廣州 200 E6 1230 如果是左部超連接:SELECT 倉庫.倉庫號(hào), 城市, 面積, 職工號(hào), 工資 FROM 倉庫, 職工 WHERE 倉庫.倉庫號(hào)*=職工.倉庫號(hào); 則結(jié)果是: WH1 北京 370 E3 1210 WH1 北京 370 E7 1250 WH2 上海 500 E1 1220 WH2 上海 500 E4 1250 WH3 廣州 200 E6 1230 WH4 武漢 400 如果是自然連接:SELECT 倉庫.倉庫號(hào), 城市, 面積, 職工號(hào), 工資 FROM 倉庫, 職工 WHER
23、E 倉庫.倉庫號(hào)=職工.倉庫號(hào);設(shè)有倉庫和職工兩個(gè)關(guān)系職工倉庫號(hào)職工號(hào)工資倉庫倉庫號(hào)城市面積23則結(jié)果是:如果是左部超連接:則結(jié)果是:如果是自然連接:設(shè)24作業(yè) 4.4 p103學(xué)生(學(xué)號(hào),姓名,性別,年齡,所在系)課程(課程號(hào),課程名,學(xué)分)選課(學(xué)號(hào),課程號(hào),成績)UPDATE 選課 SET 成績 0 FROM 學(xué)生,課程,選課 WHERE (選課.學(xué)號(hào) 學(xué)生.學(xué)號(hào) AND 選課.課程號(hào)課程.課程號(hào)) AND (姓名LIKE 劉* AND 課程名高等數(shù)學(xué))UPDATE 學(xué)生信息 INNER JOIN (課程 INNER JOIN 成績 ON 課程.課程號(hào)=成績.課程號(hào)) ON 學(xué)生信息.學(xué)
24、號(hào)=成績.學(xué)號(hào) SET 成績.期末成績 = 0 WHERE ( 學(xué)生信息.姓名 Like “劉*”) AND ( 課程.課程名 Like “高等數(shù)學(xué)”);24作業(yè) 4.4 p103254.7 嵌入式 SQL SQL語言提供了兩種工作方式:交互式SQL、嵌入式 SQL 前面介紹的SQL,是作為獨(dú)立的數(shù)據(jù)語言可以直接以交互的方式使用的,除此之外,SQL 還可以作為子語言嵌入在宿主語言中使用,這里所說的宿主語言就是指我們常見的高級(jí)程序設(shè)計(jì)語言,如C、C+、Java等等。下邊主要介紹SQL作為子語言嵌入在宿主語言中使用的一般方法。 把SQL嵌入到宿主語言中使用必須要解決以下三個(gè)方面的問題: 1. 嵌入
25、識(shí)別問題。宿主語言的編譯程序不能識(shí)別SQL語句,所以首要的問 題就是要解決如何區(qū)分宿主語言的語句和SQL語句。2. 宿主語言與SQL語言的數(shù)據(jù)交互問題。SQL語句的查詢結(jié)果必須能夠交 給宿主語言處理,宿主語言的數(shù)據(jù)也要能夠交給SQL語句使用。 3. 語言的單記錄與SQL的多記錄的問題。宿主語言一般一次處理一條記錄, 而SQL常常處理的是記錄(元組)的集合,這個(gè)矛盾必須解決。254.7 嵌入式 SQL SQL語言提供了兩種工作方式26 宿主語言的編譯系統(tǒng)不能識(shí)別SQL語句。解決這個(gè)問題的一般方法是,為SQL語句加一個(gè)特殊的前綴,在用宿主語言的編譯系統(tǒng)編譯源程序之前,首先由預(yù)編譯系統(tǒng)將SQL語句轉(zhuǎn)
26、換為宿主語言的合法函數(shù)調(diào)用。 常用的前綴格式是: EXEC SQL 如: EXEC SQL INSERT INTO 職工 VALUES(“WH8”,“E20”,1560); 下圖示意了嵌入了SQL的應(yīng)用程序的執(zhí)行過程。嵌入了SQL語句的應(yīng)用程序,首先要經(jīng)過預(yù)編譯轉(zhuǎn)換成宿主語言源程序,接著由宿主語言的編譯系統(tǒng)產(chǎn)生中間代碼,然后根據(jù)中間代碼、宿主語言函數(shù)庫和SQL函數(shù)據(jù)庫連接產(chǎn)生可執(zhí)行程序,執(zhí)行程序時(shí)由SQL語句通過DBMS訪問數(shù)據(jù)庫。 應(yīng)用程序預(yù)編譯編 譯連 接執(zhí)行應(yīng)用程序DBMS源程序SQL庫函數(shù)宿主語言庫函數(shù)中間代碼可執(zhí)行程序數(shù)據(jù)庫(一)嵌入識(shí)別與預(yù)編譯 26 宿主語言的編譯系統(tǒng)不能識(shí)別SQ
27、L語句。解決這個(gè)27(二)數(shù)據(jù)通信區(qū)與主變量 在嵌入使用SQL語句的程序中,一般在程序的前部都要有一條: INCLUDE SQLCA 這里的SQLCA即是SQL與宿主語言的通信區(qū),它類似于結(jié)構(gòu)變量,各個(gè)分量分別反映SQL語句的各種執(zhí)行狀態(tài)。 負(fù)責(zé) SQL 語句與宿主語言語句數(shù)據(jù)交換的是主(Host)變量,這種變量既可以用在SQL語句中,又可以用在宿主語言語句中。 本章首頁本節(jié)首頁上一頁這種變量必須在DECLARE SECTION中說明,說明的格式是: BEGIN DECLARE SECTION 主變量說明 END DECLARE SECTION 27(二)數(shù)據(jù)通信區(qū)與主變量 在嵌入使用SQL語
28、句的程序中,28 經(jīng)以上方式說明的主變量可以在SQL語句中使用,只是用在SQL語句中時(shí),必須冠以冒號(hào)前綴,如: UPDATE 倉庫 SET 面積= : wh_area WHERE 倉庫號(hào)= : whnumb; 主變量用在宿主語言語句中時(shí),和一般程序變量的使用方法是一樣的。 本章首頁本節(jié)首頁上一頁下面是在C語言程序中說明主變量的例子: EXEC SQL BEGIN DECLARE SECTION char whnumb5 char city12 int wh_areaEXEC SQL END DECLARE SECTION; 28 經(jīng)以上方式說明的主變量可以在SQL語句中29(三)游標(biāo)(Curs
29、or) 宿主語言一般只能在單記錄方式下工作,即一次處理一個(gè)記錄。而SQL語句的查詢結(jié)果常常是一張表,它包含多個(gè)記錄,為此需要用 游標(biāo)(Cursor)作為橋梁做一些特殊處理。與游標(biāo)有關(guān)的命令共有四條: DECLARE CURSOROPENFETCHCLOSE 通過下面的介紹我們會(huì)發(fā)現(xiàn)游標(biāo)類似于文件的概念,游標(biāo)有時(shí)的含義是整個(gè)“文件”,有時(shí)的含義是指向某個(gè)記錄的指針。下面我們通過具體的幾條語句來理解游標(biāo)的概念。 定義游標(biāo)的DECLARE CURSOR語句的格式是:EXEC SQL DECLARE CURSOR FOR ; 該語句用定義一個(gè)游標(biāo)(文件),它的內(nèi)容是: 的查詢結(jié)果(多個(gè)記錄組成的表)。
30、 29(三)游標(biāo)(Cursor) 宿主語言一般只能在30啟動(dòng)或打開游標(biāo)(文件)的語句是OPEN,其格式是: EXEC SQL OPEN ; 該語句的功能是打開或啟動(dòng)指出的游標(biāo)。該游標(biāo)名是用DECLAER CURSOR語句已經(jīng)定義好的。執(zhí)行該語句意味著執(zhí)行在DECLARE CURSOR語句中定義的SELECT查詢,并使游標(biāo)(指針)指向查詢結(jié)果的第一條記錄。30啟動(dòng)或打開游標(biāo)(文件)的語句是OPEN,其格式是:該語句31讀記錄的FETCH語句的格式是: EXEC SQL FETCH INTO :, :; 該語句的功能是取出游標(biāo)所指記錄并送入主變量,同時(shí)向前撥動(dòng)游標(biāo),使游標(biāo)指向下一條記錄。這里的游標(biāo)
31、必須是已經(jīng)說明并打開了的, INTO 后的主變量要與在DECLARE CURSOR中SELECT的字段相對(duì)應(yīng)。當(dāng)查詢結(jié)果為空,或游標(biāo)已經(jīng)指向查詢結(jié)果集的結(jié)尾時(shí),SQLCA.sqlcode的代碼將為-1,說明游標(biāo)沒有指向新記錄。 關(guān)閉游標(biāo)(文件)的CLOSE語句的格式是: EXEC SQL CLOSE ;該語句的功能是關(guān)閉或停止指出的游標(biāo)。 與程序設(shè)計(jì)語言中的文件相對(duì)照,DECLARE CURSOR 相當(dāng)于說明了一個(gè)文件,OPEN相當(dāng)于打開文件,F(xiàn)ETCH相當(dāng)于讀一條記錄,CLOSE相當(dāng)于關(guān)閉文件。 EXEC SQL DECLARE CURSOR FOR ;31讀記錄的FETCH語句的格式是:
32、該語句的功能是324.7.3 嵌入式SQL的使用技術(shù)1. 不涉及游標(biāo)的SQL DML 語句【例4.43】給出在C語言中不涉及游標(biāo)的嵌入式SQL DML 語句的使用 例子。(1)在學(xué)生表中,根據(jù)共享變量sno的值查詢學(xué)生的姓名、性別和年齡。 EXEC SQL SELECT 姓名, 性別, 年齡 INTO :name, :sex, :age FROM 學(xué)生 WHERE 學(xué)號(hào)= :sno; 這里,sno、name、sex、age都是共享變量,已在主程序中定義,并用SQL的DECLARE語句說明,在使用時(shí)加上 “:” 作為標(biāo)識(shí),以區(qū)別數(shù)據(jù)庫中的變量。主程序中已先賦值給sno,SELECT的查詢結(jié)果(一
33、條記錄)送到共享變量name、sex、age中。324.7.3 嵌入式SQL的使用技術(shù)1. 不涉及游標(biāo)的33(2)在學(xué)生表中插入一條新紀(jì)錄,數(shù)據(jù)已在相關(guān)的共享變量中。 EXEC SQL INSERT 學(xué)生(學(xué)號(hào),姓名,性別,年齡) VALUES ( :sno, :name, :sex, :age ); 如果某個(gè)屬性值未給出,則自動(dòng)置為空值。(3)從選課表中刪除一個(gè)學(xué)生的各個(gè)成績,學(xué)號(hào)在共享變量sno中。 EXEC SQL DELETE FROM 選課 WHERE 學(xué)號(hào)= :sno;(4)將所有學(xué)生的“MATHS”課程成績?cè)黾幽硞€(gè)值(在共享變量a中)。 EXEC SQL UPDATE 選課 SE
34、T 成績=成績+ :a WHERE 課程號(hào) IN (SELECT 課程號(hào) FROM 課程 WHERE 課程名= MATHS );33(2)在學(xué)生表中插入一條新紀(jì)錄,數(shù)據(jù)已在相關(guān)的共享變量中342. 涉及游標(biāo)的SQL DML 語句 當(dāng)SELECT語句的查詢結(jié)果為多個(gè)元組時(shí),宿主語言程序無法使用,所以一定要有游標(biāo)機(jī)制將多個(gè)元組一次一個(gè)地傳送給宿主語言程序進(jìn)行處理。具體有以下步驟:先用游標(biāo)定義語句定義一個(gè)游標(biāo)和某個(gè)SELECT語句對(duì)應(yīng)。游標(biāo)打開后,處于活動(dòng)狀態(tài),此時(shí)游標(biāo)指向查詢結(jié)果集的第一個(gè)元組前。每執(zhí)行一次FETCH語句,游標(biāo)指向下一個(gè)元組,并把其值送到共享變量,供程序處理,如此反復(fù),直到所有查詢
35、結(jié)果處理完畢。最后關(guān)閉游標(biāo);關(guān)閉的游標(biāo)也可以重新打開,與新的查詢結(jié)果集相對(duì)應(yīng),在沒有打開前不能使用。342. 涉及游標(biāo)的SQL DML 語句35【例4.44】在教學(xué)數(shù)據(jù)庫中檢索成績不及格的學(xué)生信息(學(xué)號(hào),姓名, 課程,成績),下面是該查詢的一個(gè)C函數(shù)。#define NO_MORE_TUPLES !(strcmp(SQLSTATE, “02000”)Void sel( ) EXEC SQL BEGIN DECLARE SECTION Char sno5, sname9, cname11; Int g; Char SQLSTATE6; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE scx CURSOR FOR SELECT 學(xué)生.學(xué)號(hào),姓名,課程名,成績 FROM 學(xué)生,課程,選課 WHERE 學(xué)生.學(xué)號(hào)=選課.學(xué)號(hào) and 課程.課程號(hào)=選課.課
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球元件參數(shù)測試儀行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2024年科普知識(shí)競賽試題庫及答案(共70題)
- 2024年青少年禁毒知識(shí)競賽小學(xué)組題庫及答案(共60題)
- 2025年度特種鋼材進(jìn)口與國內(nèi)銷售合作協(xié)議
- 2025年度應(yīng)急響應(yīng)個(gè)人勞務(wù)派遣服務(wù)合同示范文本2篇
- 二零二五年度車庫租賃及停車場運(yùn)營管理合同4篇
- 數(shù)字化背景下學(xué)校師德師風(fēng)教育的創(chuàng)新發(fā)展
- 數(shù)學(xué)教育與兒童發(fā)展游戲化教學(xué)的意義
- 二零二五年度鋁扣板藝術(shù)裝飾施工合同3篇
- 二零二五年度采砂場環(huán)境保護(hù)與修復(fù)合同3篇
- JB-T 8532-2023 脈沖噴吹類袋式除塵器
- 深圳小學(xué)英語單詞表(中英文)
- 護(hù)理質(zhì)量反饋內(nèi)容
- 山東省濟(jì)寧市2023年中考數(shù)學(xué)試題(附真題答案)
- 抖音搜索用戶分析報(bào)告
- 板帶生產(chǎn)工藝熱連軋帶鋼生產(chǎn)
- 鉆孔灌注樁技術(shù)規(guī)范
- 2023-2024學(xué)年北師大版必修二unit 5 humans and nature lesson 3 Race to the pole 教學(xué)設(shè)計(jì)
- 供貨進(jìn)度計(jì)劃
- 國際尿失禁咨詢委員會(huì)尿失禁問卷表
- 彌漫大B細(xì)胞淋巴瘤護(hù)理查房
評(píng)論
0/150
提交評(píng)論