版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1數(shù)據(jù)庫原理(2015-2016)宋安平上海大學計算機學院1015室Apsong@第1周—第4周答疑時間:周三9-10,1001GGG2“數(shù)據(jù)庫原理”課程的特點:理論性:關(guān)系運算理論、模式設計理論等;實用性:數(shù)據(jù)庫語言、數(shù)據(jù)庫設計;可操作性:較強,有大量問題和應用值得分析和設計;
創(chuàng)新性:有許多深層的問題具有發(fā)展的余地,有待去挖掘、發(fā)現(xiàn)和總結(jié)。
3課程教學目的和要求:掌握數(shù)據(jù)庫系統(tǒng)的基本概念和原理;理解SQL、關(guān)系代數(shù)和關(guān)系演算等數(shù)據(jù)庫語言;學會關(guān)系數(shù)據(jù)庫規(guī)范設計的方法和步驟;了解數(shù)據(jù)庫系統(tǒng)的實現(xiàn)技術(shù);具備使用關(guān)系數(shù)據(jù)庫軟件開發(fā)數(shù)據(jù)庫應用系統(tǒng)的能力。4《數(shù)據(jù)庫原理一》課堂教學+研討(30學時)內(nèi)容及安排:第四章結(jié)構(gòu)化查詢語言SQL(12學時)第一章數(shù)據(jù)庫發(fā)展史(3學時)第二章數(shù)據(jù)庫系統(tǒng)結(jié)構(gòu)(3學時)第六章實體聯(lián)系模型(3學時)第三章關(guān)系運算(6學時)習題分析、總復習(3學時)5實驗內(nèi)容和安排(20學時)
:見WORD附件寫實驗報告6第4章結(jié)構(gòu)化查詢語言SQLSQL概述SQL的數(shù)據(jù)定義SQL的數(shù)據(jù)查詢SQL的數(shù)據(jù)更新視圖嵌入式SQL2023/2/57第一節(jié)SQL概述
SQL發(fā)展歷程SQL數(shù)據(jù)庫的體系結(jié)構(gòu)SQL的組成8一、SQL發(fā)展歷程SQL(StructuredQueryLanguage)語言是1974年提出的在IBM公司的SystemR上實現(xiàn)。是介于關(guān)系代數(shù)和關(guān)系演算之間的語言。1986年ANSI批準SQL作為關(guān)系數(shù)據(jù)庫語言的美國標準,同年,ISO也同樣決定。以后相繼出現(xiàn)SQL89,SQL2(1992),SQL3(1999)。9二、SQL數(shù)據(jù)庫的體系結(jié)構(gòu)SQL支持數(shù)據(jù)庫的三級模式結(jié)構(gòu),如圖4―1所示。從圖中可以看出,模式與基本表相對應,外模式與視圖相對應,內(nèi)模式對應于存儲文件?;颈砗鸵晥D都是關(guān)系。1.基本表(BaseTable)基本表是模式的基本內(nèi)容。每個基本表都是一個實際存在的關(guān)系。10圖4―1SQL支持的數(shù)據(jù)庫模式
11二、SQL數(shù)據(jù)庫的體系結(jié)構(gòu)2.視圖(View)視圖是外模式的基本單位,用戶通過視圖使用數(shù)據(jù)庫中基于基本表的數(shù)據(jù)(基本表也可作為外模式使用)。視圖是虛表,實際并不存在,只有定義存放在數(shù)據(jù)字典中。12二、SQL數(shù)據(jù)庫的體系結(jié)構(gòu)3.存儲文件存儲文件是內(nèi)模式的基本單位。每一個存儲文件存儲一個或多個基本表的內(nèi)容。一個基本表可有若干索引,索引也存儲在存儲文件中。存儲文件的存儲結(jié)構(gòu)對用戶是透明的。下面將介紹SQL的基本語句。各廠商的RDBMS實際使用的SQL語言,與標準SQL語言都有所差異及擴充。因此,具體使用時,應參閱實際系統(tǒng)的有關(guān)手冊13三、SQL的組成數(shù)據(jù)定義DDL:CREATE、DROP、ALTER數(shù)據(jù)操縱DML:數(shù)據(jù)查詢DQL:SELECT數(shù)據(jù)操縱DML:INSERT、DELETE、UPDATE數(shù)據(jù)控制DCL:GRANT、REVOKE嵌入式SQL14第二節(jié)SQL的數(shù)據(jù)定義
SQL模式的創(chuàng)建和撤消SQL提供的基本數(shù)據(jù)類型基本表的創(chuàng)建、修改和撤消索引的創(chuàng)建和撤消15一、SQL模式的創(chuàng)建和撤消
SQL模式的創(chuàng)建CREATESCHEMA<模式名>AUTHORIZATION<用戶名>SQL模式的撤消DROPSCHEMA<模式名>[CASCADE|RESTRICT]16二、SQL提供的基本數(shù)據(jù)類型各具體DBMS所提供的數(shù)據(jù)類型是不同的。但下面的數(shù)據(jù)類型幾乎都是支持的:INT或INTEGER全字長二進制整數(shù)SMALLINT半字長二進制整數(shù)DEC(p[,q])或壓縮十進制數(shù),共p位,其中小數(shù)點后有q位,F(xiàn)LOAT雙字長的浮點數(shù)CHAR(n)或CHARTER(n)長度為n的定長字符串VARCHAR(n)最大長度為n的變長字符串DATE日期型,格式為YYYY―MM―DDTIME時間型,格式為HH.MM.SS17三、基本表的創(chuàng)建、修改和撤消基本表的創(chuàng)建——CREATETABLECREATETABLE<表名>(<列名1><類型>[<該列的完整性約束>][,<列名2><類型>[<該列的完整性約束>]]…
[<,表級完整性約束>])<該列的完整性約束>:該列上數(shù)據(jù)必須符合的條件。最常見的有:NOTNULL該列值不能為空NULL該列值可以為空UNIQUE該列值不能有相同者DEFAULT該列上某值未定義時的默認值<表級完整性約束>:對整個表的一些約束條件,常見的有定義主碼(外碼),各列上數(shù)據(jù)必須符合的關(guān)聯(lián)條件等。18三、基本表的創(chuàng)建、修改和撤消例如:有一個學生數(shù)據(jù)庫中,有三個關(guān)系S(Sno,SName,Age,Sex,Sdept)C(Cno,CName,Tname)SC(Sno,Cno,Grade)19Createtables(snochar(4)notnull,snamechar(8),ageint,sexchar(2),primarykeysno);Createtablec(cnochar(4)notnull,cnamechar(10),tnamechar(8),primarykeycno);Createtablesc(snochar(4)notnull,cnochar(4)notnull,gradeint,primarykey(sno,cno),foreignkeysnoreferences(sno),foreignkeycnoreferencec(cno),check(gradebetween0and100));20三、基本表的創(chuàng)建、修改和撤消基本表結(jié)構(gòu)的修改——ALTERTABLE基本表的結(jié)構(gòu)是可以隨環(huán)境的變化而修改的,即根據(jù)需要增加、修改或刪除其中一列(或完整性約束條件等)。ALTERTABLE<表名>[ADD<列名><數(shù)據(jù)類型>[完整性約束]][DROP<列名>][MODIFY<列名><數(shù)據(jù)類型>[完整性約束]]21三、基本表的創(chuàng)建、修改和撤消基本表的撤消——DROPTABLEDROP
TABLE<表名>[CASCADE|RESTRICT]此語句一執(zhí)行,指定的表即從數(shù)據(jù)庫中刪除(表被刪除,表在數(shù)據(jù)字典中的定義也被刪除),此表上建立的索引和視圖也被自動刪除(有些系統(tǒng)對建立在此表上的視圖的定義并不刪除,但也無法使用了)。22四、索引的創(chuàng)建和撤消索引的建立——CREATEINDEX在一個基本表上,可建立若干索引。有了索引,可以加快查詢速度。索引的建立和刪除工作由DBA或表的屬主(建表人)負責。用戶在查詢時并不能選擇索引,選擇索引的工作由DBMS自動進行。
CREATE[UNIQUE]INDEX<索引名>ON<表名>(<列名>[ASC|DESC])…
本語句為規(guī)定<表名>建立一索引,索引名為<索引名>。23四、索引的創(chuàng)建和撤消刪除索引——DROPINDEX索引太多,索引的維護開銷也將增大。因此,不必要的索引應及時刪除。DROPINDEX<索引名>本語句將刪除規(guī)定的索引。該索引在數(shù)據(jù)字典中的描述也將被刪除。24第三節(jié)SQL的數(shù)據(jù)查詢SELECT語句的基本格式舉例說明25一、SELECT語句的基本格式SELECT[DISTINCT]*|<目標列表達式[別名]清單>FROM<關(guān)系名[別名]或視圖名清單>
[WHERE<查詢條件表達式>][GROUPBY列名清單[HAVING<組條件表達式>]][ORDERBY列名[ASC|DESC],…]26整個語句的執(zhí)行過程如下:1、讀取FROM子句中基本表、視圖的數(shù)據(jù),執(zhí)行笛卡爾積操作。2、選取滿足WHERE子句中給出的條件表達式的元組。3、按GROUP子句中指定列的值分組,同時提取滿足HAVING子句中組條件表達式的那些組。4、按SELECT子句中給出的列名或列表達式求值輸出。5、ORDER子句對輸出的目標表進行排序,按附加說明ASC升序排列,或按DESC降序排列。27SELECT語句中:
WHERE子句稱為“行條件子句”,
GROUP子句稱為“分組子句”,
HAVING子句稱為“組條件子句”,
ORDER子句稱為“排序子句”。28在WHERE子句的行條件表達式中可使用下列運算符:算術(shù)比較運算符:<,<=,>,>=,=,<>或?。剑贿壿嬤\算符:AND,OR,NOT;集合成員資格運算符:IN,NOTIN;謂詞:EXISTS,ALL,SOME,UNIQUE;聚合函數(shù):AVG,MIN,MAX,SUM,COUNT;集合運算符:UNION,INTERSECT,EXCEPT。29二、舉例說明單表查詢--選擇列選擇表中的若干列
1.查詢指定列
例:查詢學生的學號和姓名
2.查詢?nèi)苛校菏褂?表示所有屬性
例:查詢?nèi)w學生的詳細情況
3.查詢經(jīng)過計算的值:表達式可用別名代替
例:查詢學生的姓名和出生年份
注意:字段名稱AS別名
字段名稱別名
別名=字段名稱
4.消除取值重復的行 例查詢選課的學生學號30單表查詢—選擇行1.比較大小:比較運算符>>=<<==<>
例:查詢1980年以后出生的學生的基本情況2.確定范圍:列名[NOT]BETWEEN<下限>AND<上限>例:查詢年齡在20到25之間的學生姓名3.確定集合:列名[NOT]IN(<值序列>例:查詢選擇了c1、c4、c6課號的學生學號和成績4.涉及空值的查詢:列名IS[NOT]NULL例:列出所有成績?yōu)榭盏膶W生學號5.字符匹配:列名[NOT]LIKE‘<匹配串>’
通配符:%表示任意多個字符王%%衛(wèi)%%衛(wèi)
_表示任意一個字符_衛(wèi)___千__平%王__ 例:查詢姓名中包含“敏”的學生姓名查詢所有劉姓、王姓且為雙名的學生姓名
31單表查詢—聚合函數(shù)1.COUNT([DISTINCT]*)統(tǒng)計元組的個數(shù)2.COUNT([DISTINCT]<列名>)統(tǒng)計一列中值的個數(shù)3.SUM([DISTINCT]<列名>)計算一列值的總和4.AVG([DISTINCT]<列名>)計算一列值的平均值5.MAX([DISTINCT]<列名>)求一列值中的最大值6.MIN([DISTINCT]<列名>)求一列值中的最小值例:查詢選過課的學生人數(shù)查詢選課次數(shù)查詢最大和最小年齡統(tǒng)計有多少名年齡超過19歲的女同學查詢學號s1的學生考試成績的平均分和總分32單表查詢—分組排序查詢結(jié)果分組查詢每類課的學生人數(shù) 查詢選課一門以上的學生學號 統(tǒng)計男女同學的人數(shù)和平均年齡查詢每門課程都超過70分的學生學號查詢結(jié)果排序查詢每門課的學生人數(shù)和總成績,查詢結(jié)果按總成績升序,人數(shù)降序排列統(tǒng)計每個學生選修課程的門數(shù)(超過5門的學生才統(tǒng)計)。要求輸出學生學號和選修門數(shù),查詢結(jié)果按門數(shù)降序排列,若門數(shù)相同,按學號升序排列33
聯(lián)接操作
聯(lián)接條件可在WHERE中指定也可以在FROM子句中指定。
在FROM子句中指定聯(lián)接條件時,SQL2將
聯(lián)接操作符分成:
聯(lián)接類型、聯(lián)接條件。
聯(lián)接類型:決定了如何處理聯(lián)接條件中不匹配的元組。聯(lián)接條件:決定了兩個關(guān)系中哪些元組應該匹配。聯(lián)接類型中的OUTER字樣可不寫。34聯(lián)接類型聯(lián)接類型說明INNERJOIN內(nèi)聯(lián)接:LEFTOUTERJOIN左外聯(lián)接:RIGHTOUTERJOIN右外聯(lián)接:FULLOUTERJOIN完全外聯(lián)接:CROSSJOIN交叉聯(lián)接:結(jié)果為兩個聯(lián)接表中的匹配行的聯(lián)接。
結(jié)果包括“左”表(出現(xiàn)在JOIN子句的最左邊)中的所有行。不包括右表中的不匹配行。
結(jié)果包括“右”表(出現(xiàn)在JOIN子句的最右邊)中的所有行。不包括左表中的不匹配行。結(jié)果包括所有聯(lián)接表中的所有行,不論它們是否匹配
結(jié)果包括兩個聯(lián)接表中所有可能的行組合。交叉聯(lián)接返回的是兩個表的笛卡兒積35多表連接查詢自身連接查詢選課二門或二門以上的學生學號檢索選修c1和c2課的學生學號,姓名復合條件連接查找選修了VB課程且成績在70分以上的姓名及成績。查詢每門課程都超過70分的學生學號、姓名。統(tǒng)計每個學生選修課程的門數(shù)(超過5門的學生才統(tǒng)計)。要求輸出學生學號、姓名和選修門數(shù),查詢結(jié)果按門數(shù)降序排列,若門數(shù)相同,按學號升序排列。36相關(guān)子查詢帶有謂詞IN的子查詢例:查詢選修了課程號為c2的課程的學生姓名 查詢選修了數(shù)據(jù)庫原理課程的學生姓名帶有謂詞ANY和ALL的比較子查詢例:查詢平均成績超過所有女學生成績的男學生的學生學號和姓名帶有謂詞EXISTS的子查詢:返回子查詢是邏輯值例:查詢沒有選修c2課程的學生姓名 查詢所有學生都選修的課程號和課程名 求選修學號為S3的學生所修全部課程的學生號碼37第四節(jié)
SQL的數(shù)據(jù)更新數(shù)據(jù)插入數(shù)據(jù)刪除數(shù)據(jù)修改38一、數(shù)據(jù)插入
INSERTINTO<表名>[(<屬性名清單>)]VALUES(元組值);INSERTINTO<表名>(<屬性名清單>)
VALUES(元組值),(元組值),…
;INSERTINTO<表名>[(<屬性名清單>)]
(子查詢);把子查詢的結(jié)果插入指定的<表名>中。這樣的一條INSERT語句,可以一次插入多條元組。例:創(chuàng)建一個含有學號、姓名和課程名的新表,然后將男同學的相關(guān)數(shù)據(jù)插入到新表中39二、數(shù)據(jù)刪除
DELETEFROM<表名>
[WHERE<帶有子查詢的條件表達式>]本語句將刪除使<帶有子查詢的條件表達式>為真的所有元組。例:刪除沒選修任何一門課的學生信息把課程名為”數(shù)據(jù)庫原理”的成績從表SC中刪除40三、數(shù)據(jù)修改
UPDATE<表名>SET<列名>=<表達式>
[,<列名>=<表達式>……][WHERE<帶有子查詢的條件表達式>]本語句執(zhí)行時,將修改使<帶有子查詢的條件表達式>為真的所有元組。例:對低于70分的增加5%,高于等于70分的增加4%把課程名為”數(shù)據(jù)庫原理”的成績提高10%41第五節(jié)
視圖視圖的定義視圖的查詢視圖的更新視圖的優(yōu)點42一、視圖的定義
一個視圖是從一個或多個關(guān)系(基本表或已有的視圖)導出的關(guān)系。視圖是虛表,導出后,數(shù)據(jù)庫中只存有此視圖的定義(在數(shù)據(jù)字典中),但并沒有實際生成此關(guān)系。視圖一經(jīng)定義就可以象基本表一樣進行查詢和更新。43一、視圖的定義
CREATEVIEW<視圖名>[<列名清單>]
AS<子查詢>
[WITHCHECKOPTION]若有<列名清單>,則此清單給出了此視圖的全部屬性的屬性名;否則,此視圖的所有屬性名即為子查詢中SELECT語句中的全部目標列。有[WITHCHECKOPTION]時,則今后對此視圖進行INSERT、UPDATE和DELETE操作時,系統(tǒng)會自動檢查視圖是否符合原定義視圖時子查詢中的<條件表達式>。44例:在教學數(shù)據(jù)庫中基本表SC上,建立一個學生學習情況視圖:
CREATEVIEWS_GRADE(SNO,C_NUM,AVG_GRADE) AS(SELECTSNO,COUNT(CNO),AVG(GRADE) FROMSC GROUPBYSNO);45一、視圖的定義
DROPVIEW<視圖名>此語句將把指定視圖的定義從數(shù)據(jù)字典中刪除。一個關(guān)系(基本表或視圖)被刪除后,所有由該關(guān)系導出的視圖并不自動刪除,它們?nèi)栽跀?shù)據(jù)字典中,但已無法使用。例:撤消S_GRADE視圖,可用下列語句實現(xiàn):
DROPVIEWS_GRADE;46二、視圖的查詢
DBMS對某SELECT語句進行處理時,若發(fā)現(xiàn)被查詢對象是視圖,則DBMS將進行下述操作:
(1)從數(shù)據(jù)字典中取出視圖的定義。
(2)把視圖定義的子查詢和本SELECT的查詢相結(jié)合,生成等價的對基本表的查詢(此過程稱為視圖的消解)。
(3)執(zhí)行對基本表的查詢,把查詢結(jié)果(作為本次對視圖的查詢結(jié)果)向用戶顯示。47三、視圖的查詢系統(tǒng)在實現(xiàn)對視圖的查詢時,根據(jù)數(shù)據(jù)字典的定義將對視圖的查詢轉(zhuǎn)換為對基本表的查詢。例:對學生學習情況視圖執(zhí)行如下操作:① SELECT*FROMS_GRADE;
相應的查詢轉(zhuǎn)換操作如下:
SELECTSNO,COUNT(CNO)ASC_NUM,AVG(GRADE)ASAVG_GRADEFROMSCGROUPBYSNO;48② SELECTSNO,C_NUM FROMS_GRADEWHEREAVG_GRADE>80;
相應的查詢轉(zhuǎn)換操作如下:SELECTSNO,COUNT(CNO)ASC_NUMFROMSCGROUPBYSNOHAVINGAVG(GRADE)>80;49③ SELECTSNO,AVG_GRADE FROMS_GRADEWHEREC_NUM>(SELECTC_NUMFROMS_GRADEWHERESNO=‘S4’);
相應的查詢轉(zhuǎn)換操作如下:SELECTSNO,AVG(GRADE)ASAVG_GRADEFROMSCGROUPBYSNOHAVINGCOUNT(CNO)>(SELECTCOUNT(CNO)FROMSCGROUPBYSNOHAVINGSNO=‘S4’);50三、視圖的更新
視圖是虛表,是沒有數(shù)據(jù)的。所謂視圖的更新,表面上是對視圖執(zhí)行INSERT、UPDATE和DELETE來更新視圖的數(shù)據(jù),其實質(zhì)是由DBMS自動轉(zhuǎn)化成對導出視圖的基本表的更新,轉(zhuǎn)化成對基本表的INSERT、UPDATE和DELETE語句(用戶在感覺上確實是在對視圖更新)。不是所有的視圖都是可更新的,因為有些視圖的更新不能有意義的轉(zhuǎn)化成相應基本表的更新。51例:如果定義“計算機應用”學生視圖:
CREATEVIEWSTUDENT_COMPUTER(SNO,SNAME,SEX,AGE)ASSELECTSNO,SNAME,SEX,AGEFROMSWHERESDEPT=‘計算機應用’;
該視圖是從單個關(guān)系僅使用了選擇和投影導出的,而且包括鍵SNO,因此是可以修改的。如執(zhí)行插入操作:
INSERTINTOSTUDENT_COMPUTERVALUES(‘S99’,‘王敏’,‘男’,22);系統(tǒng)自動會把它轉(zhuǎn)換變成下列語句:
INSERTINTOSVALUES(’S99’,‘王敏’,‘男’,22,‘計算機應用’);52
對于學生學習情況視圖:
CREATEVIEWS_GRADE(SNO,C_NUM,AVG_GRADE) ASSELECTSNO,COUNT(CNO),AVG(GRADE)
FROMSC
GROUPBYSNO;執(zhí)行:UPDATES_GRADE SETSNO='S3' WHERESNO='S4';
不允許。C_NUM是對SC中的學生選修門數(shù)進行統(tǒng)計,在未更改SC表時,要在視圖S_GRADE中更改門數(shù),是不可能的。53執(zhí)行:DELETEFROMS_GRADEWHEREC_NUM>4;
也不允許的。在視圖S_GRADE中刪除選修門數(shù)在4門以上的學生元組,勢必造成SC中這些學生學習元組的刪除,這不一定是用戶的原意,因此使用分組和聚合操作的視圖,不允許用戶執(zhí)行更新操作。54三、視圖的更新
一般的DBMS只允許對單個基本表導出的視圖進行更新。并有下列限制:①若視圖的列由表達式或常數(shù)組成,則不允許執(zhí)行INSERT和UPDATE,但可執(zhí)行DELETE。②若視圖的列由集函數(shù)組成,則不允許更新。③若視圖定義中有GROUPBY子句,則不允許更新。④若視圖定義中有DISTINCT選項,則不允許更新。⑤若視圖定義中有嵌套查詢,且內(nèi)外層FROM子句中的表是同一個表,則不允許更新。⑥從不允許更新的視圖導出的視圖是不允許更新的。55四、視圖的優(yōu)點1.視圖能方便用戶操作,若用戶所需數(shù)據(jù)來自多個基本表,則通過視圖可使用戶感到數(shù)據(jù)是來自一個關(guān)系的;若用戶所需數(shù)據(jù)是對基本表中的數(shù)據(jù)通過某種運算才能得到的,2.視圖可對數(shù)據(jù)提供安全保護3.視圖能使不同用戶都能用自己喜歡的方式看待同一數(shù)據(jù)同一數(shù)據(jù),在不同用戶的各個視圖中,可以以不同的名稱出現(xiàn),可以以不同的角色出現(xiàn)(平均值,最大值……)。這給數(shù)據(jù)共享帶來了很大的方便。56第六節(jié)
嵌入式SQLSQL語言的運行環(huán)境嵌入式SQL的使用規(guī)定嵌入式SQL的使用技術(shù)動態(tài)SQL語句57一、SQL語言的運行環(huán)境
常用的方式是用某種傳統(tǒng)的編程語言(例如:C、PASCAL等)編寫程序,但程序中的某些函數(shù)或某些語句是SQL語句。這種方式下使用的SQL語言稱為嵌入式SQL(EmbeddedSQL),其中傳統(tǒng)的編程語言稱為宿主語言(或主語言)。DBMS有兩種方法處理嵌入式SQL語言:預編譯和擴充編譯程序法。預編譯是指由DBMS的預編譯器對源程序進行掃描,識別出其中的SQL語句,把它們轉(zhuǎn)換為宿主語言調(diào)用語句,使宿主語言編譯器能夠識別,最后由編譯器將整個源程序編譯為目標碼。目前使用較多的是預編譯方法,其處理過程如圖4―2所示。58圖4―2嵌入式SQL語句的處理過程
59一、SQL語言的運行環(huán)境
使用嵌入式SQL必須解決以下幾個問題:(1)預編譯器不能識別和接受SQL語句,因此,嵌入式程序中,應有區(qū)分SQL語句與宿主語言語句的標記。(2)DBMS和宿主語言程序(程序工作單元)如何進行信息傳遞。(3)一條SQL語句原則上可產(chǎn)生或處理一組記錄,而宿主語言一次只能處理一個記錄,必須協(xié)調(diào)這兩種處理方式。60二、嵌入式SQL的使用規(guī)定
對嵌入的SQL語句加前綴EXECSQL,而結(jié)束標志則隨宿主語言的不同而不同。在C語言中嵌入的SQL語句以EXECSQL開始,以分號“;”結(jié)尾:EXECSQL<SQL語句>;在DBMS和宿主語言程序之間的數(shù)據(jù)傳遞,是通過宿主語言程序變量,簡稱主變量(Hostvariable)來實現(xiàn)的。當SQL語句引用主變量時,變量前應加冒號“:”。SQL語言和宿主語言的不同數(shù)據(jù)處理方式,是通過游標(Cursor)來協(xié)調(diào)的。游標是系統(tǒng)為用戶開設的一個數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果。每個游標都有一個名字。61二、嵌入式SQL的使用規(guī)定
用戶可以用SQL語句逐一從游標中獲取記錄,并賦給主變量,由宿主語言作進一步的處理。游標的操作包括四個步驟:定義游標:EXECSQLDECLARE游標名CURSORFOR<SELECT語句>;打開游標:EXECSQLOPEN<游標名>;推進游標:EXECSQLFETCH<游標名>INTO<主變量名列表>;關(guān)閉游標:EXECSQLCLOSE<游標名>;62三、嵌入式SQL的使用技術(shù)
不涉及游標的嵌入式SQLDML語句涉及游標的嵌入式SQLDML語句滾動游標的定義和推進63三、嵌入式SQL的使用技術(shù)⑴在嵌入式SQL中,SQL的數(shù)據(jù)定義DDL與控制語句DCL都不需要使用游標。它們是嵌入式SQL中最簡單的一類語句,不需要返回結(jié)果數(shù)據(jù),也不需要使用主變量。在主語言中嵌入SQL說明性語句(DECLARE)及控制語句(GRANT),只要給語句加上前綴EXECSQL和語句結(jié)束符END_EXEC即可。在C語言中,用分號;代替END_EXEC64例:在C語言中說明共享變量:EXECSQLBEGINDECLARESECTIONintgrade,raise;chargivencno[5],cname[13],tname[9];
chargivensno[5],sname[9],sdept[11];
charSQLSTATE[6];EXECSQLENDDECLARESECTION;65
⑵不涉及游標的嵌入式SQLDML語句
a.對于INSERT、DELETE和UPDATE語句,只要加上前綴標識“EXECSQL”和結(jié)束標志“END_EXEC”,就能嵌入在宿主語言程序中使用。例:①在關(guān)系C中插入一門新的課程,各屬性值已在相應的共享變量中:
EXECSQLINSERTINTOC(CNO,CNAME,TNAME)
VALUES(:givencno,:cname,:tname);66②從關(guān)系SC中刪除一個學生的所有選課,該學生的姓名由共享變量sname提供。
EXECSQLDELETEFROMSCWHERESNO=(SELECTSNOFROMSWHERESNAME=:sname);67③把“數(shù)據(jù)庫”課程的全部成績增加某個值(該值由共享變量raise提供)。
EXECSQLUPDATESCSETGRADE=GRADE+:raiseWHERECNOIN(SELECTCNOFROMCWHERECNAME=‘數(shù)據(jù)庫’);68b.對于SELECT語句,如果已知查詢結(jié)果肯定是單元組時,可直接嵌入在主程序中使用,此時在SELECI語句中增加一個INTO子句,指出找到的值應送到相應的共享變量中去。例:在關(guān)系S中根據(jù)共享變量givensno的值檢索學生的姓名和所在系。
69例:在關(guān)系S中根據(jù)共享變量givensno的值檢索該學生的姓名和所在系:
EXECSQLSELECTSNAME,SDEPTINTO:sname,:sdeptFROMSWHERESNO=:givensno;此處sname,sdept,givensno都是共享變量,已在主程序中定義,并用SQL的DECLARE語句加以說明,在引用是加上“:”作為前綴標識,以示與數(shù)據(jù)庫中變量區(qū)別。70
⑶涉及游標的嵌入式SQLDML語句
a、當SELECT語句查詢結(jié)果是多個元組時,此時要用游標機制把多個元組一次一個地傳送給宿主語言程序處理。例:在關(guān)系SC表中檢索某學生(學生名由共享變量givensname給出)選課信息(SNO,CNO,GRADE),
該查詢的C語言程序段:
71EXECSQLBEGINDECLARESECTION;Intgrade,rise;Charsno[5],cno[5],givensname[9],SQLSTATE[6];EXECSQLENDDECLARESECTION;EXECSQLDECLAREscxCURSORFORSELECTSNO,CNO,GRADEFROMSCWHERESNO=(SELECTSNOFROMSWHERESNAME=:givensname)FORUPDATEOFGRADE;EXECSQLOPENscx;
72While(1){EXECSQLFETCHFROMscxINTO:sno,:cno,:grade;If(SQLCA.SQLSTATE=='02000’)/﹡已取完查詢結(jié)果中的所有元組﹡/Break;If(SQLCA.SQLSTATE!=’0’)/﹡取數(shù)據(jù)出錯﹡/Break;
…/﹡對游標所取的數(shù)據(jù)進行處理﹡/printf(“%s,%s,%d”,sno,cno,grade);}EXECSQLCLOSEscx;73b.對游標指向的元組進行修改或刪除操作
當游標處于活動狀態(tài)時,可以修改或刪除游標指向的元組。例:在上面的例子中,對找到的元組做如下處理:刪除不及格的選課,將6069分的成績增加由共享變量rise提供的值,再顯示該學生的成績信息(SNO,CNO,GRADE).
在上例中的”While(1){…}語句改為如下形式:74While(1){EXECSQLFECCHFROMscxINTO:sno,:cno,:grade;If(SQLCA.SQLSTATE=='02000’)/﹡已經(jīng)取完查詢結(jié)果中的所有元組﹡/Break;If(SQLCA.SQLSTATE!=’0’)/﹡取數(shù)據(jù)出錯﹡/Break;If(grade<60)EXECSQLDELETEFROMSCWHERECURRENTOFscx;Else{If(grade<70)
75{EXECSQLUPDATECSETGRADE=GRADE+:riseWHERECURRENTOFscx;grade=grade+rise;}printf(“%s,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025戶外品牌探路者線上新媒體運營方案
- 田徑運動會活動方案(匯編15篇)
- 五年級二十年后的家鄉(xiāng)單元作文
- 安全工作演講稿匯編15篇
- 2023年幼兒園安全工作計劃10篇
- 財務會計個人辭職報告集合8篇
- 一次有趣的游戲初一日記400字5篇
- 北京市通州區(qū)2024-2025學年八年級上學期期末考試道德與法治試卷(含答案)
- 2025年工程瑞雷波儀項目合作計劃書
- 國培計劃心得體會
- 協(xié)商函范文(推薦十八篇)
- 面神經(jīng)微血管減壓術(shù)精要
- S7-1200PLC實訓課程教案
- 畢業(yè)設計(論文)-仿生分布式驅(qū)動撲翼設計-機械鳥
- 畢業(yè)論文-YT4543型組合機床動力滑臺液壓傳動系統(tǒng)設計
- 律師事務所編制的實習人員實務訓練計劃
- 文言虛詞(考點精講)-【中職專用】中職高考語文一輪復習講練測(浙江適用)
- 英國簽證戶口本翻譯模板(匯編)
- 中小企業(yè)內(nèi)部控制與風險管理(第二版)項目一:內(nèi)部控制與風險管理基礎
- 駕駛艙資源管理緒論課件
- 聲藝 EPM8操作手冊
評論
0/150
提交評論