6系大三下學(xué)期學(xué)習(xí)數(shù)據(jù)庫講義1_第1頁
6系大三下學(xué)期學(xué)習(xí)數(shù)據(jù)庫講義1_第2頁
6系大三下學(xué)期學(xué)習(xí)數(shù)據(jù)庫講義1_第3頁
6系大三下學(xué)期學(xué)習(xí)數(shù)據(jù)庫講義1_第4頁
6系大三下學(xué)期學(xué)習(xí)數(shù)據(jù)庫講義1_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、第三章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)查詢語言SQL l 3.1 SQL概述 l 3.2數(shù)據(jù)定義語言(DDL) l 3.3 SQL的數(shù)據(jù)查詢(DML) l 3.4 SQL的數(shù)據(jù)更新(DML) l 3.5視圖l 3.6數(shù)據(jù)控制語言(DCL)l 3.7嵌入式SQL語言 l 3.8 存儲過程*(T-SQL) 3.1 SQL概述l SQL(Standard/Structured Query Language)是關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn) l 1986年10月,美國國家標(biāo)準(zhǔn)局(American National Standard Institute ANSI)公布第一個標(biāo)準(zhǔn)ANSI X3.135-1986,國際標(biāo)準(zhǔn)化組織(Inte

2、rnational Organization for Standardization ISO)也通過這一標(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語言的組成 數(shù)據(jù)定義(DDL Data Definition/Description Language ) 定義數(shù)據(jù)庫的邏輯結(jié)構(gòu),包括基本表、視圖、索引等數(shù)據(jù)操縱(DML Data Manipulation Language) 包括查詢和更新,更新又

3、包含插入、刪除和修改 數(shù)據(jù)控制(DCL Data Control Language ) 授權(quán)、完整性規(guī)則描述、事務(wù)控制等 嵌入式SQL(ESQL) 在宿主語言中使用SQL的規(guī)則 3.1.2 SQL語言的特點 綜合統(tǒng)一:集DDL、DML、DCL于一體,語言風(fēng)格統(tǒng)一 面向集合的操作方式:操作對象、查詢結(jié)果都可以是元組的集合 高度非過程化:存取路進透明。以統(tǒng)一的語法結(jié)構(gòu)提供兩種使用方式:自含式、嵌入式 語言簡潔,易學(xué)易用,主要共使用11個關(guān)鍵詞 DDL:create drop alter DML:select insert delete update DCL:grant revoke commit

4、rollback 3.2數(shù)據(jù)定義語言(DDL) 3.2.1定義、刪除與修改基本表 定義基本表語法 CREATE TABLE (列級約束條件,列級約束條件. .,)例:CREATE TABLE S(SCHAR(5) NOT NULL UNIQUE,SNCHAR(20),SA INT,SD CHAR(3),PRIMARY KEY (S#)); 修改表語法 ALTER TABLE ADD 列級約束條件DROP MODIFY ; 例:ALTER TABLE S ADD SCome DATE;ALTER TABLE S MODIFY SA SMALLINT;ALTER TABLE S DROP UNIQ

5、UE(S#); 刪除表語法 DROP TABLE 例:DROP TABLE S 3.2.2建立和刪除索引索引的建立語法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) 索引的刪除語法DROP INDEX .DROP INDEX S.S_S# 3.3 SQL的數(shù)據(jù)查詢(DML) l 關(guān)系代數(shù)表達式 lA1,A2,.An

6、(F (R1R2. .Rn) l SQL 語句l SELECT A1,A2,.Anl FROM R1,R2,. .Rml WHERE F詳細語法 SELECT ALL|DISTINCT *| , . .FROM ,. .WHERE GROUP BY , HAVING ORDER BY ASC|DESC, ASC|DESC執(zhí)行過程 1)先按WHERE子句條件從FROM子句指定的表/視圖中找出滿足條件的元組(選擇);2)再按SELECT子句中的目標(biāo)表達式選擇出元組中的屬性,形成結(jié)果表(投影);3)如有GROUP子句,則將結(jié)果按的值分組,該值相等的元組為一個組,通常會在每組中使用聚合函數(shù)。4)如果G

7、ROUP子句帶HAVING子句,則對組過慮,將滿足條件的組輸出5)如果ORDER子句,則將結(jié)果按的值升序或降序排列3.3.1單表查詢 假設(shè):S(S#,SN,SS,SA,SD) C(C#,CN,CP,CR) SC(S#,C#,GR)選取表中的某些列,即投影運算 查指定列 SELECT S#,SN FROM S 查全部列 SELECT * FROM STUDENT 查經(jīng)過計算的列 SELECT SN,2005-SA FROM S 選擇表中的若干元組,即選擇運算消除取值重復(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門的課學(xué)生學(xué)號 表3.3.2連接查詢等值與非等值連接查詢 自然連接 SELECT S.*,SC.* FROM S,SC WHERE S.S# = SC.S# 自身連接檢索每門課的間接預(yù)修課 SELECT f.C#, s.CP FROM C f,C s WHERE f.CP=s.C# CCNCPCR1DB542MA23IS144OS635DataStruct746DataProcess27PASCAL64CCNPCR1DB542MA23IS144OS635DataStruct74

11、6DataProcess27PASCAL64表外連接 列出所有學(xué)生的修課情況,如果沒有選課也列出其基本信息(左外連接)SELECT S#,SN,SS,SA,SD,C#,GR FROM S, SCWHERE S.S# *=SC.S# (T-SQL語法 SYBASE)SELECT S#,SN,SS,SA,SD,C#,GR FROM S, SCWHERE S.S# =SC.S#(+) (PL/SQL語法ORACLE)SELECT S#,SN,SS,SA,SD,C#,GR FROM S LEFT OUTER JION SC ON S.S#=SC.S#(MYSQL MSSQL)表復(fù)合條件連接 檢索選修課

12、程號2且成績在90分以上的所有學(xué)生 SELECT S.S# ,SN FROM S,SC WHERE S.S# = SC.S# AND SC.C#=2 AND SC.GR=90檢索每個學(xué)生選修的課程名及其成績 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劉晨)本例可以通過自連接來實現(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é)號和姓名 SELECT S#, SN FROM S WHERE S# IN (SELECT S# FROM SC WHERE C# IN (SELECT C# FROM C WHERE CN=MA) )本例同樣可以用連接來實現(xiàn) SELECT S#,SN FROM S ,SC,C WHERE S.S# = SC.S# AND SC.C# = C.C#AND C.CN=MA 表帶比較運算的子查詢 當(dāng)確定子查詢的返回值是唯一時,可以使用比較

14、運算符(注意子查詢在比較符后)SELECT S#,SN FROM S WHERE SD=(SELECT SD FROM S WHERE CN=劉晨) 帶ANY和ALL的子查詢(子查詢返回多值時用)檢索其他系中比IS系任一學(xué)生年齡小的學(xué)生名單 SELECT S,SN FROM S WHERE SA ANY(SELECT SA FROM S WHERE SDIS)AND SDISORDER BY SA DESC等價于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 等價于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) 檢索所有選修了課程號為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)。 等價連接實現(xiàn):SELECT SN FROM S,SC WHERE S.S# = SC.S# AND C# = 1 qSQL中沒有(x)p,故須轉(zhuǎn)換為(x(p) q如檢索選修了全部課程的學(xué)生,即沒有一門課沒有選的學(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)被等價為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即不存在這么一門課程,學(xué)生S001選修了而x沒有選修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集合查詢使用交、并、差的集合運算概念,INTERSECT ,UNION,MINUS 檢索計算機科學(xué)系及年

18、齡不大于19歲的學(xué)生 SELECT * FROM S WHER SD=CSUNION SELECT * FROM S WHERE SA19等價于:SELECT * FROM S WHERE SDCS OR SA =19檢索選修了課程號為C01或C02的學(xué)生學(xué)號SELECT S# FROM SC WHERE CC01UNION SELECT S# FROM SC WHERE CC02等價于:SELECT S# FROM SC WHERE C# IN (C01,C02)q檢索同時選修了課程號為C01和C02的學(xué)生學(xué)號 qSELECT S# FROM SC WHERE CC01qINTERSECTq

19、SELECT S# FROM SC WHERE CC02(僅ORACLE)q等價于:qSELECT S# FROM SC WHERE C# = C01 AND S# INq(SELECT S# FROM SC WHERE C# = C02)q檢索選修了課程號為C01而未選修C02的學(xué)生學(xué)號。qSELECT S# FROM SC WHERE C#C01qMINUS qSELECT S# FROM SC WHERE C#C02(僅ORACLE)q等價于: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ù)插入 插入單個元組 語法:INSERT INTO ( , .)VALUES(,.) INSERT INTO S VALUES(S001,張三,男,18,IS)插入子查詢結(jié)果 語法:INSERT INTO ( , .)例:為所有學(xué)生插入一條選修C01課程的記錄INSERT INTO SC SELECT S#,C01,null FROM S 3.4.2數(shù)據(jù)修改 語法:UPDATE SET , . WHERE ; 修改某一個元組的值 將學(xué)生S001的年齡該為22歲 UPDATE S SET SA=22 WHERE S# =S001 修改多個元組

21、的值 將所有的學(xué)生年齡增加1歲 UPDATE S SET SASA1帶子查詢的修改語句 將計算機科學(xué)系所有的學(xué)生成績置零 UPDATE SC SET GR=0WHERE CS = (SELECT SD FROM S WHERE S# = SC.S#) (相關(guān)子查詢) 不同的DBMS可以使用join實現(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ù)庫的一致性 如同時修改S和S

22、C兩表中的S#的值為了保證數(shù)據(jù)庫的一致性,引入事務(wù)概念 3.4.3數(shù)據(jù)刪除 語法: DELETE FROM WHERE ;刪除某一個元組的值 刪除學(xué)號為S001的學(xué)生 DELETE FROM S WHERE S#=S001 刪除多個元組的值 刪除所有學(xué)生的選課記錄 DELETE FROM SC 帶子查詢的刪除語句 刪除計算機科學(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視圖 視圖只是一個窗口,其數(shù)據(jù)依賴于基本表 3.5.1定義視圖 建立視圖 語法 :CREATE VIEW (,.)AS WITH CHECK OPTION 列名在以下情況必須列出子查詢的目標(biāo)列是集函數(shù)等,不是單純的列 多表連接時出現(xiàn)同名的列作為視圖字段 需要在視圖中啟用新的名字 WITH CHECK OPTION 表示對視圖更新時自動驗證子查詢條件 行列子集視圖:若一個視圖是從單個基本表導(dǎo)出的,并且只是去掉了基本表的某些行和某些列,但保留了碼,稱行列子集視圖 例:建立學(xué)生視圖 CREATE VIEW IS_S ASSELECT S#, SN , SA FROM SWHE

24、RE SD=IS 建立信息系選修了C1號課程的學(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課程且成績在90以上的學(xué)生視圖 lCREATE VIEW IS_S2 AS lSELECT S#, SN, GR FROM IS_S1 WHERE GR=90l 其它視圖建立例子l 建立一個反映學(xué)生出生年月的視圖 lCREATE VIEW BT_S(S,SN,SB)AS lSEL

25、ECT S#, SN,2003SA FROM S l 建立一個學(xué)生學(xué)號和平均成績的視圖 lCREATE VIEW S_G(S,AVG_GR)AS lSELECT S#, AVG(GR) FROM SC GROUP BY S# 建立一個女學(xué)生的視圖 CREATE VIEW S_F(S,SN,SS,SA,SD)AS SELECT * FROM S WHERE SS=女 本視圖在S表結(jié)構(gòu)改變時會出錯,解決辦法是去掉列說明或改*為列表刪除視圖 語法DROP VIEW 例子:刪除視圖IS_SDROP VIEW IS_S 3.5.2查詢視圖 把對視圖的查詢轉(zhuǎn)化為對基本表的查詢稱為視圖的消解(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# (錯誤)SELECT S#, AVG(GR) FROM SC GROUP BY S# HAVING AVG(GR)90 (正確)3.5.3更新視圖 視圖的修改 將信息系學(xué)生視圖中學(xué)號為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(錯

28、誤)不運行更新的視圖規(guī)則 由兩個以上基本表導(dǎo)出的視圖 視圖的字段來自常數(shù)或表達式,只運行DELETE 視圖的字段來自集函數(shù) 視圖中含有GROUP BY子句 視圖中含有DISTINCT語句 視圖定義有嵌套查詢,且內(nèi)層查詢涉及到導(dǎo)出本視圖的基本表 不允許更新的視圖上定義的視圖 3.5.4視圖的用途視圖能簡化用戶的操作視圖可以使用戶多角度看待同一數(shù)據(jù) 視圖對重構(gòu)數(shù)據(jù)庫提供了一定的邏輯獨立性例如:S(S#, SN, SS, SA, SD)需要拆分為 SX(S#,SN, SS, SA), SY(S#, SD)則可以通過視圖來保證應(yīng)用不需改變CREATE VIEW S AS SELECT SX.S#, S

29、N, SS, SA, SD FROM SX, SY WHERE SX.S# = SY.S#視圖能對數(shù)據(jù)提供安全保護 3.6數(shù)據(jù)控制語言(DCL) 3.6.1授權(quán) 語法 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)限語法 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語言 SQL語言是非過程的,而應(yīng)用大多是過程化的

31、,故通過高級語言來彌補SQL過程控制的不足.將SQL嵌入(Embedded SQL )高級語言(宿主語言)來執(zhí)行,稱嵌入式SQL語言(簡稱ESQL)。 3.7.1嵌入式SQL的一般形式 對于ESQL的處理,DBMS一般有兩種處理方式: 預(yù)編譯修改和擴充宿主語言以處理SQLESQL一般形式:EXEC SQL ESQL根據(jù)其作用不同分為兩類 :可執(zhí)行語句說明性語句 可執(zhí)行語句包括DDL、DML、DCL。兩類SQL語句應(yīng)和宿主語言兩類語句出現(xiàn)在同一地方 3.7.2嵌入式SQL語句與主語言之間的通信數(shù)據(jù)庫工作單元和主語言工作單元之間的通信有向主語言傳遞SQL語句的執(zhí)行狀態(tài)主語言向SQL語句提供參數(shù) 將

32、SQL語句查詢數(shù)據(jù)庫結(jié)果交主語言進一步處理 相應(yīng)地通過SQLCA、主變量、游標(biāo)來實現(xiàn) SQL通信區(qū) SQLCA(SQL Communication Area)是一個數(shù)據(jù)結(jié)構(gòu),定義語句 EXEC SQL INCLUDE SQLCA ;SQLCODE反映每次執(zhí)行SQL語句的結(jié)果 主變量 主要功能:ESQL可以使用主語言的變量來輸入和輸出數(shù)據(jù) 分類:輸入、輸出主變量、指示變量使用方法 所有主變量必須在定義區(qū)定義(BEGIN DECLARE SECTION、END DECLARE SECTION)可以在SQL中任意表達式的對方出現(xiàn)在SQL語句中,主變量前要加:,而在主語言中不必加。指示變量用于為輸入變

33、量賦空值或指示輸出變量是否空值 游標(biāo) 使用原因:SQL語句是面向集合的,而主語言是面向記錄的主語言和SQL語言的分工 SQL語言負責(zé)直接與數(shù)據(jù)庫打交道主語言用來控制程序流程以及對SQL的執(zhí)行結(jié)構(gòu)進一步處理SQL語言用主變量從主語言接受執(zhí)行參數(shù)操作數(shù)據(jù)庫SQL語言的執(zhí)行狀態(tài)由DBMS送至SQLCA-主語言從SQLCA取出狀態(tài)信息,據(jù)此決定下一步操作。SQL的執(zhí)行結(jié)果通過主變量或游標(biāo)傳給主語言處理3.7.3不使用游標(biāo)的SQL語句 說明性語句數(shù)據(jù)定義語句數(shù)據(jù)控制語句查詢結(jié)果為單記錄的SELECT語句非CURRENT形式的UPDATE語句非CURRENT形式的DELETE語句INSERT語句1 )說明

34、性語句 EXEC SQL INCLUDE SQLCA;EXEC SQL BEGIN DECALRE SECTION;EXEC SQL END DECALRE SECTION2 )數(shù)據(jù)定義語句 EXEC SQL CREATE TABLE S(S# char(10), SNchar(10), SSchar(2),SAint, SDchar(5);EXEC SQL DROP TABLE; 數(shù)據(jù)定義語句中不允許使用主變量 EXEC SQL DROP TABLE :tablename; (錯誤)3) 數(shù)據(jù)控制語句 EXEC SQL GRANT SELECT ON TABLE S TO U1 4) 查詢結(jié)

35、果為單條記錄SELECT語句 語法 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時,系統(tǒng)會將指示變量賦值為-1,主變量不變。如查詢結(jié)果沒有滿足條件的記錄,則DBMS置sqlcode值為100,正常有結(jié)果為

36、0。 如結(jié)果不止單條,程序出錯,SQLCA中包含返回信息5 )非CURRENT形式的UPDATE語句 將課程C01全部提分EXEC SQL UPDATE SC SET GR=GR+:RaiseWHERE C# =C01重新設(shè)置某個學(xué)生成績EXEC SQL UPDATE SC SET GR=:newgrWHERE S# =S001將計算機系所有同學(xué)成績置空 Grid=-1EXEC SQL UPDATE SC SET GR=:newgr :grid WHERES# IN (SELECT S# FROM S WHERE SD=CS)等價:EXEC SQL UPDATE SC SET GR=NULL

37、WHERE S# IN (SELECT S# FROM S WHERE SD=CS)6 )非CURRENT形式的DELETE語句例 刪除某學(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語句 例:某個學(xué)生選修了一門課程 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語句 使用游標(biāo)的語句有 查詢結(jié)果為多條記錄的SELECT語句CURRENT形式的UPDATE語句CURRENT形式的DELETE語句1 )查詢結(jié)果為多條記錄的SELECT語句 游標(biāo)在SELECT語句的集合和主語言的一次只能處理一條記錄之間架起橋梁 游標(biāo)步驟說明游標(biāo):僅僅是定義,并不執(zhí)行查詢 EXEC SQL DECLARE CURSOR FOR 打開游標(biāo):執(zhí)行相應(yīng)的查詢,把結(jié)果放進緩沖區(qū),并把指針指向第一條記錄 EXEC SQL OP

39、EN 讀取當(dāng)前記錄并推進游標(biāo)指針EXEC SQL FETCH INTO ,. 關(guān)閉游標(biāo):釋放緩沖區(qū)等資源 EXEC SQL CLOSE ; 例:查詢某個指定系的所有學(xué)生情況EXEC SQL INCLEDE SQLCA; /說明性語句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、 /說明游標(biāo)SELECT S# , SN ,SS , SA FROM S WHERE SD = :depname;EXEC SQL OPEN SX; /打開游標(biāo)WHILE (1)EXEC SQL FETCH SX INTO :Hsno,:Hsname,:Hsex,:HSage;/讀取當(dāng)前記錄并推進游標(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值改變后可以重新打開游標(biāo),獲得不同的集合。 2) CUR

41、RENT形式的UPDATE和DELETE語句 操作步驟 說明游標(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動態(tài)SQL語句(以SYBASE的ESQL為

44、例)在預(yù)編譯時無法獲得如下信息的必須使用動態(tài)SQL技術(shù) ,未知信息可能包括:SQL語句正文主變量個數(shù)主變量數(shù)據(jù)類型SQL語句引用的數(shù)據(jù)對象l 動態(tài)語句的四種實現(xiàn)方式 (僅介紹方法一)l 特點:執(zhí)行語句不能返回任何結(jié)果l 語法 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 存儲過程*(T-SQL) 語法create procedure cedure_name(parameter_name datatype = defaultoutput, parameter_name datatype = defaultoutput.)with pile

46、as 語言要素:語句塊begin end 變量以開始的為用戶變量,以開始的為全局變量定義變量: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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論