版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第三章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)查詢語(yǔ)言SQL l 3.1 SQL概述 l 3.2數(shù)據(jù)定義語(yǔ)言(DDL) l 3.3 SQL的數(shù)據(jù)查詢(DML) l 3.4 SQL的數(shù)據(jù)更新(DML) l 3.5視圖l 3.6數(shù)據(jù)控制語(yǔ)言(DCL)l 3.7嵌入式SQL語(yǔ)言 l 3.8 存儲(chǔ)過(guò)程*(T-SQL) 3.1 SQL概述l SQL(Standard/Structured Query Language)是關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn) l 1986年10月,美國(guó)國(guó)家標(biāo)準(zhǔn)局(American National Standard Institute ANSI)公布第一個(gè)標(biāo)準(zhǔn)ANSI X3.135-1986,國(guó)際標(biāo)準(zhǔn)化組織(Inte
2、rnational Organization for Standardization ISO)也通過(guò)這一標(biāo)準(zhǔn)稱SQL86 l 1989年ANSI再次公布標(biāo)準(zhǔn)ANSI X3.135-1989 ,ISO 相應(yīng)SQL89 l 1999年,ISO公布 SQL-1999(SQL99,SQL3) l 2003年,ISO公布 SQL-2003 3.1.1 SQL語(yǔ)言的組成 數(shù)據(jù)定義(DDL Data Definition/Description Language ) 定義數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu),包括基本表、視圖、索引等數(shù)據(jù)操縱(DML Data Manipulation Language) 包括查詢和更新,更新又
3、包含插入、刪除和修改 數(shù)據(jù)控制(DCL Data Control Language ) 授權(quán)、完整性規(guī)則描述、事務(wù)控制等 嵌入式SQL(ESQL) 在宿主語(yǔ)言中使用SQL的規(guī)則 3.1.2 SQL語(yǔ)言的特點(diǎn) 綜合統(tǒng)一:集DDL、DML、DCL于一體,語(yǔ)言風(fēng)格統(tǒng)一 面向集合的操作方式:操作對(duì)象、查詢結(jié)果都可以是元組的集合 高度非過(guò)程化:存取路進(jìn)透明。以統(tǒng)一的語(yǔ)法結(jié)構(gòu)提供兩種使用方式:自含式、嵌入式 語(yǔ)言簡(jiǎn)潔,易學(xué)易用,主要共使用11個(gè)關(guān)鍵詞 DDL:create drop alter DML:select insert delete update DCL:grant revoke commit
4、rollback 3.2數(shù)據(jù)定義語(yǔ)言(DDL) 3.2.1定義、刪除與修改基本表 定義基本表語(yǔ)法 CREATE TABLE (列級(jí)約束條件,列級(jí)約束條件. .,)例:CREATE TABLE S(SCHAR(5) NOT NULL UNIQUE,SNCHAR(20),SA INT,SD CHAR(3),PRIMARY KEY (S#)); 修改表語(yǔ)法 ALTER TABLE ADD 列級(jí)約束條件DROP MODIFY ; 例:ALTER TABLE S ADD SCome DATE;ALTER TABLE S MODIFY SA SMALLINT;ALTER TABLE S DROP UNIQ
5、UE(S#); 刪除表語(yǔ)法 DROP TABLE 例:DROP TABLE S 3.2.2建立和刪除索引索引的建立語(yǔ)法CREATE UNIQUECLUSTER INDEX ON (,. .)可以是ACS和DESC例:CREATE UNIQUE INDEX S_S# ON S(S#)CREATE UNIQUE INDEX C_C# ON C(C#)CREATE UNIQUE INDEX SC_S#_C# ON SC(S# ASC,C# DESC) 索引的刪除語(yǔ)法DROP INDEX .DROP INDEX S.S_S# 3.3 SQL的數(shù)據(jù)查詢(DML) l 關(guān)系代數(shù)表達(dá)式 lA1,A2,.An
6、(F (R1R2. .Rn) l SQL 語(yǔ)句l SELECT A1,A2,.Anl FROM R1,R2,. .Rml WHERE F詳細(xì)語(yǔ)法 SELECT ALL|DISTINCT *| , . .FROM ,. .WHERE GROUP BY , HAVING ORDER BY ASC|DESC, ASC|DESC執(zhí)行過(guò)程 1)先按WHERE子句條件從FROM子句指定的表/視圖中找出滿足條件的元組(選擇);2)再按SELECT子句中的目標(biāo)表達(dá)式選擇出元組中的屬性,形成結(jié)果表(投影);3)如有GROUP子句,則將結(jié)果按的值分組,該值相等的元組為一個(gè)組,通常會(huì)在每組中使用聚合函數(shù)。4)如果G
7、ROUP子句帶HAVING子句,則對(duì)組過(guò)慮,將滿足條件的組輸出5)如果ORDER子句,則將結(jié)果按的值升序或降序排列3.3.1單表查詢 假設(shè):S(S#,SN,SS,SA,SD) C(C#,CN,CP,CR) SC(S#,C#,GR)選取表中的某些列,即投影運(yùn)算 查指定列 SELECT S#,SN FROM S 查全部列 SELECT * FROM STUDENT 查經(jīng)過(guò)計(jì)算的列 SELECT SN,2005-SA FROM S 選擇表中的若干元組,即選擇運(yùn)算消除取值重復(fù)行 SELECT DISTINCT SD FROM S 查詢滿足條件的元組 比較大?。?、=、=、 SELECT SN,SA FR
8、OM S WHERE SD=CSSELECT * FROM S WHERE SA20確定范圍:BETWEEN. AND SELECT * FROM S WHERE SA BETWEEN 20 AND 21 確定集合:IN SELECT * FROM S WHERE SD IN (CS,IS,MA) 字符匹配:LIKE,轉(zhuǎn)義字符 SELECT * FROM S WHERE S# LIKE TB%SELECT * FROM S WHERE SN LIKE 劉_涉及空值的查詢:IS NULL SELECT * FROM SC WHERE GR IS NULL 多重條件查詢: SELECT * FRO
9、M S WHERE SD=CS AND SA20 表查詢結(jié)果排序 ORDER BY ASC|DESC SELECT * FROM SC WHERE C#=3 ORDER BY GR DESC使用集(聚合)函數(shù) COUNT 、SUM、AVG、MAX、MINSELECT COUNT(*) FROM SSELECT COUNT(DISTINCT S#) FROM SCSELECT AVG(GR) FROM SC WHERE S#=95001SELECT MAX(GR) FROM SC WHERE C#=1查詢分組:GROUP BY SELECT C#,COUNT(C#) FROM SC GROUP
10、BY C# SELECT S# FROM SC GROUP BY S# HAVING COUNT(*) 3 檢索選修3門(mén)的課學(xué)生學(xué)號(hào) 表3.3.2連接查詢等值與非等值連接查詢 自然連接 SELECT S.*,SC.* FROM S,SC WHERE S.S# = SC.S# 自身連接檢索每門(mén)課的間接預(yù)修課 SELECT f.C#, s.CP FROM C f,C s WHERE f.CP=s.C# CCNCPCR1DB542MA23IS144OS635DataStruct746DataProcess27PASCAL64CCNPCR1DB542MA23IS144OS635DataStruct74
11、6DataProcess27PASCAL64表外連接 列出所有學(xué)生的修課情況,如果沒(méi)有選課也列出其基本信息(左外連接)SELECT S#,SN,SS,SA,SD,C#,GR FROM S, SCWHERE S.S# *=SC.S# (T-SQL語(yǔ)法 SYBASE)SELECT S#,SN,SS,SA,SD,C#,GR FROM S, SCWHERE S.S# =SC.S#(+) (PL/SQL語(yǔ)法ORACLE)SELECT S#,SN,SS,SA,SD,C#,GR FROM S LEFT OUTER JION SC ON S.S#=SC.S#(MYSQL MSSQL)表復(fù)合條件連接 檢索選修課
12、程號(hào)2且成績(jī)?cè)?0分以上的所有學(xué)生 SELECT S.S# ,SN FROM S,SC WHERE S.S# = SC.S# AND SC.C#=2 AND SC.GR=90檢索每個(gè)學(xué)生選修的課程名及其成績(jī) SELECT S.S#,SN,C.CN,SC.GR from S,SC,CWHERE S.S# = SC.S# AND SC.C# = C.C#表3.3.3嵌套查詢 帶IN謂詞的子查詢 檢索與“劉晨”同在一系的學(xué)生信息 SELECT S#,SN,SD FROM S WHERE SD IN(SELECT SD FROM S WHERE SN劉晨)本例可以通過(guò)自連接來(lái)實(shí)現(xiàn) SELECT s1.
13、S#, s1.SN, s1.SD FROM S s1, S s2WHERE s1.SD = s2.SD AND s2.SN=劉晨表檢索選修了課程名的為MA的學(xué)生學(xué)號(hào)和姓名 SELECT S#, SN FROM S WHERE S# IN (SELECT S# FROM SC WHERE C# IN (SELECT C# FROM C WHERE CN=MA) )本例同樣可以用連接來(lái)實(shí)現(xiàn) SELECT S#,SN FROM S ,SC,C WHERE S.S# = SC.S# AND SC.C# = C.C#AND C.CN=MA 表帶比較運(yùn)算的子查詢 當(dāng)確定子查詢的返回值是唯一時(shí),可以使用比較
14、運(yùn)算符(注意子查詢?cè)诒容^符后)SELECT S#,SN FROM S WHERE SD=(SELECT SD FROM S WHERE CN=劉晨) 帶ANY和ALL的子查詢(子查詢返回多值時(shí)用)檢索其他系中比IS系任一學(xué)生年齡小的學(xué)生名單 SELECT S,SN FROM S WHERE SA ANY(SELECT SA FROM S WHERE SDIS)AND SDISORDER BY SA DESC等價(jià)于SELECT S,SN FROM S WHERE SA (SELECT MAX(SA) FROM S WHERE SDIS)AND SD ISORDER BY SA DESC 檢索其他
15、系中比IS系所有學(xué)生年齡都小的學(xué)生名單SELECT S,SN FROM S WHERE SA ALL(SELECT SA FROM S WHERE SDIS)AND SDIS 等價(jià)于SELECT S,SN FROM S WHERE SA (SELECT MIN(SA) FROM S WHERE SDIS)AND SD ISORDER BY SA DESC 帶EXISTS的子查詢(不返回任何數(shù)據(jù),只返回Ture和False) 檢索所有選修了課程號(hào)為1的學(xué)生姓名 SELECT SN FROM S WHERE EXISTS(SELECT * FROM SC WHERE S# = S.S# AND C
16、# = 1)注意:此例中子查詢的查詢條件依賴于外層父查詢,稱此類查詢?yōu)橄嚓P(guān)子查詢(corelated subquery)。 等價(jià)連接實(shí)現(xiàn):SELECT SN FROM S,SC WHERE S.S# = SC.S# AND C# = 1 qSQL中沒(méi)有(x)p,故須轉(zhuǎn)換為(x(p) q如檢索選修了全部課程的學(xué)生,即沒(méi)有一門(mén)課沒(méi)有選的學(xué)生qSELECT SN FROM S WHERE NOT EXISTS q(SELECT * FROM C WHERE NOT EXISTSq(SELECT * FROM SC WHERE C# C.C# AND S# = S.S#)qp-q應(yīng)被等價(jià)為pqq如檢索
17、至少選修了學(xué)生S001選修的全部課程的學(xué)生q令p=學(xué)生S001選修了y q學(xué)生x選修了y q(y)(p-q)=y(p-q)= y(pq)= y(pq) q即不存在這么一門(mén)課程,學(xué)生S001選修了而x沒(méi)有選修qSELECT SN FROM S WHERE NOT EXISTS(qSELECT * FROM SC SC2 WHERE S# = S001 AND qNOT EXISTS (SELECT * FROM SC WHERE C# = SC2.C# AND S# = S.S#) 3.3.4集合查詢使用交、并、差的集合運(yùn)算概念,INTERSECT ,UNION,MINUS 檢索計(jì)算機(jī)科學(xué)系及年
18、齡不大于19歲的學(xué)生 SELECT * FROM S WHER SD=CSUNION SELECT * FROM S WHERE SA19等價(jià)于:SELECT * FROM S WHERE SDCS OR SA =19檢索選修了課程號(hào)為C01或C02的學(xué)生學(xué)號(hào)SELECT S# FROM SC WHERE CC01UNION SELECT S# FROM SC WHERE CC02等價(jià)于:SELECT S# FROM SC WHERE C# IN (C01,C02)q檢索同時(shí)選修了課程號(hào)為C01和C02的學(xué)生學(xué)號(hào) qSELECT S# FROM SC WHERE CC01qINTERSECTq
19、SELECT S# FROM SC WHERE CC02(僅ORACLE)q等價(jià)于:qSELECT S# FROM SC WHERE C# = C01 AND S# INq(SELECT S# FROM SC WHERE C# = C02)q檢索選修了課程號(hào)為C01而未選修C02的學(xué)生學(xué)號(hào)。qSELECT S# FROM SC WHERE C#C01qMINUS qSELECT S# FROM SC WHERE C#C02(僅ORACLE)q等價(jià)于:qSELECT S# FROM SC WHERE C#C01AND qS# NOT IN (SELECT S# FROM SC WHERE C#C
20、02)3.4 SQL的數(shù)據(jù)更新(DML) 3.4.1數(shù)據(jù)插入 插入單個(gè)元組 語(yǔ)法:INSERT INTO ( , .)VALUES(,.) INSERT INTO S VALUES(S001,張三,男,18,IS)插入子查詢結(jié)果 語(yǔ)法:INSERT INTO ( , .)例:為所有學(xué)生插入一條選修C01課程的記錄INSERT INTO SC SELECT S#,C01,null FROM S 3.4.2數(shù)據(jù)修改 語(yǔ)法:UPDATE SET , . WHERE ; 修改某一個(gè)元組的值 將學(xué)生S001的年齡該為22歲 UPDATE S SET SA=22 WHERE S# =S001 修改多個(gè)元組
21、的值 將所有的學(xué)生年齡增加1歲 UPDATE S SET SASA1帶子查詢的修改語(yǔ)句 將計(jì)算機(jī)科學(xué)系所有的學(xué)生成績(jī)置零 UPDATE SC SET GR=0WHERE CS = (SELECT SD FROM S WHERE S# = SC.S#) (相關(guān)子查詢) 不同的DBMS可以使用join實(shí)現(xiàn)同樣功能,如SYBASEUPDATE SC set GR=0 from S where S.S#=SC.S# and SD=CS或 UPDATE SC set GR=0 where S# in (SELECT S# from S where SD=CS) 修改操作與數(shù)據(jù)庫(kù)的一致性 如同時(shí)修改S和S
22、C兩表中的S#的值為了保證數(shù)據(jù)庫(kù)的一致性,引入事務(wù)概念 3.4.3數(shù)據(jù)刪除 語(yǔ)法: DELETE FROM WHERE ;刪除某一個(gè)元組的值 刪除學(xué)號(hào)為S001的學(xué)生 DELETE FROM S WHERE S#=S001 刪除多個(gè)元組的值 刪除所有學(xué)生的選課記錄 DELETE FROM SC 帶子查詢的刪除語(yǔ)句 刪除計(jì)算機(jī)科學(xué)系所有學(xué)生的選課記錄 DELETE FROM SC WHERE CS=(SELECT SD FROM S WHERE S#=SC.S#) (相關(guān)子查詢) DELETE from SC where S# in (SELECT S# from S where SD=CS)
23、(非相關(guān)子查詢) 3.5視圖 視圖只是一個(gè)窗口,其數(shù)據(jù)依賴于基本表 3.5.1定義視圖 建立視圖 語(yǔ)法 :CREATE VIEW (,.)AS WITH CHECK OPTION 列名在以下情況必須列出子查詢的目標(biāo)列是集函數(shù)等,不是單純的列 多表連接時(shí)出現(xiàn)同名的列作為視圖字段 需要在視圖中啟用新的名字 WITH CHECK OPTION 表示對(duì)視圖更新時(shí)自動(dòng)驗(yàn)證子查詢條件 行列子集視圖:若一個(gè)視圖是從單個(gè)基本表導(dǎo)出的,并且只是去掉了基本表的某些行和某些列,但保留了碼,稱行列子集視圖 例:建立學(xué)生視圖 CREATE VIEW IS_S ASSELECT S#, SN , SA FROM SWHE
24、RE SD=IS 建立信息系選修了C1號(hào)課程的學(xué)生視圖 CREATE VIEW IS_S1 (S#, SN ,GR) ASSELECT S.S# ,SN ,GR FROM S, SC WHERE S.S# = SC.S# AND S.SD=IS AND SC.C# = C1 l 視圖之上可以建立視圖 l 建立選修了C1課程且成績(jī)?cè)?0以上的學(xué)生視圖 lCREATE VIEW IS_S2 AS lSELECT S#, SN, GR FROM IS_S1 WHERE GR=90l 其它視圖建立例子l 建立一個(gè)反映學(xué)生出生年月的視圖 lCREATE VIEW BT_S(S,SN,SB)AS lSEL
25、ECT S#, SN,2003SA FROM S l 建立一個(gè)學(xué)生學(xué)號(hào)和平均成績(jī)的視圖 lCREATE VIEW S_G(S,AVG_GR)AS lSELECT S#, AVG(GR) FROM SC GROUP BY S# 建立一個(gè)女學(xué)生的視圖 CREATE VIEW S_F(S,SN,SS,SA,SD)AS SELECT * FROM S WHERE SS=女 本視圖在S表結(jié)構(gòu)改變時(shí)會(huì)出錯(cuò),解決辦法是去掉列說(shuō)明或改*為列表刪除視圖 語(yǔ)法DROP VIEW 例子:刪除視圖IS_SDROP VIEW IS_S 3.5.2查詢視圖 把對(duì)視圖的查詢轉(zhuǎn)化為對(duì)基本表的查詢稱為視圖的消解(View Re
26、solution) SELECT S,SA FROM IS_S WHERE SA 20 消解為:SELECT S# ,SA FROM S WHERE SD=IS AND SA 90 消解為:SELECT S#, AVG(GR) FROM SC WHERE AVG(GR)90 GROUP BY S# (錯(cuò)誤)SELECT S#, AVG(GR) FROM SC GROUP BY S# HAVING AVG(GR)90 (正確)3.5.3更新視圖 視圖的修改 將信息系學(xué)生視圖中學(xué)號(hào)為S001的學(xué)生姓名改為劉辰UPDATE IS_S SET SN=劉辰 WHERE S#=S001 視圖消解為:UPD
27、ATE S SET SN=劉辰 WHERE S#=S001AND SD=IS 視圖的插入 在信息系學(xué)生視圖中插入記錄 INSERT INTO IS_S VALUES (S001,劉辰,20) 視圖消解: INSERT INTO S VALUES (S001,劉辰,NULL,20,IS) 視圖的刪除: 在信息系學(xué)生視圖中插入記錄 DELETE FROM IS_S WHERE S#=S001視圖消解 :DELETE FROM S WHERE S#=S001AND SD=IS 某些帶聚合/集函數(shù)的視圖是不可修改的例如: UPDATE S_G SET AVG_GR=80 WHERE S#=S001(錯(cuò)
28、誤)不運(yùn)行更新的視圖規(guī)則 由兩個(gè)以上基本表導(dǎo)出的視圖 視圖的字段來(lái)自常數(shù)或表達(dá)式,只運(yùn)行DELETE 視圖的字段來(lái)自集函數(shù) 視圖中含有GROUP BY子句 視圖中含有DISTINCT語(yǔ)句 視圖定義有嵌套查詢,且內(nèi)層查詢涉及到導(dǎo)出本視圖的基本表 不允許更新的視圖上定義的視圖 3.5.4視圖的用途視圖能簡(jiǎn)化用戶的操作視圖可以使用戶多角度看待同一數(shù)據(jù) 視圖對(duì)重構(gòu)數(shù)據(jù)庫(kù)提供了一定的邏輯獨(dú)立性例如:S(S#, SN, SS, SA, SD)需要拆分為 SX(S#,SN, SS, SA), SY(S#, SD)則可以通過(guò)視圖來(lái)保證應(yīng)用不需改變CREATE VIEW S AS SELECT SX.S#, S
29、N, SS, SA, SD FROM SX, SY WHERE SX.S# = SY.S#視圖能對(duì)數(shù)據(jù)提供安全保護(hù) 3.6數(shù)據(jù)控制語(yǔ)言(DCL) 3.6.1授權(quán) 語(yǔ)法 GRANT ALL PRIVILEGES|,. .ON TO PUBLIC|,. .WITH GRANT OPTION; 示例:GRANT SELECT ON TABLE S TO USER1;GRANT ALL Privileges ON TABLE S, C TO U2,U3;GRANT SELECT ON TABLE SC TO PUBLIC; GRANT UPDATE(SD),SELECT ON TABLE S TO U
30、4; GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION;GRANT CREATETAB ON DATABASE S_C TO U8;3.6.2收回權(quán)限語(yǔ)法 REVOKE ALL PRIVILEGES|,. .ON FROM PUBLIC|,. .;示例REVOKE SELECT ON TABLE SC FROM PUBLIC;REVOKE UPDATE(SD),SELECT ON TABLE S FROM U4;REVOKE INSERT ON TABLE SC FROM U5;3.7 嵌入式SQL語(yǔ)言 SQL語(yǔ)言是非過(guò)程的,而應(yīng)用大多是過(guò)程化的
31、,故通過(guò)高級(jí)語(yǔ)言來(lái)彌補(bǔ)SQL過(guò)程控制的不足.將SQL嵌入(Embedded SQL )高級(jí)語(yǔ)言(宿主語(yǔ)言)來(lái)執(zhí)行,稱嵌入式SQL語(yǔ)言(簡(jiǎn)稱ESQL)。 3.7.1嵌入式SQL的一般形式 對(duì)于ESQL的處理,DBMS一般有兩種處理方式: 預(yù)編譯修改和擴(kuò)充宿主語(yǔ)言以處理SQLESQL一般形式:EXEC SQL ESQL根據(jù)其作用不同分為兩類 :可執(zhí)行語(yǔ)句說(shuō)明性語(yǔ)句 可執(zhí)行語(yǔ)句包括DDL、DML、DCL。兩類SQL語(yǔ)句應(yīng)和宿主語(yǔ)言兩類語(yǔ)句出現(xiàn)在同一地方 3.7.2嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信數(shù)據(jù)庫(kù)工作單元和主語(yǔ)言工作單元之間的通信有向主語(yǔ)言傳遞SQL語(yǔ)句的執(zhí)行狀態(tài)主語(yǔ)言向SQL語(yǔ)句提供參數(shù) 將
32、SQL語(yǔ)句查詢數(shù)據(jù)庫(kù)結(jié)果交主語(yǔ)言進(jìn)一步處理 相應(yīng)地通過(guò)SQLCA、主變量、游標(biāo)來(lái)實(shí)現(xiàn) SQL通信區(qū) SQLCA(SQL Communication Area)是一個(gè)數(shù)據(jù)結(jié)構(gòu),定義語(yǔ)句 EXEC SQL INCLUDE SQLCA ;SQLCODE反映每次執(zhí)行SQL語(yǔ)句的結(jié)果 主變量 主要功能:ESQL可以使用主語(yǔ)言的變量來(lái)輸入和輸出數(shù)據(jù) 分類:輸入、輸出主變量、指示變量使用方法 所有主變量必須在定義區(qū)定義(BEGIN DECLARE SECTION、END DECLARE SECTION)可以在SQL中任意表達(dá)式的對(duì)方出現(xiàn)在SQL語(yǔ)句中,主變量前要加:,而在主語(yǔ)言中不必加。指示變量用于為輸入變
33、量賦空值或指示輸出變量是否空值 游標(biāo) 使用原因:SQL語(yǔ)句是面向集合的,而主語(yǔ)言是面向記錄的主語(yǔ)言和SQL語(yǔ)言的分工 SQL語(yǔ)言負(fù)責(zé)直接與數(shù)據(jù)庫(kù)打交道主語(yǔ)言用來(lái)控制程序流程以及對(duì)SQL的執(zhí)行結(jié)構(gòu)進(jìn)一步處理SQL語(yǔ)言用主變量從主語(yǔ)言接受執(zhí)行參數(shù)操作數(shù)據(jù)庫(kù)SQL語(yǔ)言的執(zhí)行狀態(tài)由DBMS送至SQLCA-主語(yǔ)言從SQLCA取出狀態(tài)信息,據(jù)此決定下一步操作。SQL的執(zhí)行結(jié)果通過(guò)主變量或游標(biāo)傳給主語(yǔ)言處理3.7.3不使用游標(biāo)的SQL語(yǔ)句 說(shuō)明性語(yǔ)句數(shù)據(jù)定義語(yǔ)句數(shù)據(jù)控制語(yǔ)句查詢結(jié)果為單記錄的SELECT語(yǔ)句非CURRENT形式的UPDATE語(yǔ)句非CURRENT形式的DELETE語(yǔ)句INSERT語(yǔ)句1 )說(shuō)明
34、性語(yǔ)句 EXEC SQL INCLUDE SQLCA;EXEC SQL BEGIN DECALRE SECTION;EXEC SQL END DECALRE SECTION2 )數(shù)據(jù)定義語(yǔ)句 EXEC SQL CREATE TABLE S(S# char(10), SNchar(10), SSchar(2),SAint, SDchar(5);EXEC SQL DROP TABLE; 數(shù)據(jù)定義語(yǔ)句中不允許使用主變量 EXEC SQL DROP TABLE :tablename; (錯(cuò)誤)3) 數(shù)據(jù)控制語(yǔ)句 EXEC SQL GRANT SELECT ON TABLE S TO U1 4) 查詢結(jié)
35、果為單條記錄SELECT語(yǔ)句 語(yǔ)法 EXEC SQL SELECT ALL|DISTINCT *| , . . INTO , .FROM ,. .WHERE GROUP BY ,HAVING ORDER BY ASC|DESC, ASC|DESC例:EXEC SQL SELECT S#, SN INTO :sno, :sn FROM S WHERE S# =:GivenSno注意:into、where和having子句中均可以使用主變量,需要事先申明。返回值某列為NULL時(shí),系統(tǒng)會(huì)將指示變量賦值為-1,主變量不變。如查詢結(jié)果沒(méi)有滿足條件的記錄,則DBMS置sqlcode值為100,正常有結(jié)果為
36、0。 如結(jié)果不止單條,程序出錯(cuò),SQLCA中包含返回信息5 )非CURRENT形式的UPDATE語(yǔ)句 將課程C01全部提分EXEC SQL UPDATE SC SET GR=GR+:RaiseWHERE C# =C01重新設(shè)置某個(gè)學(xué)生成績(jī)EXEC SQL UPDATE SC SET GR=:newgrWHERE S# =S001將計(jì)算機(jī)系所有同學(xué)成績(jī)置空 Grid=-1EXEC SQL UPDATE SC SET GR=:newgr :grid WHERES# IN (SELECT S# FROM S WHERE SD=CS)等價(jià):EXEC SQL UPDATE SC SET GR=NULL
37、WHERE S# IN (SELECT S# FROM S WHERE SD=CS)6 )非CURRENT形式的DELETE語(yǔ)句例 刪除某學(xué)生的選課情況 EXEC SQL DELETE FROM SC WHERE S# IN(SELECT S# FROM S WHERE SN=:sname) 或者:EXEC SQL DELETE FROM SC WHERE :sname=(SELECT SN FROM S WHERE S.S# = SC.S#)7 )INSERT語(yǔ)句 例:某個(gè)學(xué)生選修了一門(mén)課程 grid=-1;EXEC SQL INSERT INTO SC VALUES (:sno, :cno
38、, :gr :grid);或者:EXEC SQL INSERT INTO SC (S#, C#)VALUES (:sno, :cno);3.7.4使用游標(biāo)的SQL語(yǔ)句 使用游標(biāo)的語(yǔ)句有 查詢結(jié)果為多條記錄的SELECT語(yǔ)句CURRENT形式的UPDATE語(yǔ)句CURRENT形式的DELETE語(yǔ)句1 )查詢結(jié)果為多條記錄的SELECT語(yǔ)句 游標(biāo)在SELECT語(yǔ)句的集合和主語(yǔ)言的一次只能處理一條記錄之間架起橋梁 游標(biāo)步驟說(shuō)明游標(biāo):僅僅是定義,并不執(zhí)行查詢 EXEC SQL DECLARE CURSOR FOR 打開(kāi)游標(biāo):執(zhí)行相應(yīng)的查詢,把結(jié)果放進(jìn)緩沖區(qū),并把指針指向第一條記錄 EXEC SQL OP
39、EN 讀取當(dāng)前記錄并推進(jìn)游標(biāo)指針EXEC SQL FETCH INTO ,. 關(guān)閉游標(biāo):釋放緩沖區(qū)等資源 EXEC SQL CLOSE ; 例:查詢某個(gè)指定系的所有學(xué)生情況EXEC SQL INCLEDE SQLCA; /說(shuō)明性語(yǔ)句EXEC SQL BEGIN DECLARE SECTION; VARCHAR depname5;VARCHAR HSno10;VARCHAR HSname10;VARCHAR HSex2;intHSage;EXEC SQL END DECLARE SECTION; . .gets(depname);. .EXEC SQL DECLARE SX CURSOR FOR
40、 /說(shuō)明游標(biāo)SELECT S# , SN ,SS , SA FROM S WHERE SD = :depname;EXEC SQL OPEN SX; /打開(kāi)游標(biāo)WHILE (1)EXEC SQL FETCH SX INTO :Hsno,:Hsname,:Hsex,:HSage;/讀取當(dāng)前記錄并推進(jìn)游標(biāo)指針if(sqlca.sqlcode!=SUCCESS)break; printf(“%s,%s,%s,%dn”, Hsno, Hsname, Hsex, HSage);. . EXEC SQL CLOSE SX; /關(guān)閉游標(biāo):depname值改變后可以重新打開(kāi)游標(biāo),獲得不同的集合。 2) CUR
41、RENT形式的UPDATE和DELETE語(yǔ)句 操作步驟 說(shuō)明游標(biāo) EXEC SQL DECLARE CURSOR FOR FOR UPDATE OF ; OPEN游標(biāo) FETCH游標(biāo) 檢查是否要修改或刪除,若是執(zhí)行DELETE或UPDATE,并且使用WHERE CURRENT OF 處理完畢CLOSE游標(biāo) 例:檢索某系的學(xué)生,根據(jù)要求處理數(shù)據(jù) . .EXEC SQL INCLEDE SQLCA;EXEC SQL BEGIN DECLARE SECTION;VARCHAR depname5;VARCHAR HSno10;VARCHAR HSname10;VARCHAR HSex2;int HSa
42、ge;EXEC SQL END DECLARE SECTION;. .gets(depname);. .EXEC SQL DECLARE SX CURSOR FORSELECT S# , SN ,SS , SA FROM SWHERE SD =:depname FOR UPDATE OF SA;EXEC SQL OPEN SX;WHILE (1)EXEC SQL FETCH SX INTO :Hsno, :Hsname,:Hsex, :Hsage;if(sqlca.sqlcode!=SUCCESS)break;printf(“%s,%s,%s,%dn”, Hsno, Hsname, Hsex,
43、 HSage);printf(“UPDATE(U) or DELETE(D) or NO(N)?n”);scanf(“%c”,&op);if(op=U)printf(“Input new age:”);scanf(“%d”,&newage);EXEC SQL UPDATE S SET SA=:newage WHERE CURRENT OF SX;else if(OP=D)EXEC SQL DELETE FROM S WHERE CURRENT OF SX;else continue;. . EXEC SQL CLOSE SX;3.7.5動(dòng)態(tài)SQL語(yǔ)句(以SYBASE的ESQL為
44、例)在預(yù)編譯時(shí)無(wú)法獲得如下信息的必須使用動(dòng)態(tài)SQL技術(shù) ,未知信息可能包括:SQL語(yǔ)句正文主變量個(gè)數(shù)主變量數(shù)據(jù)類型SQL語(yǔ)句引用的數(shù)據(jù)對(duì)象l 動(dòng)態(tài)語(yǔ)句的四種實(shí)現(xiàn)方式 (僅介紹方法一)l 特點(diǎn):執(zhí)行語(yǔ)句不能返回任何結(jié)果l 語(yǔ)法 lEXEC SQL EXECUTE IMMEDIATE : host_variable | stringl 例:l EXEC SQL BEGIN DECLARE SECTION;l CS_CHAR sqlstring200;l EXEC SQL END DECLARE SECTION;l char cond150;l strcpy(sqlstring,update tit
45、les set price=price*1.10 where );l printf(Enter search condition:);l scanf(%s, cond);l strcat(sqlstring, cond);l EXEC SQL EXECUTE IMMEDIATE :sqlstring;3.8 存儲(chǔ)過(guò)程*(T-SQL) 語(yǔ)法create procedure cedure_name(parameter_name datatype = defaultoutput, parameter_name datatype = defaultoutput.)with pile
46、as 語(yǔ)言要素:語(yǔ)句塊begin end 變量以開(kāi)始的為用戶變量,以開(kāi)始的為全局變量定義變量:DECLARErowcount 操作影響的行數(shù)sqlstatus游標(biāo)Fetch的狀態(tài) 條件控制 if logical_expressionstatements else if logical_expression statements 循環(huán)控制 while boolean_expression statement break statementcontinue 順序控制 label: goto label 返回值 return integer_expression 打印信息 print format_string | local_variable | global_variable , arg_listselect local_variable | global_variable 執(zhí)行 execute return_status = cedure_name parameter_na
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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新車(chē)車(chē)輛買(mǎi)賣(mài)合同文本
- 2025效力待定合同的善意相對(duì)人是否有撤銷(xiāo)的權(quán)利
- 醫(yī)院聘用員工合同范例
- 做飯雇傭合同范例
- 代理經(jīng)營(yíng)冰淇淋合同范本
- 書(shū)架購(gòu)銷(xiāo)合同范本
- epc合同范例 國(guó)家
- 出讓地協(xié)議合同范本
- 倉(cāng)儲(chǔ)租賃配送合同范本
- 云南裝修合同范例
- 2024版《供電營(yíng)業(yè)規(guī)則》學(xué)習(xí)考試題庫(kù)500題(含答案)
- 福建省醫(yī)院大全
- GB/T 16659-2024煤中汞的測(cè)定方法
- 閃蒸罐計(jì)算完整版本
- (高清版)DZT 0073-2016 電阻率剖面法技術(shù)規(guī)程
- 完整2024年開(kāi)工第一課課件
- 貨運(yùn)車(chē)輛駕駛員安全培訓(xùn)內(nèi)容資料完整
- 高一學(xué)期述職報(bào)告
- 風(fēng)神汽車(chē)4S店安全生產(chǎn)培訓(xùn)課件
- ICU患者的體位轉(zhuǎn)換與床旁運(yùn)動(dòng)訓(xùn)練
- 人教版四年級(jí)上冊(cè)豎式計(jì)算200題及答案
評(píng)論
0/150
提交評(píng)論