結(jié)構(gòu)化查詢語言SQL_第1頁
結(jié)構(gòu)化查詢語言SQL_第2頁
結(jié)構(gòu)化查詢語言SQL_第3頁
結(jié)構(gòu)化查詢語言SQL_第4頁
結(jié)構(gòu)化查詢語言SQL_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1數(shù)據(jù)庫原理(2015-2016)宋安平上海大學(xué)計(jì)算機(jī)學(xué)院1015室Apsong@第1周—第4周答疑時(shí)間:周三9-10,1001GGG2“數(shù)據(jù)庫原理”課程的特點(diǎn):理論性:關(guān)系運(yùn)算理論、模式設(shè)計(jì)理論等;實(shí)用性:數(shù)據(jù)庫語言、數(shù)據(jù)庫設(shè)計(jì);可操作性:較強(qiáng),有大量問題和應(yīng)用值得分析和設(shè)計(jì);

創(chuàng)新性:有許多深層的問題具有發(fā)展的余地,有待去挖掘、發(fā)現(xiàn)和總結(jié)。

3課程教學(xué)目的和要求:掌握數(shù)據(jù)庫系統(tǒng)的基本概念和原理;理解SQL、關(guān)系代數(shù)和關(guān)系演算等數(shù)據(jù)庫語言;學(xué)會(huì)關(guān)系數(shù)據(jù)庫規(guī)范設(shè)計(jì)的方法和步驟;了解數(shù)據(jù)庫系統(tǒng)的實(shí)現(xiàn)技術(shù);具備使用關(guān)系數(shù)據(jù)庫軟件開發(fā)數(shù)據(jù)庫應(yīng)用系統(tǒng)的能力。4《數(shù)據(jù)庫原理一》課堂教學(xué)+研討(30學(xué)時(shí))內(nèi)容及安排:第四章結(jié)構(gòu)化查詢語言SQL(12學(xué)時(shí))第一章數(shù)據(jù)庫發(fā)展史(3學(xué)時(shí))第二章數(shù)據(jù)庫系統(tǒng)結(jié)構(gòu)(3學(xué)時(shí))第六章實(shí)體聯(lián)系模型(3學(xué)時(shí))第三章關(guān)系運(yùn)算(6學(xué)時(shí))習(xí)題分析、總復(fù)習(xí)(3學(xué)時(shí))5實(shí)驗(yàn)內(nèi)容和安排(20學(xué)時(shí))

:見WORD附件寫實(shí)驗(yàn)報(bào)告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上實(shí)現(xiàn)。是介于關(guān)系代數(shù)和關(guān)系演算之間的語言。1986年ANSI批準(zhǔn)SQL作為關(guān)系數(shù)據(jù)庫語言的美國標(biāo)準(zhǔn),同年,ISO也同樣決定。以后相繼出現(xiàn)SQL89,SQL2(1992),SQL3(1999)。9二、SQL數(shù)據(jù)庫的體系結(jié)構(gòu)SQL支持?jǐn)?shù)據(jù)庫的三級(jí)模式結(jié)構(gòu),如圖4―1所示。從圖中可以看出,模式與基本表相對(duì)應(yīng),外模式與視圖相對(duì)應(yīng),內(nèi)模式對(duì)應(yīng)于存儲(chǔ)文件?;颈砗鸵晥D都是關(guān)系。1.基本表(BaseTable)基本表是模式的基本內(nèi)容。每個(gè)基本表都是一個(gè)實(shí)際存在的關(guān)系。10圖4―1SQL支持的數(shù)據(jù)庫模式

11二、SQL數(shù)據(jù)庫的體系結(jié)構(gòu)2.視圖(View)視圖是外模式的基本單位,用戶通過視圖使用數(shù)據(jù)庫中基于基本表的數(shù)據(jù)(基本表也可作為外模式使用)。視圖是虛表,實(shí)際并不存在,只有定義存放在數(shù)據(jù)字典中。12二、SQL數(shù)據(jù)庫的體系結(jié)構(gòu)3.存儲(chǔ)文件存儲(chǔ)文件是內(nèi)模式的基本單位。每一個(gè)存儲(chǔ)文件存儲(chǔ)一個(gè)或多個(gè)基本表的內(nèi)容。一個(gè)基本表可有若干索引,索引也存儲(chǔ)在存儲(chǔ)文件中。存儲(chǔ)文件的存儲(chǔ)結(jié)構(gòu)對(duì)用戶是透明的。下面將介紹SQL的基本語句。各廠商的RDBMS實(shí)際使用的SQL語言,與標(biāo)準(zhǔn)SQL語言都有所差異及擴(kuò)充。因此,具體使用時(shí),應(yīng)參閱實(shí)際系統(tǒng)的有關(guān)手冊(cè)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全字長(zhǎng)二進(jìn)制整數(shù)SMALLINT半字長(zhǎng)二進(jìn)制整數(shù)DEC(p[,q])或壓縮十進(jìn)制數(shù),共p位,其中小數(shù)點(diǎn)后有q位,F(xiàn)LOAT雙字長(zhǎng)的浮點(diǎn)數(shù)CHAR(n)或CHARTER(n)長(zhǎng)度為n的定長(zhǎng)字符串VARCHAR(n)最大長(zhǎng)度為n的變長(zhǎng)字符串DATE日期型,格式為YYYY―MM―DDTIME時(shí)間型,格式為HH.MM.SS17三、基本表的創(chuàng)建、修改和撤消基本表的創(chuàng)建——CREATETABLECREATETABLE<表名>(<列名1><類型>[<該列的完整性約束>][,<列名2><類型>[<該列的完整性約束>]]…

[<,表級(jí)完整性約束>])<該列的完整性約束>:該列上數(shù)據(jù)必須符合的條件。最常見的有:NOTNULL該列值不能為空NULL該列值可以為空UNIQUE該列值不能有相同者DEFAULT該列上某值未定義時(shí)的默認(rèn)值<表級(jí)完整性約束>:對(duì)整個(gè)表的一些約束條件,常見的有定義主碼(外碼),各列上數(shù)據(jù)必須符合的關(guān)聯(lián)條件等。18三、基本表的創(chuàng)建、修改和撤消例如:有一個(gè)學(xué)生數(shù)據(jù)庫中,有三個(gè)關(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ù)字典中的定義也被刪除),此表上建立的索引和視圖也被自動(dòng)刪除(有些系統(tǒng)對(duì)建立在此表上的視圖的定義并不刪除,但也無法使用了)。22四、索引的創(chuàng)建和撤消索引的建立——CREATEINDEX在一個(gè)基本表上,可建立若干索引。有了索引,可以加快查詢速度。索引的建立和刪除工作由DBA或表的屬主(建表人)負(fù)責(zé)。用戶在查詢時(shí)并不能選擇索引,選擇索引的工作由DBMS自動(dòng)進(jìn)行。

CREATE[UNIQUE]INDEX<索引名>ON<表名>(<列名>[ASC|DESC])…

本語句為規(guī)定<表名>建立一索引,索引名為<索引名>。23四、索引的創(chuàng)建和撤消刪除索引——DROPINDEX索引太多,索引的維護(hù)開銷也將增大。因此,不必要的索引應(yīng)及時(shí)刪除。DROPINDEX<索引名>本語句將刪除規(guī)定的索引。該索引在數(shù)據(jù)字典中的描述也將被刪除。24第三節(jié)SQL的數(shù)據(jù)查詢SELECT語句的基本格式舉例說明25一、SELECT語句的基本格式SELECT[DISTINCT]*|<目標(biāo)列表達(dá)式[別名]清單>FROM<關(guān)系名[別名]或視圖名清單>

[WHERE<查詢條件表達(dá)式>][GROUPBY列名清單[HAVING<組條件表達(dá)式>]][ORDERBY列名[ASC|DESC],…]26整個(gè)語句的執(zhí)行過程如下:1、讀取FROM子句中基本表、視圖的數(shù)據(jù),執(zhí)行笛卡爾積操作。2、選取滿足WHERE子句中給出的條件表達(dá)式的元組。3、按GROUP子句中指定列的值分組,同時(shí)提取滿足HAVING子句中組條件表達(dá)式的那些組。4、按SELECT子句中給出的列名或列表達(dá)式求值輸出。5、ORDER子句對(duì)輸出的目標(biāo)表進(jìn)行排序,按附加說明ASC升序排列,或按DESC降序排列。27SELECT語句中:

WHERE子句稱為“行條件子句”,

GROUP子句稱為“分組子句”,

HAVING子句稱為“組條件子句”,

ORDER子句稱為“排序子句”。28在WHERE子句的行條件表達(dá)式中可使用下列運(yùn)算符:算術(shù)比較運(yùn)算符:<,<=,>,>=,=,<>或?。?;邏輯運(yùn)算符:AND,OR,NOT;集合成員資格運(yùn)算符:IN,NOTIN;謂詞:EXISTS,ALL,SOME,UNIQUE;聚合函數(shù):AVG,MIN,MAX,SUM,COUNT;集合運(yùn)算符:UNION,INTERSECT,EXCEPT。29二、舉例說明單表查詢--選擇列選擇表中的若干列

1.查詢指定列

例:查詢學(xué)生的學(xué)號(hào)和姓名

2.查詢?nèi)苛校菏褂?表示所有屬性

例:查詢?nèi)w學(xué)生的詳細(xì)情況

3.查詢經(jīng)過計(jì)算的值:表達(dá)式可用別名代替

例:查詢學(xué)生的姓名和出生年份

注意:字段名稱AS別名

字段名稱別名

別名=字段名稱

4.消除取值重復(fù)的行 例查詢選課的學(xué)生學(xué)號(hào)30單表查詢—選擇行1.比較大?。罕容^運(yùn)算符>>=<<==<>

例:查詢1980年以后出生的學(xué)生的基本情況2.確定范圍:列名[NOT]BETWEEN<下限>AND<上限>例:查詢年齡在20到25之間的學(xué)生姓名3.確定集合:列名[NOT]IN(<值序列>例:查詢選擇了c1、c4、c6課號(hào)的學(xué)生學(xué)號(hào)和成績(jī)4.涉及空值的查詢:列名IS[NOT]NULL例:列出所有成績(jī)?yōu)榭盏膶W(xué)生學(xué)號(hào)5.字符匹配:列名[NOT]LIKE‘<匹配串>’

通配符:%表示任意多個(gè)字符王%%衛(wèi)%%衛(wèi)

_表示任意一個(gè)字符_衛(wèi)___千__平%王__ 例:查詢姓名中包含“敏”的學(xué)生姓名查詢所有劉姓、王姓且為雙名的學(xué)生姓名

31單表查詢—聚合函數(shù)1.COUNT([DISTINCT]*)統(tǒng)計(jì)元組的個(gè)數(shù)2.COUNT([DISTINCT]<列名>)統(tǒng)計(jì)一列中值的個(gè)數(shù)3.SUM([DISTINCT]<列名>)計(jì)算一列值的總和4.AVG([DISTINCT]<列名>)計(jì)算一列值的平均值5.MAX([DISTINCT]<列名>)求一列值中的最大值6.MIN([DISTINCT]<列名>)求一列值中的最小值例:查詢選過課的學(xué)生人數(shù)查詢選課次數(shù)查詢最大和最小年齡統(tǒng)計(jì)有多少名年齡超過19歲的女同學(xué)查詢學(xué)號(hào)s1的學(xué)生考試成績(jī)的平均分和總分32單表查詢—分組排序查詢結(jié)果分組查詢每類課的學(xué)生人數(shù) 查詢選課一門以上的學(xué)生學(xué)號(hào) 統(tǒng)計(jì)男女同學(xué)的人數(shù)和平均年齡查詢每門課程都超過70分的學(xué)生學(xué)號(hào)查詢結(jié)果排序查詢每門課的學(xué)生人數(shù)和總成績(jī),查詢結(jié)果按總成績(jī)升序,人數(shù)降序排列統(tǒng)計(jì)每個(gè)學(xué)生選修課程的門數(shù)(超過5門的學(xué)生才統(tǒng)計(jì))。要求輸出學(xué)生學(xué)號(hào)和選修門數(shù),查詢結(jié)果按門數(shù)降序排列,若門數(shù)相同,按學(xué)號(hào)升序排列33

聯(lián)接操作

聯(lián)接條件可在WHERE中指定也可以在FROM子句中指定。

在FROM子句中指定聯(lián)接條件時(shí),SQL2將

聯(lián)接操作符分成:

聯(lián)接類型、聯(lián)接條件。

聯(lián)接類型:決定了如何處理聯(lián)接條件中不匹配的元組。聯(lián)接條件:決定了兩個(gè)關(guān)系中哪些元組應(yīng)該匹配。聯(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é)果為兩個(gè)聯(lián)接表中的匹配行的聯(lián)接。

結(jié)果包括“左”表(出現(xiàn)在JOIN子句的最左邊)中的所有行。不包括右表中的不匹配行。

結(jié)果包括“右”表(出現(xiàn)在JOIN子句的最右邊)中的所有行。不包括左表中的不匹配行。結(jié)果包括所有聯(lián)接表中的所有行,不論它們是否匹配

結(jié)果包括兩個(gè)聯(lián)接表中所有可能的行組合。交叉聯(lián)接返回的是兩個(gè)表的笛卡兒積35多表連接查詢自身連接查詢選課二門或二門以上的學(xué)生學(xué)號(hào)檢索選修c1和c2課的學(xué)生學(xué)號(hào),姓名復(fù)合條件連接查找選修了VB課程且成績(jī)?cè)?0分以上的姓名及成績(jī)。查詢每門課程都超過70分的學(xué)生學(xué)號(hào)、姓名。統(tǒng)計(jì)每個(gè)學(xué)生選修課程的門數(shù)(超過5門的學(xué)生才統(tǒng)計(jì))。要求輸出學(xué)生學(xué)號(hào)、姓名和選修門數(shù),查詢結(jié)果按門數(shù)降序排列,若門數(shù)相同,按學(xué)號(hào)升序排列。36相關(guān)子查詢帶有謂詞IN的子查詢例:查詢選修了課程號(hào)為c2的課程的學(xué)生姓名 查詢選修了數(shù)據(jù)庫原理課程的學(xué)生姓名帶有謂詞ANY和ALL的比較子查詢例:查詢平均成績(jī)超過所有女學(xué)生成績(jī)的男學(xué)生的學(xué)生學(xué)號(hào)和姓名帶有謂詞EXISTS的子查詢:返回子查詢是邏輯值例:查詢沒有選修c2課程的學(xué)生姓名 查詢所有學(xué)生都選修的課程號(hào)和課程名 求選修學(xué)號(hào)為S3的學(xué)生所修全部課程的學(xué)生號(hào)碼37第四節(jié)

SQL的數(shù)據(jù)更新數(shù)據(jù)插入數(shù)據(jù)刪除數(shù)據(jù)修改38一、數(shù)據(jù)插入

INSERTINTO<表名>[(<屬性名清單>)]VALUES(元組值);INSERTINTO<表名>(<屬性名清單>)

VALUES(元組值),(元組值),…

;INSERTINTO<表名>[(<屬性名清單>)]

(子查詢);把子查詢的結(jié)果插入指定的<表名>中。這樣的一條INSERT語句,可以一次插入多條元組。例:創(chuàng)建一個(gè)含有學(xué)號(hào)、姓名和課程名的新表,然后將男同學(xué)的相關(guān)數(shù)據(jù)插入到新表中39二、數(shù)據(jù)刪除

DELETEFROM<表名>

[WHERE<帶有子查詢的條件表達(dá)式>]本語句將刪除使<帶有子查詢的條件表達(dá)式>為真的所有元組。例:刪除沒選修任何一門課的學(xué)生信息把課程名為”數(shù)據(jù)庫原理”的成績(jī)從表SC中刪除40三、數(shù)據(jù)修改

UPDATE<表名>SET<列名>=<表達(dá)式>

[,<列名>=<表達(dá)式>……][WHERE<帶有子查詢的條件表達(dá)式>]本語句執(zhí)行時(shí),將修改使<帶有子查詢的條件表達(dá)式>為真的所有元組。例:對(duì)低于70分的增加5%,高于等于70分的增加4%把課程名為”數(shù)據(jù)庫原理”的成績(jī)提高10%41第五節(jié)

視圖視圖的定義視圖的查詢視圖的更新視圖的優(yōu)點(diǎn)42一、視圖的定義

一個(gè)視圖是從一個(gè)或多個(gè)關(guān)系(基本表或已有的視圖)導(dǎo)出的關(guān)系。視圖是虛表,導(dǎo)出后,數(shù)據(jù)庫中只存有此視圖的定義(在數(shù)據(jù)字典中),但并沒有實(shí)際生成此關(guān)系。視圖一經(jīng)定義就可以象基本表一樣進(jìn)行查詢和更新。43一、視圖的定義

CREATEVIEW<視圖名>[<列名清單>]

AS<子查詢>

[WITHCHECKOPTION]若有<列名清單>,則此清單給出了此視圖的全部屬性的屬性名;否則,此視圖的所有屬性名即為子查詢中SELECT語句中的全部目標(biāo)列。有[WITHCHECKOPTION]時(shí),則今后對(duì)此視圖進(jìn)行INSERT、UPDATE和DELETE操作時(shí),系統(tǒng)會(huì)自動(dòng)檢查視圖是否符合原定義視圖時(shí)子查詢中的<條件表達(dá)式>。44例:在教學(xué)數(shù)據(jù)庫中基本表SC上,建立一個(gè)學(xué)生學(xué)習(xí)情況視圖:

CREATEVIEWS_GRADE(SNO,C_NUM,AVG_GRADE) AS(SELECTSNO,COUNT(CNO),AVG(GRADE) FROMSC GROUPBYSNO);45一、視圖的定義

DROPVIEW<視圖名>此語句將把指定視圖的定義從數(shù)據(jù)字典中刪除。一個(gè)關(guān)系(基本表或視圖)被刪除后,所有由該關(guān)系導(dǎo)出的視圖并不自動(dòng)刪除,它們?nèi)栽跀?shù)據(jù)字典中,但已無法使用。例:撤消S_GRADE視圖,可用下列語句實(shí)現(xiàn):

DROPVIEWS_GRADE;46二、視圖的查詢

DBMS對(duì)某SELECT語句進(jìn)行處理時(shí),若發(fā)現(xiàn)被查詢對(duì)象是視圖,則DBMS將進(jìn)行下述操作:

(1)從數(shù)據(jù)字典中取出視圖的定義。

(2)把視圖定義的子查詢和本SELECT的查詢相結(jié)合,生成等價(jià)的對(duì)基本表的查詢(此過程稱為視圖的消解)。

(3)執(zhí)行對(duì)基本表的查詢,把查詢結(jié)果(作為本次對(duì)視圖的查詢結(jié)果)向用戶顯示。47三、視圖的查詢系統(tǒng)在實(shí)現(xiàn)對(duì)視圖的查詢時(shí),根據(jù)數(shù)據(jù)字典的定義將對(duì)視圖的查詢轉(zhuǎn)換為對(duì)基本表的查詢。例:對(duì)學(xué)生學(xué)習(xí)情況視圖執(zhí)行如下操作:① SELECT*FROMS_GRADE;

相應(yīng)的查詢轉(zhuǎn)換操作如下:

SELECTSNO,COUNT(CNO)ASC_NUM,AVG(GRADE)ASAVG_GRADEFROMSCGROUPBYSNO;48② SELECTSNO,C_NUM FROMS_GRADEWHEREAVG_GRADE>80;

相應(yīng)的查詢轉(zhuǎn)換操作如下:SELECTSNO,COUNT(CNO)ASC_NUMFROMSCGROUPBYSNOHAVINGAVG(GRADE)>80;49③ SELECTSNO,AVG_GRADE FROMS_GRADEWHEREC_NUM>(SELECTC_NUMFROMS_GRADEWHERESNO=‘S4’);

相應(yīng)的查詢轉(zhuǎn)換操作如下:SELECTSNO,AVG(GRADE)ASAVG_GRADEFROMSCGROUPBYSNOHAVINGCOUNT(CNO)>(SELECTCOUNT(CNO)FROMSCGROUPBYSNOHAVINGSNO=‘S4’);50三、視圖的更新

視圖是虛表,是沒有數(shù)據(jù)的。所謂視圖的更新,表面上是對(duì)視圖執(zhí)行INSERT、UPDATE和DELETE來更新視圖的數(shù)據(jù),其實(shí)質(zhì)是由DBMS自動(dòng)轉(zhuǎn)化成對(duì)導(dǎo)出視圖的基本表的更新,轉(zhuǎn)化成對(duì)基本表的INSERT、UPDATE和DELETE語句(用戶在感覺上確實(shí)是在對(duì)視圖更新)。不是所有的視圖都是可更新的,因?yàn)橛行┮晥D的更新不能有意義的轉(zhuǎn)化成相應(yīng)基本表的更新。51例:如果定義“計(jì)算機(jī)應(yīng)用”學(xué)生視圖:

CREATEVIEWSTUDENT_COMPUTER(SNO,SNAME,SEX,AGE)ASSELECTSNO,SNAME,SEX,AGEFROMSWHERESDEPT=‘計(jì)算機(jī)應(yīng)用’;

該視圖是從單個(gè)關(guān)系僅使用了選擇和投影導(dǎo)出的,而且包括鍵SNO,因此是可以修改的。如執(zhí)行插入操作:

INSERTINTOSTUDENT_COMPUTERVALUES(‘S99’,‘王敏’,‘男’,22);系統(tǒng)自動(dòng)會(huì)把它轉(zhuǎn)換變成下列語句:

INSERTINTOSVALUES(’S99’,‘王敏’,‘男’,22,‘計(jì)算機(jī)應(yīng)用’);52

對(duì)于學(xué)生學(xué)習(xí)情況視圖:

CREATEVIEWS_GRADE(SNO,C_NUM,AVG_GRADE) ASSELECTSNO,COUNT(CNO),AVG(GRADE)

FROMSC

GROUPBYSNO;執(zhí)行:UPDATES_GRADE SETSNO='S3' WHERESNO='S4';

不允許。C_NUM是對(duì)SC中的學(xué)生選修門數(shù)進(jìn)行統(tǒng)計(jì),在未更改SC表時(shí),要在視圖S_GRADE中更改門數(shù),是不可能的。53執(zhí)行:DELETEFROMS_GRADEWHEREC_NUM>4;

也不允許的。在視圖S_GRADE中刪除選修門數(shù)在4門以上的學(xué)生元組,勢(shì)必造成SC中這些學(xué)生學(xué)習(xí)元組的刪除,這不一定是用戶的原意,因此使用分組和聚合操作的視圖,不允許用戶執(zhí)行更新操作。54三、視圖的更新

一般的DBMS只允許對(duì)單個(gè)基本表導(dǎo)出的視圖進(jìn)行更新。并有下列限制:①若視圖的列由表達(dá)式或常數(shù)組成,則不允許執(zhí)行INSERT和UPDATE,但可執(zhí)行DELETE。②若視圖的列由集函數(shù)組成,則不允許更新。③若視圖定義中有GROUPBY子句,則不允許更新。④若視圖定義中有DISTINCT選項(xiàng),則不允許更新。⑤若視圖定義中有嵌套查詢,且內(nèi)外層FROM子句中的表是同一個(gè)表,則不允許更新。⑥從不允許更新的視圖導(dǎo)出的視圖是不允許更新的。55四、視圖的優(yōu)點(diǎn)1.視圖能方便用戶操作,若用戶所需數(shù)據(jù)來自多個(gè)基本表,則通過視圖可使用戶感到數(shù)據(jù)是來自一個(gè)關(guān)系的;若用戶所需數(shù)據(jù)是對(duì)基本表中的數(shù)據(jù)通過某種運(yùn)算才能得到的,2.視圖可對(duì)數(shù)據(jù)提供安全保護(hù)3.視圖能使不同用戶都能用自己喜歡的方式看待同一數(shù)據(jù)同一數(shù)據(jù),在不同用戶的各個(gè)視圖中,可以以不同的名稱出現(xiàn),可以以不同的角色出現(xiàn)(平均值,最大值……)。這給數(shù)據(jù)共享帶來了很大的方便。56第六節(jié)

嵌入式SQLSQL語言的運(yùn)行環(huán)境嵌入式SQL的使用規(guī)定嵌入式SQL的使用技術(shù)動(dòng)態(tài)SQL語句57一、SQL語言的運(yùn)行環(huán)境

常用的方式是用某種傳統(tǒng)的編程語言(例如:C、PASCAL等)編寫程序,但程序中的某些函數(shù)或某些語句是SQL語句。這種方式下使用的SQL語言稱為嵌入式SQL(EmbeddedSQL),其中傳統(tǒng)的編程語言稱為宿主語言(或主語言)。DBMS有兩種方法處理嵌入式SQL語言:預(yù)編譯和擴(kuò)充編譯程序法。預(yù)編譯是指由DBMS的預(yù)編譯器對(duì)源程序進(jìn)行掃描,識(shí)別出其中的SQL語句,把它們轉(zhuǎn)換為宿主語言調(diào)用語句,使宿主語言編譯器能夠識(shí)別,最后由編譯器將整個(gè)源程序編譯為目標(biāo)碼。目前使用較多的是預(yù)編譯方法,其處理過程如圖4―2所示。58圖4―2嵌入式SQL語句的處理過程

59一、SQL語言的運(yùn)行環(huán)境

使用嵌入式SQL必須解決以下幾個(gè)問題:(1)預(yù)編譯器不能識(shí)別和接受SQL語句,因此,嵌入式程序中,應(yīng)有區(qū)分SQL語句與宿主語言語句的標(biāo)記。(2)DBMS和宿主語言程序(程序工作單元)如何進(jìn)行信息傳遞。(3)一條SQL語句原則上可產(chǎn)生或處理一組記錄,而宿主語言一次只能處理一個(gè)記錄,必須協(xié)調(diào)這兩種處理方式。60二、嵌入式SQL的使用規(guī)定

對(duì)嵌入的SQL語句加前綴EXECSQL,而結(jié)束標(biāo)志則隨宿主語言的不同而不同。在C語言中嵌入的SQL語句以EXECSQL開始,以分號(hào)“;”結(jié)尾:EXECSQL<SQL語句>;在DBMS和宿主語言程序之間的數(shù)據(jù)傳遞,是通過宿主語言程序變量,簡(jiǎn)稱主變量(Hostvariable)來實(shí)現(xiàn)的。當(dāng)SQL語句引用主變量時(shí),變量前應(yīng)加冒號(hào)“:”。SQL語言和宿主語言的不同數(shù)據(jù)處理方式,是通過游標(biāo)(Cursor)來協(xié)調(diào)的。游標(biāo)是系統(tǒng)為用戶開設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果。每個(gè)游標(biāo)都有一個(gè)名字。61二、嵌入式SQL的使用規(guī)定

用戶可以用SQL語句逐一從游標(biāo)中獲取記錄,并賦給主變量,由宿主語言作進(jìn)一步的處理。游標(biāo)的操作包括四個(gè)步驟:定義游標(biāo):EXECSQLDECLARE游標(biāo)名CURSORFOR<SELECT語句>;打開游標(biāo):EXECSQLOPEN<游標(biāo)名>;推進(jìn)游標(biāo):EXECSQLFETCH<游標(biāo)名>INTO<主變量名列表>;關(guān)閉游標(biāo):EXECSQLCLOSE<游標(biāo)名>;62三、嵌入式SQL的使用技術(shù)

不涉及游標(biāo)的嵌入式SQLDML語句涉及游標(biāo)的嵌入式SQLDML語句滾動(dòng)游標(biāo)的定義和推進(jìn)63三、嵌入式SQL的使用技術(shù)⑴在嵌入式SQL中,SQL的數(shù)據(jù)定義DDL與控制語句DCL都不需要使用游標(biāo)。它們是嵌入式SQL中最簡(jiǎn)單的一類語句,不需要返回結(jié)果數(shù)據(jù),也不需要使用主變量。在主語言中嵌入SQL說明性語句(DECLARE)及控制語句(GRANT),只要給語句加上前綴EXECSQL和語句結(jié)束符END_EXEC即可。在C語言中,用分號(hào);代替END_EXEC64例:在C語言中說明共享變量:EXECSQLBEGINDECLARESECTIONintgrade,raise;chargivencno[5],cname[13],tname[9];

chargivensno[5],sname[9],sdept[11];

charSQLSTATE[6];EXECSQLENDDECLARESECTION;65

⑵不涉及游標(biāo)的嵌入式SQLDML語句

a.對(duì)于INSERT、DELETE和UPDATE語句,只要加上前綴標(biāo)識(shí)“EXECSQL”和結(jié)束標(biāo)志“END_EXEC”,就能嵌入在宿主語言程序中使用。例:①在關(guān)系C中插入一門新的課程,各屬性值已在相應(yīng)的共享變量中:

EXECSQLINSERTINTOC(CNO,CNAME,TNAME)

VALUES(:givencno,:cname,:tname);66②從關(guān)系SC中刪除一個(gè)學(xué)生的所有選課,該學(xué)生的姓名由共享變量sname提供。

EXECSQLDELETEFROMSCWHERESNO=(SELECTSNOFROMSWHERESNAME=:sname);67③把“數(shù)據(jù)庫”課程的全部成績(jī)?cè)黾幽硞€(gè)值(該值由共享變量raise提供)。

EXECSQLUPDATESCSETGRADE=GRADE+:raiseWHERECNOIN(SELECTCNOFROMCWHERECNAME=‘?dāng)?shù)據(jù)庫’);68b.對(duì)于SELECT語句,如果已知查詢結(jié)果肯定是單元組時(shí),可直接嵌入在主程序中使用,此時(shí)在SELECI語句中增加一個(gè)INTO子句,指出找到的值應(yīng)送到相應(yīng)的共享變量中去。例:在關(guān)系S中根據(jù)共享變量givensno的值檢索學(xué)生的姓名和所在系。

69例:在關(guān)系S中根據(jù)共享變量givensno的值檢索該學(xué)生的姓名和所在系:

EXECSQLSELECTSNAME,SDEPTINTO:sname,:sdeptFROMSWHERESNO=:givensno;此處sname,sdept,givensno都是共享變量,已在主程序中定義,并用SQL的DECLARE語句加以說明,在引用是加上“:”作為前綴標(biāo)識(shí),以示與數(shù)據(jù)庫中變量區(qū)別。70

⑶涉及游標(biāo)的嵌入式SQLDML語句

a、當(dāng)SELECT語句查詢結(jié)果是多個(gè)元組時(shí),此時(shí)要用游標(biāo)機(jī)制把多個(gè)元組一次一個(gè)地傳送給宿主語言程序處理。例:在關(guān)系SC表中檢索某學(xué)生(學(xué)生名由共享變量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ù)出錯(cuò)﹡/Break;

…/﹡對(duì)游標(biāo)所取的數(shù)據(jù)進(jìn)行處理﹡/printf(“%s,%s,%d”,sno,cno,grade);}EXECSQLCLOSEscx;73b.對(duì)游標(biāo)指向的元組進(jìn)行修改或刪除操作

當(dāng)游標(biāo)處于活動(dòng)狀態(tài)時(shí),可以修改或刪除游標(biāo)指向的元組。例:在上面的例子中,對(duì)找到的元組做如下處理:刪除不及格的選課,將6069分的成績(jī)?cè)黾佑晒蚕碜兞縭ise提供的值,再顯示該學(xué)生的成績(jī)信息(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ù)出錯(cuò)﹡/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等.壓縮文件請(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論