下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1第4章關(guān)系數(shù)據(jù)庫查詢語言SQL
本章要點:
SQL的基本概念數(shù)據(jù)定義語句、數(shù)據(jù)查詢語句、數(shù)據(jù)操縱語句視圖嵌入式SQL存儲過程與函數(shù)2SQL的基本概念SQL的發(fā)展1974年由Boyce和Chamberlin首先提出其后經(jīng)歷了ANSI(美國國家標(biāo)準(zhǔn)機構(gòu))SQL、SQL-92、SQL-99、SQL-2003、SQL-2006和SQL-2008等標(biāo)準(zhǔn)3SQL的特點:①SQL功能強大,集數(shù)據(jù)定義語言(DDL)、數(shù)據(jù)操縱語言(DML)和數(shù)據(jù)控制語言(DCL)于一體,使用統(tǒng)一的語法形式,完成數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)更新和數(shù)據(jù)控制功能,易學(xué)易用。②對SQL語句的解釋由DBMS完成,語句對在何處斷行沒有特別的要求,對大小寫不敏感。③SQL的操作對象和操作結(jié)果都是元組的集合。④SQL是高度非過程化的語言。。4SQL數(shù)據(jù)類型①字符串:CHAR(n),VARCHAR(n)②整數(shù):SHORTINT、INT(或INTEGER)③浮點數(shù):FLOAT,REAL,DOUBLE④定點數(shù):DECIMAL(n,d)或NUMERIC(n,d)表示由n位有效數(shù)字(不包括符號和小數(shù)點)組成的十進制定點數(shù),小數(shù)點后有d位數(shù)字。日期和時間:分別用DATE和TIME表示,實際上是某個特定格式的字符串,日期形如YYYY-MM-DD(年-月-日),時間形如HH:MM:SS(時:分:秒)。54.2數(shù)據(jù)定義語句SQL通過DDL(DataDefinitionLanguage,數(shù)據(jù)定義語言)定義和修改關(guān)系數(shù)據(jù)庫的邏輯結(jié)構(gòu),可以定義的對象包括基本表(關(guān)系模式)、視圖、索引和域。定義信息保存在數(shù)據(jù)字典中。數(shù)據(jù)字典是數(shù)據(jù)庫系統(tǒng)中各類數(shù)據(jù)描述的一個集合。61.關(guān)系模式的定義與刪除CREATETABLE<表名>(<屬性列名><數(shù)據(jù)類型>[列級完整性約束][,<屬性列名><數(shù)據(jù)類型>[列級完整性約束]][,···][,表級完整性約束]);7完整性約束的定義形式主要有以下5種:①NOTNULL:列級完整性約束,表示某個屬性不能取空值。②UNIQUE:列級完整性約束,表示某個屬性的取值必須唯一。③PRIMARYKEY:可以作為列級完整性約束,表示某個屬性為主碼;也可以作為表級完整性約束,用PRIMARYKEY(<屬性名列表>)子句來定義,表示屬性列表共同構(gòu)成這個表的主碼;8
④CHECK(<條件表達式>)子句:作為表級完整性約束,說明每個進入表中的元組必須滿足的條件。⑤FOREIGNKEY(<屬性名1>)REFERENCES<表名>(屬性名2)子句:作為表級完整性約束,說明表的外碼,表示所定義表中的屬性(即“屬性名1”)與另一個表中的屬性(即“屬性名2”)相對應(yīng)。9【例4-1】建立第3章提到的服裝銷售系統(tǒng)數(shù)據(jù)庫中的各個表。CREATETABLE服裝(服裝編號char(4)NOTNULLUNIQUE,品牌char(20),型號char(5),顏色char(2),價格unsignedint,PRIMARYKEY(服裝編號)//與NOTNULLUNIQUE等價,可省略);10CREATETABLE顧客(顧客編號char(4)NOTNULLUNIQUE,姓名char(20),性別char(2),年齡unsignedint,電話char(11),PRIMARYKEY(顧客編號)//與NOTNULLUNIQUE等價,可省略
);11CREATETABLE購買記錄(服裝編號char(4),顧客編號char(4),購買日期date,數(shù)量unsignedint,PRIMARYKEY(服裝編號,顧客編號),FOREIGNKEY(服裝編號)REFERENCES服裝關(guān)系(服裝編號),FOREIGNKEY(顧客編號)REFERENCES顧客關(guān)系(顧客編號));12刪除基本表DROPTABLE<表名>;用DROPTABLE語句將某個基本表刪除后.表中的數(shù)據(jù)連同表的結(jié)構(gòu)都從數(shù)據(jù)庫中消失了?!纠?-2】刪除顧客關(guān)系。DROPTABLE顧客;132.關(guān)系模式的修改基本表建立以后,可根據(jù)實際需要對其結(jié)構(gòu)進行修改,如增加列或刪除約束等。ALTERTABLE<表名>[ADD<屬性名><數(shù)據(jù)類型>[完整性約束1,…,完整性約束n]][DROP<完整性約束名>][MODIFY(<屬性名><數(shù)據(jù)類型>)];14【例4-3】向顧客關(guān)系中增加“地址”屬性。ALTERTABLE顧客系A(chǔ)DD地址char(50);【例4-4】修改顧客關(guān)系屬性姓名為30位定長字符串。ALTERTABLE顧客MODIFY姓名char(30);153.域定義域約束是最基本的完整性約束形式。當(dāng)向數(shù)據(jù)庫中插入數(shù)據(jù)時,數(shù)據(jù)庫管理系統(tǒng)會檢測插入的數(shù)據(jù)是否符合域的約束。域定義語句的語法如下:CREATEDOMAIN<域名><數(shù)據(jù)類型>[[NOT]NULL][DEFAULT<默認(rèn)值>][CHECK<條件表達式>];【例4-5】定義地址域,允許為空值。CREATEDOMAIN地址CHAR(50)NULL;164.索引的定義與刪除索引的定義有利于提高查詢速度,SQL可以創(chuàng)建和刪除索引文件?;颈斫⒁院螅瑪?shù)據(jù)庫管理員或表的建立者可以根據(jù)需要在基本表上建立一個或多個索引文件,以提供多種存取路經(jīng),加快存取速度。17索引的定義:CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<屬性列名>[ASC|DESC][,<屬性列名>[ASC[DESC]]…);UNIQUE表示索引的每一個索引值只對應(yīng)唯一的數(shù)據(jù)記錄CLUSTER:建聚簇索引,即索引項順序與表中記錄的物理順序一致,一個基表只能建一個聚簇索引ASC(升序,缺省)、DESC(降序)索引建立后由系統(tǒng)使用和維護,不需用戶干預(yù)18【例4-6】為顧客關(guān)系按姓名的升序建立聚簇索引。CREATECLUSTERINDEXIdxCnameON顧客(姓名);【例4-7】為購買記錄關(guān)系按顧客編號的升序、服裝編號的降序建立索引文件。CREATEINDEXIdxCCIDON購買記錄(顧客編號,服裝編號DESC);【例4-8】為服裝關(guān)系按價格的降序建立唯一性索引。CREATEUNIQUEINDEXIdxCpriceON服裝(價格DESC);19索引的刪除:當(dāng)一個索引不再需要時,就可以用DROPINDEX語句將其刪除,格式如下:DROPINDEX<索引名>;【例4-9】刪除會員信息關(guān)系的索引IdxCname。DROPINDEXIdxCname;204.3數(shù)據(jù)查詢語句所謂數(shù)據(jù)查詢,就是從數(shù)據(jù)庫所保存的眾多數(shù)據(jù)中挑出符合某種條件的一部分?jǐn)?shù)據(jù),或者將這些數(shù)據(jù)挑出來之后對它們進行適當(dāng)?shù)倪\算,然后得到某種匯總結(jié)果(即統(tǒng)計信息)。數(shù)據(jù)查詢的對象可以是基本表,也可以是視圖21查詢語句的基本結(jié)構(gòu)SELECT[ALL|DISTINCT]<目標(biāo)列表達式>[,<目標(biāo)列表達式>]… FROM<表名或視圖名>[,<表名或視圖名>]… [WHERE<條件表達式>] [GROUPBY<列名1>[HAVING<條件表達式>]] [ORDERBY<列名2>[ASC|DESC]];22整個SELECT語句的含義是,根據(jù)WHERE子句的條件表達式,從FROM子句指定的基本表或視圖中找出滿足條件的元組,再按SELECT子句中的目標(biāo)列表達式,選出元組中的屬性值形成結(jié)果表。如果有GROUPBY子句,則將結(jié)果按“列名1”的值進行分組,該屬性列值相等的元組為一個組。通常會對每組中的記錄用集函數(shù)。如果有GROUP子句帶HAVING短語,則只有滿足指定條件的組才予輸出。如果有ORDERBY子句,則結(jié)果表還要按“列名2”的值的升序(ASC,系統(tǒng)默認(rèn)值)或降序(DESC)排序。23SQL中的簡單查詢簡單查詢又叫單表查詢,是指查詢條件和內(nèi)容都只涉及一個基本表的查詢?!纠?-10】查詢所有顧客的信息。SELECT*FROM顧客;SELECT子句指出被選擇的目標(biāo)列表的名稱,“*”表示表的所有屬性,F(xiàn)ROM子句指出表的名稱,查詢結(jié)果就是會員信息關(guān)系中所有顧客的信息。24【例4-11】查詢所有顧客的編號、姓名及電話。SELECT顧客編號,姓名,電話FROM顧客;25【例4-12】查詢購買了服裝的顧客編號。SELECTDISTINCT顧客編號FROM購買記錄;本例中,用DISTINCT去掉重復(fù)行。如果沒有指定DISTINCT短語,則默認(rèn)為ALL,即保留結(jié)果表中取值重復(fù)的行。261.WHERE子句WHERE用來設(shè)定關(guān)系中的元組選擇條件,只有滿足這些條件的元組才能出現(xiàn)在結(jié)果中,相當(dāng)于關(guān)系代數(shù)中的選擇操作。WHERE子句常用的查詢條件可以是關(guān)系表達式或邏輯表達式,可以使用(NOT)IN、IS(NOT)NULL、(NOT)BETWEENAND、(NOT)LIKE等謂詞。27【例4-13】查詢20歲以下的女顧客的編號和姓名。SELECT顧客編號,姓名FROM顧客WHERE年齡<20AND性別=‘女’;查詢條件可以是使用=、<>(或!=)、>、<、>=、<=等比較運算符的關(guān)系表達式,也可以是由多個條件通過AND、OR、NOT等邏輯運算符組成的邏輯表達式。如果指定的條件是字符串類型的,需要把字符串用單引號括起來。28【例4-1】查詢年齡在18~30歲的顧客的姓名和性別。SELECT姓名,性別FROM顧客WHERE年齡BETWEEN18AND30;表達式“ABETWEENBANDC”能夠確定范圍,等價于“A>=BANDA<=C”。與之相對的表達式是“ANOTBETWEENBANDC”,用于查找屬性值不在指定范圍內(nèi)的元組。29【例4-15】查詢來自“佐丹奴”和“李寧”兩個品牌的服裝的信息。SELECT*FROM服裝WHERE品牌IN(‘佐丹奴’,‘李寧’);謂詞IN用來確定集合,可以用來查找屬性值屬于指定集合的元組。與之相對的謂詞是NOTIN,用于查找屬性值不屬于指定集合的元組。30【例4-16】查詢所有姓王的顧客的信息。SELECT*FROM顧客WHERE姓名LIKE‘王%’;使用LIKE謂詞,可以查詢指定的屬性列值與<匹配串>相匹配的元組。其格式如下:[NOT]LIKE‘<匹配串>’[ESCAPE‘<換碼字符>’]<匹配串>可以是一個完整的字符串,也可以含有通配符“%”或“_”。
“%”表示可以用任意長度的字符串替代。“_”表示可以用任意單個字符替代。如acb、aaccb、ab等都與匹配串“a%b”匹配,acb、adb等都與匹配串“a_b”匹配。31【例4-17】查詢所有姓李但全名為兩個字的顧客的信息。SELECT*FROM顧客WHERE姓名LIKE‘李__’;注意:一個漢字要占兩個字符的位置,所以匹配串李后面需要跟兩個空格?!纠?-18】查詢所有不姓李的顧客的信息。SELECT*FROM顧客WHERE姓名NOTLIKE‘李%’;32但當(dāng)“%”或“_”不是作為匹配串而是數(shù)據(jù)庫中某字符串屬性值的組成部分時,就需要告訴系統(tǒng)“%”或“_”需要進行轉(zhuǎn)義。轉(zhuǎn)義的方法是使用“ESCAPE‘<換碼字符>’”短語,用戶可以自己設(shè)定換碼字符,如“\”、“y”等。例如,“LIKE'\%%\%'ESCAPE'\'”中使用了“ESCAPE'\'”短語,就表明“\”是換碼字符,匹配串“\%%\%”中的“\%”指的是普通字符“%”,因此該匹配串將匹配所有以“%”開始并以“%”結(jié)束的字符串。33【例4-19】查詢姓名包含Kim_Jae的顧客的信息。SELECT*FROM顧客WHERE姓名LIKE'%Kim\_Jae%'ESCAPE'\';通過轉(zhuǎn)義,“\”后面的“_”作為一個普通字符使用。34判斷屬性值或輸入值是否為空值,可以用謂詞ISNULL和ISNOTNULL,這里的“IS”不能用“=”代替?!纠?-20】查詢電話是空值的顧客的姓名和性別。SELECT姓名,性別FROM會員信息WHERE電話ISNULL;【例4-21】查詢電話不是空值的顧客的姓名和性別。SELECT姓名,性別FROM會員信息WHERE電話ISNOTNULL;352.ORDERBY子句返回查詢結(jié)果時,元組的排列順序與數(shù)據(jù)的存儲順序相同。如果用戶需要按照某種指定的順序來顯示查詢結(jié)果,就需要使用ORDERBY子句。該子句只作用于查詢結(jié)果,并不會改變數(shù)據(jù)庫中的實際存儲順序。排序的依據(jù)可以是基于一個或多個屬性數(shù)據(jù)。當(dāng)依據(jù)多個屬性排序時,如果第一個屬性值相等,就按照第二個屬性值排序,以此類推。36【例4-22】查詢所有顧客的姓名和年齡,并按照年齡降序排列。SELECT姓名,年齡FROM顧客ORDERBY年齡DESC;【例4-23】查詢顧客C001的購買記錄,按購買日期降序排列,相同購買日期的按數(shù)量升序41排列。SELECT*FROM購買記錄WHERE顧客標(biāo)號='C001'ORDERBY購買日期DESC,數(shù)量;373.聚集函數(shù)聚集函數(shù)(SetFunction)是一組對查詢結(jié)果中的某屬性列進行統(tǒng)計的函數(shù),包括:COUNT([DISTINCT]<屬性名>):統(tǒng)計該屬性列中值的個數(shù),如果加DISTINCT,表示統(tǒng)計時不考慮重復(fù)值;COUNT(*):
統(tǒng)計關(guān)系中元組的個數(shù)。SUM([DISTINCT]<屬性名>):統(tǒng)計該屬性列中值的總和。該屬性必須是數(shù)值型的。AVG([DISTINCT]<屬性名>):統(tǒng)計該屬性列中值的平均。該屬性必須是數(shù)值型的。MAX(<屬性名>):統(tǒng)計該屬性列中的最大值。MIN(<屬性名>):統(tǒng)計該屬性列中的最小值。特別地,除COUNT(*)之外,聚集函數(shù)在做統(tǒng)計之前,都先把屬性列中的空值去掉。如果該屬性列中都是空值,則COUNT函數(shù)返回0,其他函數(shù)返回NULL。38【例4-24】查詢顧客的最低年齡。SELECTMIN(年齡)FROM顧客;【例4-25】查詢女顧客的平均年齡。SELECTAVG(年齡)FROM顧客WHERE性別='女';【例4-26】查詢顧客的總?cè)藬?shù)。SELECTCOUNT(*)FROM顧客;【例4-27】查詢購買了服裝的顧客總?cè)藬?shù)。SELECTCOUNT(DISTINCT顧客編號)FROM購買記錄;394.GROUPBY子句使用GROUPBY子句的查詢稱為分組查詢。GROUPBY子句將一個表按照指定屬性組值相等的記錄進行分組,再對每個組的數(shù)據(jù)進行相應(yīng)的操作。當(dāng)查詢語句中使用聚集函數(shù)時,GROUPBY子句將控制聚集函數(shù)運算的范圍。通常,與GROUPBY子句一起使用的還有一個HAVING子句。與WHERE子句相同的是,HAVING子句也描述條件,不同的是,HAVING子句描述的是分組條件,只有滿足分組條件的組才選出來處理。40【例4-28】查詢每天的購買記錄數(shù)。SELECT購買日期,COUNT(*)購買記錄數(shù)FROM購買記錄GROUPBY購買日期;41【例4-29】查詢購買記錄數(shù)在20筆以上的購買日期。SELECT購買日期FROM購買記錄GROUPBY購買日期HAVINGCOUNT(*)>20;【例4-30】查詢平均價格低于300元的品牌及其平均價格。SELECT品牌,AVG(價格)FROM服裝GROUPBY品牌HAVINGAVG(價格)<300;42多個關(guān)系上的查詢又稱為連接查詢。連接查詢包括等值連接、自然連接、非等值連接、自身連接、外連接查詢等類型。1.等值與非等值連接查詢將兩個表中對應(yīng)屬性列值相等的行連接起來,即當(dāng)連接條件運算符為“=”時,稱為等值連接。使用其他運算符稱為非等值連接。若在等值連接中把目標(biāo)列中重復(fù)的屬性去掉則為自然連接。43【例4-31】查詢購買了任意服裝的顧客的編號和姓名。SELECTDISTINCT顧客.顧客編號,姓名 FROM顧客,購買記錄
WHERE顧客.顧客編號=購買記錄.顧客編號;SELECT子句和WHERE子句中都用到了“表名.列名”這種格式來表示某一列屬于哪個表,以消除屬性列的二義性。但是如果某一列名在參加連接的各表中是唯一的,那么該列名前的表名是可以省略的。利用SELECT語句進行表的連接時,必須在WHERE子句中指明連接條件,否則就是做兩個表的笛卡兒積,其連接結(jié)果一般是無意義的。442.自身連接連接操作可以在不同的表之間進行,也可以在同一個表中進行。對同一個表進行的連接查詢稱為自身連接查詢?!纠?-32】查詢跟張珊年齡相同的顧客ID和姓名。SELECTC1.顧客ID,C1.會員信息 FROM會員信息C1,會員信息C2 WHEREC1.年齡=C2.年齡ANDC2.姓名='張珊';FROM子句中會員信息被打開兩次,為區(qū)分兩者所以分別賦以不同的別名C1、C2。453.外連接內(nèi)連接的查詢結(jié)果都是滿足連接條件的元組。但是,在內(nèi)連接的查詢結(jié)果中,一些重要的信息可能會因為連接條件不滿足而被丟失。如果允許結(jié)果關(guān)系中出現(xiàn)的不滿足連接條件的某些元組,這種連接稱為外連接。外連接的表示方法為SELECT<屬性列1>,<屬性列2>,··· FROM<表名1>LEFT/RIGHTOUTJOIN<表名2>ON[約束條件];左外連接列出左邊關(guān)系中所有的元組,右外連接列出右邊關(guān)系中所有的元組。46【例4-33】查詢每個顧客的基本信息及其購物信息。若顧客沒有購物,則顯示基本信息,其購物信息用空值表示。SELECT顧客.顧客編號,姓名,性別,年齡,電話,服裝編號,購買日期,數(shù)量FROM顧客LEFTOUTJOIN購買記錄ON(顧客.顧客編號=購買記錄.顧客編號);47484.多表連接查詢?nèi)绻樵兩鎯蓚€以上的表,則稱為多表連接查詢。要注意定義表之間的連接條件。
【例4-34】查詢每個顧客的基本信息、購物信息及其所購服裝的詳細(xì)信息,結(jié)果按顧客編號升序排列。SELECT*FROM顧客,購買記錄,服裝 WHERE顧客.顧客編號=購買記錄.顧客編號AND購買記錄.服裝編號=服裝.服裝編號 ORDERBY顧客.顧客編號;49【例4-35查詢購買過“李寧”服裝的顧客信息。SELECTDISTINCT顧客.* FROM顧客,購買記錄,服裝 WHERE顧客.顧客編號=購買記錄.顧客編號AND購買記錄.服裝編號=服裝.服裝編號AND品牌='李寧';50子查詢在一個查詢語句的WHERE或HAVING條件子句中嵌入另一個查詢,這種具有層次關(guān)系的查詢稱為嵌套查詢。兩個查詢互相稱為父查詢和子查詢。嵌套查詢可以是多層的。【例4-36】查詢購買了“W003”服裝的顧客姓名和電話。SELECT姓名,電話FROM顧客WHERE顧客編號IN(SELECT顧客編號FROM購買記錄WHERE服裝編號='W003');
51不相關(guān)子查詢:子查詢的條件中不涉及父查詢中的屬性列相關(guān)子查詢:子查詢的條件中涉及父查詢中的屬性列執(zhí)行方式:不相關(guān)子查詢:系統(tǒng)對子查詢先行求值,然后把子查詢的結(jié)果作為父查詢的條件組成部分,進行父查詢的處理。子查詢只執(zhí)行一次,處理過程較為簡單。相關(guān)子查詢:逐一考察父查詢中的每個元組(當(dāng)前元組),得到相應(yīng)屬性值后傳入子查詢作為條件,執(zhí)行子查詢,子查詢得到的結(jié)果又作為父查詢的條件組成部分,繼續(xù)對當(dāng)前元組進行處理。依此類推,直至父查詢中所有元組被處理完。子查詢多次運行,每次執(zhí)行都是針對父查詢中的一個元組。52根據(jù)父查詢與子查詢之間的連接符的不同,可以將子查詢分為:帶有比較運算符的子查詢,帶有IN謂詞的子查詢,帶有ANY或ALL謂詞的子查詢,帶有EXISTS謂詞的子查詢。531.帶有比較運算符的子查詢當(dāng)確定子查詢返回的結(jié)果是單值時,可以使用比較運算符(>、>=、=、<、<=、<>)來連接父查詢與子查詢。【例4-37】查詢跟張珊年齡相同的顧客編號和姓名。SELECT顧客編號,姓名FROM顧客C1WHEREC1.年齡=(SELECT年齡FROM顧客C2WHEREC2.姓名=‘張珊’);542.帶IN謂詞的子查詢當(dāng)子查詢的查詢結(jié)果包含多個值時,經(jīng)常會使用IN謂詞來連接子查詢和父查詢。【例4-38】查詢購買了“李寧”服裝的顧客姓名。SELECT姓名FROM顧客WHERE顧客編號IN(SELECT顧客編號FROM購買記錄WHERE服裝編號IN(SELECT服裝編號FORM服裝WHERE品牌=李寧));有些嵌套查詢可以用連接運算替代,到底采用哪種方法,用戶可以根據(jù)自己的習(xí)慣確定。553.帶有ANY或ALL謂詞的子查詢ANY謂詞表示子查詢結(jié)果中的某個值,ALL謂詞表示子查詢結(jié)果中的所有值。ANY或ALL謂詞必須與比較運算符一起使用。
【例4-39】查詢沒有購買W001服裝的顧客姓名。SELECT姓名FROM顧客WHERE顧客編號<>ALL(SELECT顧客編號FROM購買記錄WHERE服裝編號='W001');這個查詢可以用另一種形式表示:SELECT姓名FROM顧客WHERE顧客編號NOTIN(SELECT顧客編號FROM購買記錄WHERE服裝編號='W001');56【例4-40】查詢比“佐丹奴”任意一款服裝價格低的服裝ID。SELECT服裝編號FROM服裝WHERE價格<ANY(SELECT價格FROM服裝WHERE品牌='佐丹奴');這個查詢可以用另一種形式表示:SELECT服裝編號FROM服裝WHERE價格<(SELECTMAX(價格)FROM服裝WHERE品牌='佐丹奴');57事實上,用比較運算符與ANY或ALL謂詞配合使用所表示的子查詢,其查詢效果等價于用集函數(shù)或INANY或ALL謂詞來表示的子查詢。其對應(yīng)關(guān)系如下圖所示。584.帶有EXISTS謂詞的子查詢EXISTS謂詞用于判斷是否有值存在。如果在一個子查詢之前加EXISTS謂詞,則子查詢不管返回的結(jié)果是什么,只要有值返回,就取“真”。與之對應(yīng)的是NOTEXISTS謂詞,放在子查詢之前,表示當(dāng)子查詢沒有任何值返回時就取“真”。59【例4-41】查詢沒有購買過任何服裝的顧客的顧客編號和姓名。SELECT顧客編號,姓名FROM顧客WHERENOTEXISTS(SELECT*FROM購買記錄WHERE顧客編號=顧客.顧客編號);顯然,這個查詢是相關(guān)子查詢,子查詢的每次執(zhí)行都與父查詢中某個特定元組相關(guān)。60在SQL中只有對應(yīng)于存在量詞的EXIST謂詞,而沒有對應(yīng)于“所有”、“全部”等全稱量詞的謂詞。要實現(xiàn)全稱量詞的查詢,只能借助存在量詞,依據(jù)等價轉(zhuǎn)換原則來實現(xiàn),即61【例4-42】查詢購買了所有服裝的顧客的姓名。即查詢這樣一些顧客的姓名,沒有一種服裝他沒有購買。SELECT姓名FROM顧客WHERENOTEXISTS(SELECT*FROM服裝WHERENOTEXISTS(SELECT*FROM購買記錄WHERE顧客編號=顧客.顧客編號AND服裝編號=服裝.服裝編號);62集合查詢SQL查詢的結(jié)果是元組的集合,所以多個查詢的結(jié)果可以進行集合操作。集合操作主要包括:并UNION交INTERSECT差EXCEPT參加集合操作的各查詢結(jié)果的列數(shù)必須相同,對應(yīng)列的數(shù)據(jù)類型也必須相同。631.并UNION【例4-43】查詢女顧客和年齡小于30歲的顧客的信息。SELECT*FROM顧客WHERE性別='女'UNIONSELECT*FROM顧客WHERE年齡<30;以上查詢可以等價的表示如下:SELECT*FROM顧客WHERE性別='女'OR年齡<30;642.交INTERSECT【例4-44】查詢女顧客和年齡小于30歲的顧客的交集。SELECT*FROM顧客WHERE性別='女'INTERSECTSELECT*FROM顧客WHERE年齡<30;以上查詢可以等價地表示如下:SELECT*FROM顧客WHERE性別='女'AND年齡<30;653.差EXCEPT【例4-45】查詢女顧客和年齡小于30歲的顧客的差集。SELECT*FROM顧客WHERE性別='女'EXCEPTSELECT*FROM顧客WHERE年齡<30;以上查詢可以等價的表示如下:SELECT*FROM顧客WHERE性別='女'AND年齡>=30;66數(shù)據(jù)操縱語句數(shù)據(jù)操縱是指對數(shù)據(jù)庫中的對象(基本表和視圖)進行更新,即修改、插入和刪除等操作。這些操作分別是由UPDATE、INSERT和DELETE語句來完成的。671.插入數(shù)據(jù)(1)用VALUES子句向表中插入一條記錄INSERT語句形式為:INSERTINTO<表名>[<列名1>,<列名2>,···]VALUES(<值1>,<值2>,?)“列名”是將要輸入值的列名,它們與VALUES子句中的值要相對應(yīng)。如果缺省“列名”,則必須由VALUES子句提供所有列的值。尤其要注意的是,被定義為NOTNULL的列必須給值。【例4-46】把顧客趙陸的記錄加入到會員信息中。INSERTINTO顧客VALUES('C004','趙陸','男',27,'');68(2)用子查詢向表中插入多條記錄INSERT語句形式為:INSERTINTO<表名>[(<列名1>,<列名2>,?)]SELECT<列名1>,<列名2>,···FROM<表名>WHERE<搜索條件>這種形式的INSERT語句可把取自其他表中的數(shù)據(jù)插入到一個表中,不限制插入的行數(shù)。同時,SELECT語句可以是簡單的查詢,也可以是復(fù)雜查詢,其查詢結(jié)果即是插入的數(shù)據(jù)。69【例4-47】創(chuàng)建服裝及其購買者平均年齡的表,并根據(jù)數(shù)據(jù)庫中數(shù)據(jù)填入內(nèi)容。CREATETABLE服裝-顧客年齡(服裝編號CHAR(4),顧客平均年齡unsignedint,PRIMARYKEY服裝編號);INSERTINTO服裝-顧客年齡(服裝編號,顧客平均年齡)SELECT服裝編號,AVG(年齡)FROM顧客,購買記錄WHERE顧客.顧客編號=購買記錄.顧客編號GROUPBY服裝編號;702.更新數(shù)據(jù)更新數(shù)據(jù)庫中的記錄用UPDATE語句。UPDATE語句形式為:UPDATE<表名>SET<列名>=<表達式>[,<列名>=<表達式>,?][WHERE<條件表達式>];SET子句提供要修改的列名和將要存儲的新值。如果指定WHERE子句,則將確定這些列中的哪些行將被修改;如果WHERE子句缺省,則這些列中的所有行都將被修改。71(1)修改單個元組的值【例4-48修改顧客張珊的電話號碼為“”。UPDATE顧客SET電話=''WHERE姓名='張珊';(2)修改多個元組的值【例4-49把所有顧客的年齡加1歲。UPDATE顧客SET年齡=年齡+1;72(3)帶子查詢的修改在標(biāo)準(zhǔn)SQL中,UPDATE語句中的WHERE子句可以包含子查詢,用于構(gòu)造修改的條件?!纠?-50把在“20100516”這一天有過銷售記錄的服裝價格減20。UPDATE服裝SET價格=價格-20WHERE服裝編號IN(SELECT服裝編號FROM購買記錄WHERE購買日期='20100516');733.刪除數(shù)據(jù)刪除數(shù)據(jù)的語句格式為:DELETEFROM<表名>[WHERE<條件表達式>];DELETE命令用于刪除表中指定的某些行,如果有WHERE子句,則所有滿足條件的行全被刪除;如果沒有,則表中所有行都被刪除。如果省略WHERE子句,表示刪除表中全部元組,但表的定義仍在數(shù)據(jù)字典中。也就是說,DELETE語句刪除的是表中的數(shù)據(jù),而不是關(guān)于表的定義。74【例4-51】刪除所有的購買記錄。DELETEFROM購買記錄子查詢同樣也可以嵌套在DELETE語句中,用以構(gòu)造執(zhí)行刪除操作的條件。刪除數(shù)據(jù)時,應(yīng)該考慮刪除掉相關(guān)聯(lián)的信息,保證數(shù)據(jù)庫中數(shù)據(jù)的完整性?!纠?-52】刪除“李寧”牌服裝及其所有購買記錄。DELETEFROM購買記錄WHERE服裝編號IN(SELECT服裝編號FROM服裝WHERE品牌='李寧');DELETEFROM服裝WHERE品牌='李寧';75上面介紹了用于數(shù)據(jù)更新的三條語句INSERT、UPDATE和DELETE,在使用這些語句的過程中需要注意以下兩點:①更新操作一次只能對一個表進行,如果希望更新多個表,則必須做多次更新操作。②在進行更新操作時,必須考慮數(shù)據(jù)庫的完整性。如例4-49中兩個語句如果交換順序,會破壞數(shù)據(jù)庫的參照完整性。76視圖視圖的概念:視圖是從一個或幾個基本表(或視圖)導(dǎo)出的表,與基本表不同,是一個虛表。數(shù)據(jù)庫中只存放視圖的定義,而不存放視圖對應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍存放在原來的基本表中。所以,基本表中的數(shù)據(jù)發(fā)生變化,從視圖中查詢出的數(shù)據(jù)也就隨之改變了。從這個意義上講,視圖就像一個窗口,透過它,可以看到數(shù)據(jù)庫中自己感興趣的數(shù)據(jù)及其變化。視圖一經(jīng)定義,就可以和基本表一樣被查詢、被刪除,我們也可以在一個視圖之上再定義新的視圖,但對視圖的更新(增加、刪除、修改)操作則有一定的限制。77視圖的作用:①視圖是關(guān)系數(shù)據(jù)庫系統(tǒng)提供給用戶以多種角度觀察數(shù)據(jù)庫中的數(shù)據(jù)的重要機制。②視圖可以簡化數(shù)據(jù)庫用戶的操作。③視圖給數(shù)據(jù)庫的安全性控制帶來方便。④視圖為數(shù)據(jù)庫系統(tǒng)提供了一定程度的邏輯獨立性。78視圖的建立語句格式如下:CREATEVIEW視圖名[(視圖列名表)]AS<子查詢>[WITHCHECKOPTION];視圖的數(shù)據(jù)是子查詢的結(jié)果。視圖列名表是個可選項,當(dāng)不選該項時,新生成視圖的列名與SELECT命令所選擇數(shù)據(jù)列的名稱相同。如果選擇該項時,則給SELECT命令所選擇的數(shù)據(jù)重新起個名字作為視圖的列名,它們的對應(yīng)關(guān)系是按順序?qū)?yīng)?!癧WITHCHECKOPTION]”也是一個選擇項,當(dāng)選擇該項時,用戶必須保證在向視圖中插入數(shù)據(jù)時,該數(shù)據(jù)能夠滿足視圖定義中SELECT命令所指定的條件。
79【例4-53】創(chuàng)建一個視圖,顯示“李寧”牌服裝的信息。CREATEVIEW服裝-李寧ASSELECT服裝編號,型號,顏色,價格FROM服裝WHERE品牌='李寧';80組成視圖的屬性列名或者全部省略或者全部指定,沒有第三種選擇。如果省略了視圖的各屬性列名,則隱含該視圖由子查詢中SELECT子句目標(biāo)列中的諸字段組成。但在下列三種情況下必須明確指定組成視圖的所有列名:某個目標(biāo)列不是單純的屬性名,而是集函數(shù)或列表達式。多表連接時選出了幾名同名列作為視圖的字段。需要在視圖中為某個列啟用新的更適合的名字。81【例4-54】建立一個30歲以上顧客的ID、姓名、性別、出生年份的視圖。CREATEVIEW顧客1(顧客ID,姓名,性別,出生年份)ASSELECT顧客ID,姓名,性別,2010-年齡FROM會員信息WHERE年齡>30;如果希望今后可以對視圖進行正確的更新操作,還必須在定義視圖時加上WITHCHECKOPTION子句,如上面的語句可以改為:CREATEVIEW顧客1(顧客編號,姓名,性別,出生年份)ASSELECT顧客編號,姓名,性別,2010-年齡FROM顧客WHERE年齡>30WITHCHECKOPTION;82【例4-55】建立一個30歲以上女顧客的編號、姓名、出生年份的視圖。CREATEVIEW顧客2ASSELECT顧客編號,姓名,出生年份FROM顧客1WHERE性別='女';【例4-56】建立購買了“李寧”服裝的顧客信息及服裝信息的視圖。CREATEVIEW顧客-李寧ASSELECT顧客.*,服裝.*FROM顧客,購買記錄,服裝WHERE顧客.顧客ID=購買記錄.顧客編號AND服裝.服裝編號=購買記錄.服裝編號AND品牌='李寧';83視圖的刪除
語句格式如下:DROPVIEW視圖名;DROPVIEW語句將視圖的定義從數(shù)據(jù)字典中刪除,由此視圖導(dǎo)出的其他視圖也將自動刪除;若導(dǎo)出此視圖的基本表刪除,則此視圖也將自動刪除。【例4-57】刪除視圖“顧客-李寧”。DROPVIEW顧客-李寧;刪除視圖命令DROPVIEW僅僅刪除視圖的定義,對基本表及其數(shù)據(jù)無任何影響。84視圖的查詢【例4-58】查詢價格大于400元的“李寧”牌服裝的信息SELECT*FROM服裝-李寧WHERE價格>400;對視圖進行查詢時,系統(tǒng)首先從數(shù)據(jù)字典中取出該視圖的定義,然后把定義中的子查詢和視圖查詢語句結(jié)合起來,形成一個修正的查詢語句,本例修正后的查詢語句為:SELECT服裝編號,型號,顏色,價格FROM服裝WHERE價格>400AND品牌='李寧';由于視圖的查詢實質(zhì)是對基本表的查詢,因此基本表的變化可以反映到視圖上,視圖就如同“窗口”一樣,通過視圖可以看到基本表動態(tài)的變化。85視圖的更新更新視圖是指通過視圖來插入、刪除和修改數(shù)據(jù)。由于視圖是不實際存儲數(shù)據(jù)的虛表,因此對視圖的更新,最終要轉(zhuǎn)換為對基本表的更新。為防止用戶通過視圖對數(shù)據(jù)進行增加、刪除、修改時,有意無意地對不屬于視圖范圍內(nèi)的基本表數(shù)據(jù)進行操作,可在定義視圖時加上WITHCHECKOPTION子句。這樣在視圖上增刪改數(shù)據(jù)時,DBMS會檢查視圖定義中的條件,若不滿足條件,則拒絕執(zhí)行該操作。86【例4-59】修改服裝“W003”的價格為360。UPDATE服裝-李寧SET價格=360WHERE服裝編號='W003';將轉(zhuǎn)換成對基本表商品信息的更新:UPDATE服裝SET價格=360WHERE品牌='李寧'AND服裝編號='W003';87常見的視圖形式可以總結(jié)如下。①行列子集視圖:視圖是從單個基本表導(dǎo)出的,并且只是去掉了基本表的某些行和某些列,但保留了碼。②WITHCHECKOPTION視圖:定義視圖時加上了WITHCHECKOPTION子句。③基于多個基表的視圖:定義的視圖是由兩個以上的基本表導(dǎo)出。④基于視圖的視圖:定義的新視圖是由舊的視圖導(dǎo)出。⑤帶表達式的視圖:定義的視圖中的字段來自字段表達式或常數(shù)。⑥分組視圖:定義視圖時含有GROUPBY子句。一般地,行列子集視圖是可更新的。除行列子集視圖外,還有些視圖理論上是可更新的,但它們的確切特征還是尚待研究的課題。還有些視圖從理論上是不可更新的。88/11388/113視圖的作用簡化用戶操作數(shù)據(jù)看起來簡單、清晰。用戶可以從多角度看待同一數(shù)據(jù)靈活共享數(shù)據(jù)庫。對數(shù)據(jù)庫重構(gòu)提供了一定程度的邏輯獨立性當(dāng)數(shù)據(jù)庫重構(gòu)造(如增加表,或增加字段)時,用戶和用戶程序不會受影響。只是由于視圖的更新是有條件的,因此視圖只能在一定程度上提供數(shù)據(jù)的邏輯獨立性。能夠?qū)C密數(shù)據(jù)提供安全保護對不同的用戶定義不同的視圖,實現(xiàn)重要數(shù)據(jù)的隱藏。89嵌入式SQL任何可以聯(lián)機交互使用的標(biāo)準(zhǔn)SQL語句都可以嵌入到COBOL、C、PASCAL、PL/1、FORTRAN、Ada等宿主語言中,從而滿足不同應(yīng)用開發(fā)的需求。嵌入式SQL的語句分為兩類:可執(zhí)行SQL語句和說明性SQL語句??蓤?zhí)行SQL語句實現(xiàn)對數(shù)據(jù)庫的操作,包括DDL、DML和DCL語句。說明性SQL語句用于定義變量.。90內(nèi)嵌SQL語句的C程序組成【例4-60】在服裝銷售數(shù)據(jù)庫中建立一個名為雇員(EMP)的表,表中有列雇員編號(EMPNO)、姓名(EMPNAME)、工作(JOB)、出生年月(BIRTH)、聘用日期(HIREDATE)、性別(SAL)、部門編號(DEPTNO)。創(chuàng)建者是WANG。9192無游標(biāo)的操作常用的無游標(biāo)操作有INSERT、UPDATE、DELETE和只返回一行的SELECT。INSERT、UPDATE和DELETE操作不返回數(shù)據(jù)行,只返回一個代碼,表明操作的成功或失敗?!纠?.61】向雇員表(EMP)中插入一個新記錄行,其EMPNO、NAME、JOB、BIRTH、HIREDATE、SAL、DEPTNO分別由宿主變量PNO、PNAME、PJOB、PBIRTH、PHIRE、SEX、PTNO給出。EXECSQLINSERTINTOEMP(EMPNO,NAME,JOB,BIRTH,HIREDATE,SAL,BPLACE)VALUES(:PNO,:PNAME,:PJOB,:PBIRTH,:PHIRE,:SEX,:PTNO)93帶游標(biāo)的查詢操作一般地,一條SQL的SELECT語句產(chǎn)生一個結(jié)果表(含有多行的數(shù)據(jù)集合)返回給應(yīng)用程序,但宿主語言(C語言)一般每次只能處理一個元組的數(shù)據(jù)。這就存在一個所謂的“阻抗失配”問題,即SQL是在集合上操作的,而宿主語言(C語言)是在集合的成員上操作的。為此需要用游標(biāo)機制,將集合操作轉(zhuǎn)換成單個元組處理。游標(biāo)的作用是:數(shù)據(jù)庫管理系統(tǒng)建立一個結(jié)果表,包含通過嵌入在C應(yīng)用程序中的SQL語句查詢獲得的所有數(shù)據(jù)行,通過游標(biāo)標(biāo)識并指向結(jié)果表的當(dāng)前行。一個已命名的游標(biāo)和一條SELECT語句相關(guān)聯(lián)。游標(biāo)必須先定義,然后通過三條專門的SQL語句對數(shù)據(jù)進行操作。94有關(guān)游標(biāo)的命令有四條,如下所示:DECLARECURSOR//定義游標(biāo)OPENCURSOR//打開游標(biāo)FETCH//取一行數(shù)據(jù)CLOSECURSOR//關(guān)閉游標(biāo)打開游標(biāo)就是執(zhí)行相應(yīng)的SELECT語句的查詢操作,檢索多行數(shù)據(jù),把所有滿足查詢條件的數(shù)據(jù)行組成一個集合,稱為游標(biāo)活動集(Activeset)或結(jié)果表,并把游標(biāo)指針置于其首端。然后通過取數(shù)據(jù)操作(FETCH),一行一行地移動游標(biāo)指針,返回活動集中的數(shù)據(jù),把它們傳送給宿主變量。查詢完成后,應(yīng)當(dāng)關(guān)閉游標(biāo)。95游標(biāo)定義語句的形式為:EXECSQLDECLARE<游標(biāo)名>CURSORFOR<SELECT語句>例如:EXECSQLDECLARECSR1CURSORFORSELECTEMPNO,NAME,JOB,BIRTHFROMEMP96打開游標(biāo)的語句形式為:EXECSQLOPEN<游標(biāo)名>例如,打開游標(biāo)CSR1的命令為:EXECSQLOPENCSR1OPEN語句檢查WHERE子句中的宿主變量,并給它賦值(若存在),從而標(biāo)識出哪些記錄行滿足查詢條件構(gòu)成活動集。OPEN語句執(zhí)行后,游標(biāo)指針指向活動集的第一行數(shù)據(jù)。97通過游標(biāo)取數(shù)據(jù)的語句形式為:EXECSQLFETCH<游標(biāo)名>INTO:<宿主變量l>,:<宿主變量2>,···例如,把游標(biāo)CSR1檢索結(jié)果賦給宿主變量c#和grade。EXECSQLFETCHCSR1INTO:c#,:grade98關(guān)閉游標(biāo)的語句形式為:EXECSQLCLOSE<游標(biāo)名>例如,關(guān)閉游標(biāo)CSR1的命令為:EXECSQLCLOSECSR1關(guān)閉游標(biāo)操作使游標(biāo)的活動集無定義,不能再進行取數(shù)操作。99存儲過程建立存儲過程可以指定所使用的程序設(shè)計語言。PL/SQL(ProcedureLanguage/SQL,PL/SQL)是編寫數(shù)據(jù)庫存儲過程的一種過程語言,結(jié)合了SQL的數(shù)據(jù)操作能力和過程化語言的流程控制能力,是SQL的過程化擴展。100PL/SQL的塊結(jié)構(gòu)和變量常量的定義基本的SQL是高度非過程化的語言。。ESQL將SQL語句嵌入程序設(shè)計語言,借助高級語言的控制功能實現(xiàn)過程化。PL/SQL是對SQL的擴展,使其增加了過程化語句功能。PL/SQL程序的基本結(jié)構(gòu)是塊。所有的PL/SQL程序都是由塊組成的。這些塊之間可以互相嵌套,每個塊完成一個邏輯操作。以下是PL/SQL塊的基本結(jié)構(gòu):101/*定義部分*/DECLARE/*定義的變量、常量等只能在該基本塊中使用*/------變量、常量、游標(biāo)、異常等/*當(dāng)基本塊執(zhí)行結(jié)束時,定義就不再存在*//*執(zhí)行部分*/BEGIN------SQL語句、PL/SQL語句的流程控制語句EXCEPTION/*遇到不能繼續(xù)執(zhí)行的情況稱為異常*/------異常處理部分/*在出現(xiàn)異常時,采取措施來糾正錯誤或報告錯誤*/END;
102PL/SQL中定義變量的語法形式如下:變量名數(shù)據(jù)類型[[NOTNULL]:=初值表達式]或變量名數(shù)據(jù)類型[[NOTNULL]初值表達式]常量的定義類似于變量的如下:常量名數(shù)據(jù)類型CONSTANT:=常量表達式常量必須給一個值,并且該值在存在期間或常量的作用域內(nèi)不能改變。如果試圖修改它,PL/SQL將返回一個異常。賦值語句如下:
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年輕工業(yè)生產(chǎn)質(zhì)量管理手冊
- 企業(yè)職業(yè)健康安全管理員手冊(標(biāo)準(zhǔn)版)
- 傳染病消毒隔離管理制度
- DB61T 2094.6-2025天麻生產(chǎn)技術(shù)規(guī)范 第6部分:商品天麻
- 超市商品銷售及營銷策略制度
- 采購團隊培訓(xùn)與發(fā)展制度
- 辦公室員工保密承諾制度
- 2026年石獅市鴻山鎮(zhèn)第二中心幼兒園招聘備考題庫帶答案詳解
- 2026年未央?yún)^(qū)漢城社區(qū)衛(wèi)生服務(wù)中心招聘備考題庫及1套參考答案詳解
- 養(yǎng)老院安全管理與應(yīng)急制度
- 人力資源部2025年度工作總結(jié)與2026年度戰(zhàn)略規(guī)劃
- 2025年安徽理工大學(xué)馬克思主義基本原理概論期末考試參考題庫
- 機械工程師職稱評定技術(shù)報告模板
- 檔案移交數(shù)字化建設(shè)規(guī)劃
- 孤獨癥個案護理
- 高職汽車維修專業(yè)培訓(xùn)教材
- 2026年中級注冊安全工程師之安全生產(chǎn)法及相關(guān)法律知識考試題庫500道含答案ab卷
- 2026年廣州公務(wù)員考試行測真題之言語理解與表達及答案(名校卷)
- 考點解析人教版九年級《電與磁》專項測試試卷(含答案詳解)
- GB/T 39693.4-2025硫化橡膠或熱塑性橡膠硬度的測定第4部分:用邵氏硬度計法(邵爾硬度)測定壓入硬度
- 2025年職教高考試題內(nèi)容及答案
評論
0/150
提交評論