第四章 結(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頁,還剩108頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章結(jié)構(gòu)化查詢語言--SQL教學(xué)要求:了解本章所有概念的含義;掌握表、視圖、索引的創(chuàng)建與撤消的語句格式及功能;掌握數(shù)據(jù)的插入、刪除和修改的語句格式及功能;熟練掌握庫查詢語句SELECT的各種格式和相應(yīng)功能。對于電子商務(wù)專業(yè),多表嵌套和謂詞查詢不作要求。SQL有多個版本:SQL86、SQL89SQL2、SQL3等。現(xiàn)在SQL幾乎被所有關(guān)系數(shù)據(jù)庫管理系統(tǒng)所使用。SQL具有數(shù)據(jù)定義(DDL)、數(shù)據(jù)操縱(DML)和數(shù)據(jù)控制(DCL)功能。(操作命令、窗口界面)SQL的數(shù)據(jù)定義功能能夠定義數(shù)據(jù)庫的三級模式結(jié)構(gòu)。在SQL中,外模式又叫視圖(View),全局模式簡稱模式(Schema)或數(shù)據(jù)庫(Database),內(nèi)模式由系統(tǒng)根據(jù)數(shù)據(jù)庫模式自動實現(xiàn),一般無需用戶過問。在SQL中,每個關(guān)系又叫基本表(Table),屬性又叫字段(Field)或列(Column),元組又叫行(Row)。一個數(shù)據(jù)庫由若干個基本表組成,通常一個基本表對應(yīng)存儲在外存數(shù)據(jù)庫空間的一個存儲文件中。每個視圖也是一個關(guān)系,它由基本表產(chǎn)生出來,有自己獨立的結(jié)構(gòu)定義,但沒有獨立的數(shù)據(jù)存在,它的數(shù)據(jù)來自基本表,間接地來自存儲基本表的數(shù)據(jù)存儲文件,所以又把視圖稱為虛表。SQL的數(shù)據(jù)操縱功能包括對基本表和視圖的數(shù)據(jù)查詢、插入、刪除和修改,具有很強的數(shù)據(jù)查詢能力。對于SQL任一種數(shù)據(jù)操縱,它的操作對象都是元組的集合,其操作結(jié)果也是元組的集合??傊?,SQL是一種高度非過程化的面向集合的語言。SQL的控制功能主要是對用戶的訪問權(quán)限加以控制,以保證系統(tǒng)的安全性。一般由具體系統(tǒng)的數(shù)據(jù)庫管理員使用,負責(zé)用戶的訪問控制工作。4.1數(shù)據(jù)庫模式的建立和刪除當(dāng)需要在計算機中某個關(guān)系數(shù)據(jù)庫管理系統(tǒng)之下建立數(shù)據(jù)庫時,首先就要使用數(shù)據(jù)庫模式的建立命令定義數(shù)據(jù)庫名,即模式名,然后在其中定義各個基本表、視圖等有關(guān)對象。CREATE{SCHEMA|DATABASE}<數(shù)據(jù)庫名>[AUTHORRIZATION<所有者名>]語句功能:在系統(tǒng)中建立一個只有名字的空數(shù)據(jù)庫,并定義出它的所有者名。語句說明:語句關(guān)鍵字、標識符、字符串常量。4.1.1建立數(shù)據(jù)庫模式語句舉例:Createschemaxueshauthorization劉勇Createdatabase教學(xué)庫當(dāng)前數(shù)據(jù)庫、默認數(shù)據(jù)庫默認所有者名為dbo。DROP{SCHEMA|DATABASE}<數(shù)據(jù)庫名>語句功能:在系統(tǒng)中刪除一個數(shù)據(jù)庫。同時刪除庫中的所有信息。語句舉例:Dropdatabasexuesh4.1.2刪除數(shù)據(jù)庫模式4.2表結(jié)構(gòu)的建立、修改和刪除在系統(tǒng)中命名了一個關(guān)系數(shù)據(jù)庫之后,接著就要在其中建立關(guān)系數(shù)據(jù)庫模式設(shè)計中的每個關(guān)系(表)。CREATETABLE[<數(shù)據(jù)庫名><所有者名>]<基本表名>(<列定義>,…[,<表級完整性約束>,…])語句功能:在當(dāng)前或給定的數(shù)據(jù)庫中定義一個表的結(jié)構(gòu)(關(guān)系模式)。語句說明:每個列的名字是一個用戶定義的標識符,列名后面跟著其數(shù)據(jù)類型的描述。四種P75。4.2.1建立表結(jié)構(gòu)語句說明:每個列后面的完整性約束稱為列級完整性約束。六種P75。<表級完整性約束>在所有列定義后給出。四種P75。除默認值約束和空值/非空值外,對于其他約束,若只涉及到一個列時,則既可以作為列級完整性約束,又可以作為表級完整性約束,當(dāng)然只能取其一使用,若涉及到多個列時,則只能作為表級完整性約束來定義。語句舉例:p76Createtable學(xué)生(學(xué)生號char(7)primarykey,姓名char(6)notnullunique,性別char(2)notnullcheck(性別=‘男’or性別=‘女’),出生日期datetimrcheck(出生日期<‘1993-12-31’),專業(yè)intcheck(年級>=1and年級<=4))語句舉例:p76Createtable課程(課程號char(4)primarykey,課程名char(10)notnullunique,課程學(xué)分intcheck(課程學(xué)分>=1and課程學(xué)分<=6))語句舉例:p76Createtable選課(學(xué)生號char(7),課程號char(10)notnullunique,成績intcheck(成績>=0and成績<=100),Primarykey(學(xué)生號,課程號),F(xiàn)oreignkey(學(xué)生號)references學(xué)生(學(xué)生號),F(xiàn)oreignkey(課程號)references課程(課程號),)ALTERTABLE[<數(shù)據(jù)庫名>.<所有者名>.]<基本表名>{ADD<列定義>,…|ADD<表級完整性約束>,…|DROPCOLUMN<列名>,…|DROP〈約束名〉,…}語句功能:向已定義過的表中添加一些列的定義或一些表級完整性約束,或者從已定義過的表中刪除一些列或一些完整性約束。語句說明:P77。4.2.2修改表結(jié)構(gòu)語句舉例:p77Altertable學(xué)生add籍貫char(6)Altertable學(xué)生dropcolumn籍貫DROPTABLE[<數(shù)據(jù)庫名>.<所有者名>.]<基本表名>語句功能:先刪除掉與之關(guān)聯(lián)的所有子表,或者刪除掉所有相應(yīng)的外碼約束。語句舉例:P78。Droptable學(xué)生14.2.3刪除表結(jié)構(gòu)4.3表內(nèi)容的插入、修改和刪除當(dāng)建立好一個表結(jié)構(gòu)后,它只是一個空表,接著需要向它插入數(shù)據(jù),即添加每個元組,然后還可以修改和刪除等操作。單行插入INSERT[INTO][<數(shù)據(jù)庫名>.<所有者名>.]<基本表名>(<列名>,…)VALUES(<列值>,…)多行插入INSERT[INTO][<數(shù)據(jù)庫名>.<所有者名>.]<基本表名>(<列名>,…)<SELECT子句>)語句功能:向表中所指定的若干列插入一行或多行數(shù)據(jù)。語句說明:P79。4.3.1插入記錄語句舉例:p79Createtable職工(職工號char(6)primarykey,姓名char(8)notnull,性別char(2)notnull,年齡int,基本工資float)Insertinto職工(職工號,姓名,性別,年齡,基本工資)values(‘010105’,’李羽‘,’女‘,28,1560)Insertinto職工(職工號,姓名,性別,年齡,基本工資)select職工號,姓名,性別,年齡,基本工資from職工1where性別=‘男’4.3.2修改記錄UPDATE[<數(shù)據(jù)庫名>.<所有者名>.]<目的表名>SET<列名>=表達式,…[FROM<源表名>,…][WHERE<邏輯表達式>]語句功能:按條件修改一個表中一些值。語句說明:P80。語句舉例:Update職工set年齡=年齡+1語句舉例:Update職工set基本工資=職工1.基本工資+職工1.職務(wù)津貼from職工1where職工.職工號=職工1.職工號Update職工set基本工資=基本工資*1.2where職工號=‘010405’4.3.3刪除記錄DELETE[FROM][<數(shù)據(jù)庫名>.<所有者名>.]<目的表名>[FROM<源表名>,…][WHERE<邏輯表達式>]語句功能:刪除一個表中中滿足條件的所有行。語句說明:P81。語句舉例:Deletefrom職工where年齡>45語句舉例:delete職工form職工1where職工.職工號=職工1.職工號delete職工第4章結(jié)構(gòu)化查詢語言--SQL4.4視圖的建立、修改和刪除視圖與基本表視圖可以在任何一個或多個表上建立,這些表包括基本表和稱作邏輯表的視圖在內(nèi)。視圖的建立和刪除只影響視圖本身,不影響對應(yīng)的基本表,而對視圖內(nèi)容的更新(插入、刪除和修改)直接影響基本表,即直接更新基本表中的數(shù)據(jù)。當(dāng)視圖來自多個基本表時,通常只允許對視圖做適當(dāng)?shù)男薷模辉试S做插入和刪除數(shù)據(jù)的操作。對視圖做的較多的是查詢。4.4.1建立視圖語句格式:CREATEVIEW<視圖名>(<列名>,…)AS<SELECT子句>語句功能:在當(dāng)前數(shù)據(jù)庫中根據(jù)SELECT子句的查詢結(jié)果建立一個視圖,包括視圖的結(jié)構(gòu)和內(nèi)容。語句說明:P82語句舉例:P83假定在教學(xué)庫中建立的學(xué)生、課程、選課三個基本表如表4-1、4-2、4-3。若教學(xué)庫為當(dāng)前庫,則執(zhí)行下列語句:createview成績視圖表(學(xué)生號,姓名,課程號,課程名,成績)asselect選課.學(xué)生號,姓名,選課.課程號,課程名,成績from學(xué)生,課程,選課where學(xué)生.學(xué)生號=選課.學(xué)生號and課程.課程號=選課.課程號and專業(yè)=‘電子’由此可見,用戶可以根據(jù)實際需要在基本表之上對存在的列進行任意組合得到相應(yīng)結(jié)構(gòu)的新表,它是基本表的一種視圖,即映象或虛表。這樣既能滿足數(shù)據(jù)庫的結(jié)構(gòu)化(達到一定的范式)要求,又能滿足用戶對數(shù)據(jù)表的實際需要。視圖成為用戶與數(shù)據(jù)庫打交道的良好的操作界面。數(shù)據(jù)庫規(guī)范化是把關(guān)系逐步分解的過程,而視圖又是把分解的關(guān)系按需要連接起來的過程。使用視圖還能夠增強數(shù)據(jù)庫的安全性,可以從相關(guān)基本表中選擇滿足一定條件的行和列建立視圖,把這個視圖授權(quán)給相關(guān)用戶訪問,而基本表中的其他數(shù)據(jù)他無權(quán)訪問。使用視圖還能夠根據(jù)用戶的局部應(yīng)用、根據(jù)用戶的習(xí)慣命名視圖中的列名。如學(xué)生號改為學(xué)號,課程號改為課號等。在設(shè)計基本表時,考慮到關(guān)系的規(guī)范化要求,不能把通過計算得到的屬性作為關(guān)系的屬性,因為那將產(chǎn)生傳遞依賴。如平均成績、總成績、合計、年齡、工齡等屬性。例:CreateviewresultView(學(xué)號,姓名,性別,語文,數(shù)學(xué),英語,物理,生物,化學(xué),平均成績,總成績)asselect學(xué)號,姓名,性別,語文,數(shù)學(xué),英語,物理,生物,化學(xué),(語文+數(shù)學(xué)+英語+物理+生物+化學(xué))/6,語文+數(shù)學(xué)+英語+物理+生物+化學(xué)fromresult4.4.2修改視圖內(nèi)容通常需要對視圖進行修改,當(dāng)然一般是修改由基本表中非主屬性所對應(yīng)的列,若要修改主屬性所對應(yīng)的列,最好到各自的基本表中去修改,以便更好地滿足關(guān)系的規(guī)范化和完整性的要求。語句格式:UPDATE[<數(shù)據(jù)庫名>.<所有者名>.]<視圖名>SET<列名>=<表達式>,…[FROM<源表名>,…][WHERE<邏輯表達式>]語句功能:按照一定條件對當(dāng)前或指定數(shù)據(jù)庫中的一些列值進行修改。語句說明:P84(等同習(xí)慣基本表內(nèi)容的語句)語句舉例:P85UPDATE[<數(shù)據(jù)庫名>.<所有者名>.]<視圖名>SET<列名>=<表達式>,…[FROM<源表名>,…][WHERE<邏輯表達式>]UPDATE成績視圖表SET成績=80WHERE學(xué)生號=‘0102005’and課程號=‘E002’此修改直接反映到基本表中,即把對應(yīng)的選課關(guān)系中該元組的成績修改為80,當(dāng)然也就自然反映到存儲文件中。4.4.3修改視圖定義語句格式:ALTERVIEW<視圖名>(<列名>,…)AS<SELECT子句>語句功能:在當(dāng)前數(shù)據(jù)庫中修改已知視圖的列,它與SELECT子句的查詢結(jié)果相對應(yīng)。語句說明:P85語句舉例:P85Createview學(xué)生視圖(學(xué)生號,姓名)asselect學(xué)生號,姓名from學(xué)生Alterview學(xué)生視圖(學(xué)生號,專業(yè))asselect學(xué)生號,專業(yè)from學(xué)生4.4.4刪除視圖語句格式:DROPVIEW<視圖名>語句功能:刪除當(dāng)前數(shù)據(jù)庫中的一個視圖。語句舉例:P85Dropview成績視圖表第4章結(jié)構(gòu)化查詢語言--SQL4.5SQL查詢SQL集數(shù)據(jù)定義、數(shù)據(jù)更新、數(shù)據(jù)控制、數(shù)據(jù)查詢等功能為一體。SQL查詢對應(yīng)SELECT語句。4.5.1SELECT語句格式:SELECT[ALL|DISTINCT]{<表達式1>[[AS]<列名1>][,<表達式2>[[AS]<列名2>]…|*|<表別名>.*}[INTO<基本表名>]FROM<表名1>[[AS]<表別名1>][,<表名2>[[AS]<表別名2>]…][WHERE<邏輯表達式1>][GROUPBY<分組列名1>[,<分組列名2>…][HAVING<邏輯表達式2>][ORDERBY<排序列名1>[ASC|DESC][,<排序列名2>[ASC|DESC]…]]語句功能:根據(jù)一個或多個表按條件進行查詢,產(chǎn)生出一個新表,該表被顯示出來或者被命名保存起來。在查詢語句中,包含了關(guān)系運算:選擇、投影、連接、笛卡兒積、并。SELECT…實現(xiàn)投影運算FROM…實現(xiàn)連接運算[WHERE…]實現(xiàn)選擇運算省略連接條件實現(xiàn)笛卡兒積運算在兩個查詢語句之間使用UNION關(guān)鍵字實現(xiàn)并運算4.5.2SELECT選項:在該選項中,ALL/DISTINC為任選項。語句舉例:P87首先創(chuàng)建兩個基本表Createdatabase商品庫Use商品庫Createtable商品表1(商品代號…)Createtable商品表2(商品代號…)另一個數(shù)據(jù)庫為教學(xué)庫,包含學(xué)生、課程、選課三個基本表。注意:使用時,要把它設(shè)為當(dāng)前庫。例4-1從商品庫的商品表1中查詢出每種商品的分類名。SELECT分類名FROM商品表1或SELECTALL分類名FROM商品表1查詢結(jié)果為:分類名電冰箱電視機電視機電視機空調(diào)器微波爐洗衣機洗衣機例4-2從商品庫的商品表1中查詢出所有商品的不同分類名。SELECTDISTINCT分類名FROM商品表1查詢結(jié)果為:分類名電冰箱電視機空調(diào)器微波爐洗衣機SELECT[ALL|DISTINCT]{<表達式1>[[AS]<列名1>][,<表達式2>[[AS]<列名2>]…|*|<表別名>.*}…表達式1,表達式2為計算目的表中相應(yīng)列值??梢酝ㄟ^AS選項定義對應(yīng)的列名?!?”表明所有的字段。例4-3從商品庫的商品表1中查詢出分類名為“電視機”的所有商品。SELECT*;FROM商品表1;Where分類名=“電視機”查詢結(jié)果為:商品代號分類名單價數(shù)量DJS-120電視機1865.015DJS-180電視機2073.010DJS-340電視機3726.05例4-4從商品庫的商品表1中查詢出單價低于2000元的每一種商品的商品代號、分類名和單價。SELECT商品代號,分類名,單價FROM商品表1where單價<2000查詢結(jié)果為:商品代號分類名單價DBX-134電冰箱1456.0DSJ-120電視機1865.0WBL-6微波爐640.0XYJ-13洗衣機468.0XYJ-20洗衣機873.0例4-5從商品庫的商品表1中查詢出每一種商品的價值。SELECT商品代號,單價*數(shù)量as價值FROM商品表1查詢結(jié)果為:商品代號價值DBX-13411648.0DSJ-12027975.0DJS-18020730.0DSJ-34018630.0KTQ-1233600.0WBL-66400.0XYJ-139360.0XYJ-2010476.0例4-6從商品庫的商品表1和商品表2中查詢出按商品代號進行自然連接的結(jié)果。SELECT商品表1.*,產(chǎn)地,品牌FROM商品表1,商品表2Where商品表1.商品代號=商品表2.商品代號查詢結(jié)果為:P91商品代號分類名單價數(shù)量產(chǎn)地品牌DBX-134電冰箱1456.08北京雪花DSJ-120電視機1865.015南京熊貓…在SELECT語句中,使用的列函數(shù)有:COUNT([ALL|DISTINCT]<列名>|*)MAX(<列名>)求出對應(yīng)的列的最大值MIN(<列名>)(數(shù)值、字符、日期)AVG(<列名>)SUM(<列名>)例4-7從商品庫的商品表1中查詢出不同分類名的個數(shù)。SELECTCOUNT(DISTINCT分類名)AS分類種數(shù)FROM商品表1查詢結(jié)果為:分類種數(shù)5例4-8從商品庫的商品表1中查詢出所有商品的最大數(shù)量、最小數(shù)量、平均數(shù)量及數(shù)量總和。SELECTmax(數(shù)量)as最大數(shù)量,min(數(shù)量)as最小數(shù)量,avg(數(shù)量)as平均數(shù)量,sum(數(shù)量)as總和FROM商品表1查詢結(jié)果為:最大數(shù)量最小數(shù)量平均數(shù)量總和2051192例4-9從商品庫的商品表1中查詢出分類名為“電視機”的商品的種數(shù)、最高價、最低價及平均價。SELECTcount(*)as種數(shù),max(單價)as最高價,min(單價)as最低價,avg(單價)as平均價FROM商品表1WHERE分類名=“電視機”查詢結(jié)果為:種數(shù)最高價最低價平均價

33726.01865.02554.6666666666665例4-10從商品庫的商品表1中查詢出所有商品的最高價值、最低價值及總價值。SELECTmax(單價*數(shù)量)as最高價值,min(單價*數(shù)量)as最低價值,sum(單價*數(shù)量)as總價值FROM商品表1查詢結(jié)果為:最高價值最低價值總價值33600.06400.0138819.04.5.3FROM選項:SELECT…FROM<表名1>[[AS]<表別名1>][,<表名2>[[AS]<表別名2>]…][WHERE<邏輯表達式1>]…該選項提供用于查詢的基本表和視圖,并可以為每個基本表起一個別名,此別名只限于該SELECT語句中使用,作為列名的前綴限定符,以區(qū)別于其他源表中的同名列,若沒有一個源表定義別名,則使用表名作為所屬列的前綴限定符(不定義也行)。當(dāng)一個源表的表名較長時,可起一個簡單的別名,以方便在其他選項中使用。若基本表和視圖不在當(dāng)前數(shù)據(jù)庫中,則必須加上數(shù)據(jù)庫名和使用者名作為前綴。例4-11從教學(xué)庫中查詢出每個學(xué)生選修每門課程的學(xué)生號、姓名、課程號、課程名、成績等數(shù)據(jù)。SELECTx.學(xué)生號,x.姓名,y.課程號,y.課程名,z.成績,FROM學(xué)生x,課程y,選課zWherex.學(xué)生號=z.學(xué)生號andy.課程號=z.課程號查詢結(jié)果為:p93例4-11從教學(xué)庫中查詢出每個學(xué)生選修每門課程的學(xué)生號、姓名、課程號、課程名、成績等數(shù)據(jù)。不使用表別名:SELECT學(xué)生.學(xué)生號,姓名,課程.課程號,課程名,選課.成績,FROM學(xué)生,課程,選課Where學(xué)生.學(xué)生號=選課.學(xué)生號and課程.課程號=選課.課程號查詢結(jié)果同為:p93學(xué)生號姓名課程號課程名成績0101001王明C001C++語言78…4.5.4WHERE選項:SELECT…FROM…[WHERE<邏輯表達式>]…該子句的功能是指定源表之間的連接條件和對記錄的篩選條件。在該選項中的<邏輯表達式>既可包含連接條件,也可以包含篩選條件,還可以同時包含著兩種條件(用AND連接成)。當(dāng)系統(tǒng)執(zhí)行SELECT時,若WHERE中的邏輯表達式中的連接或是選擇的運算次序,完全由系統(tǒng)自動進行處理。連接條件中最常用的是等值連接。若在命令的WHERE選項中省略連接條件,則表示將每個源表按笛卡兒積連接。篩選條件的作用是從源表或連接后生成的中間表中選擇出所需要的行。篩選條件的一般比較式的格式:<表達式1><比較符><表達式2>例4-12從商品表1中查詢出單價大于1500,同時數(shù)量大于等于10的商品。SELECT商品代號,單價,數(shù)量FROM商品表1Where單價>1500and數(shù)量>=10查詢結(jié)果為:p94商品代號單價數(shù)量DSJ-1201865.015DSJ-1802073.010KTQ-122800.012例4-13從商品庫中查詢出產(chǎn)地為南京或無錫的所有商品的商品代號、分類名、產(chǎn)地和品牌。SELECTx.商品代號,分類名,產(chǎn)地,品牌FROM商品表1asx,商品表2asyWherex.商品代號=y.商品代號and(產(chǎn)地=‘南京’or產(chǎn)地=‘無錫’)查詢結(jié)果為:p94商品代號分類名產(chǎn)地品牌DSJ-120電視機南京熊貓DSJ-180電視機南京熊貓KTQ-12空調(diào)器無錫春蘭XYJ-13洗衣機無錫小天鵝例4-14從教學(xué)庫中查詢出選修至少兩門課程的學(xué)生學(xué)號。SELECTdistinctc1.學(xué)生號FROM選課c1,選課c2

Wherec1.學(xué)生號=c2.學(xué)生號andc1.課程號<>C2.課程號對同一個表,定義了c1和c2別名,作為兩個不同的表使用。前一個比較式作為連接條件,后一個比較式作為篩選條件學(xué)生號查詢結(jié)果為:p9501010010202003例4-15從教學(xué)庫中查詢出選修了課程名為“操作系統(tǒng)”課程的每個學(xué)生的姓名。SELECT姓名(學(xué)生.姓名)FROM學(xué)生x,課程y,選課z

Wherex.學(xué)生號=z.學(xué)生號andy.課程號=z.課程號and課程名=“操作系統(tǒng)”篩選條件:課程.課程名=“操作系統(tǒng)”。連接條件:x.學(xué)生號=z.學(xué)生號andy.課程號=z.課程號查詢結(jié)果為:p95姓名王明張魯在新版的SQL中,已經(jīng)把查詢連接條件從WHERE選項中轉(zhuǎn)移到FROM選項中。在FROM選項中的語法格式為:(隱含雙重循環(huán))中間連接:FROM<表名1>INNERJION<表名2>ON<表名1>.<連接列名1><比較符><表名2>.<連接列名2>(一般的連接)左連接:FROM<表名1>LEFT[OUTER]JION<表名2>ON<表名1>.<連接列名1><比較符><表名2>.<連接列名2>右連接:FROM<表名1>RIGHT[OUTER]JION<表名2>ON<表名1>.<連接列名1><比較符><表名2>.<連接列名2>P95解釋例4-16從教學(xué)庫中查詢出所有學(xué)生的選課情況,要求沒選修任何課程的學(xué)生信息也反映出來。SELECT*FROM學(xué)生left

join選課on學(xué)生.學(xué)生號=選課.學(xué)生號

查詢結(jié)果為:p96學(xué)生號姓名性別專業(yè)學(xué)生號課程號成績0101001王明男計算機0101001C001780101001王明男計算機0101001C004620102005劉芹女電子0102005E00273…若要查詢出所有課程被學(xué)生選修的情況。SELECT*FROM課程

leftjoin(選課innerjoin學(xué)生on學(xué)生.學(xué)生號=選課.學(xué)生號)on課程.課程號=選課.課程號該語句首先實現(xiàn)選課關(guān)系和學(xué)生關(guān)系的中間連接,產(chǎn)生出中間表,然后作為右表再同課程關(guān)系進行左連接。查詢結(jié)果為:p96課程號課程名課程學(xué)分學(xué)生號課程號成績學(xué)生號姓名性別專業(yè)C001C++語言40101001C001780101001王明男計算機…若要從教學(xué)庫中查詢出所有電子專業(yè)的學(xué)生選課的全部情況。SELECT*FROM課程innerjoin(選課innerjoin學(xué)生on學(xué)生.學(xué)生號=選課.學(xué)生號)on課程.課程號=選課.課程號Where專業(yè)=“電子”它與下面的傳統(tǒng)查詢語句等效。SELECT*FROM課程,選課,學(xué)生Where學(xué)生.學(xué)生號=選課.學(xué)生號and課程.課程號=選課.課程號and專業(yè)=“電子”用于查詢語句中的專門比較式又叫判斷式,它實現(xiàn)單值與集合數(shù)據(jù)之間的比較。常用以下六種格式。1.格式之一<列名><比較符>ALL(<子查詢>)<子查詢>是一條完整的SELECT語句,被嵌套在該比較式中使用。當(dāng)<子查詢>的查詢結(jié)果中的每一個值都滿足所給的比較條件時,此比較式的值才為真,否則為假。1.格式之一<列名><比較符>ALL(<子查詢>)在查詢語句中出現(xiàn)的每個子查詢,同樣可以對一個或多個表進行查詢,并且它還能夠使用在外層查詢上所指定的源表中的列,不過它必須帶有表名前綴,否則將被視為子查詢中所指定源表中的列。在含有子查詢的SELECT語句執(zhí)行時,當(dāng)執(zhí)行到WHERE選項需要用到子查詢結(jié)果時,則該子查詢將被立即執(zhí)行。在一個子查詢的WHERE選項中還可以使用SELECT語句,它是該子查詢的子查詢。也就是說,SELECT命令能夠嵌套使用,嵌套的層次不受限制,通常只需嵌套二至三層就可以滿足應(yīng)用的需要了。例4-17SELECT*FROM商品表1Where單價>all(select單價from商品表1where分類名=‘洗衣機’)該語句從商品表1中查詢出單價比分類名為‘洗衣機’的所有商品的單價都高的商品。執(zhí)行此語句時,每次取一個商品記錄的單價字段的值同子查詢結(jié)果(每次子查詢結(jié)果都相同,即為468和873。P87)進行比較,若它大于查詢結(jié)果中的所有值,則就把該記錄查詢出來。查詢結(jié)果P98。例4-18SELECTx.*,品牌FROM商品表1xinnerjoin商品表2yonx.商品代號=y.商品代號Where數(shù)量<all(select數(shù)量from商品表1where分類名=‘洗衣機’or分類名=‘微波爐’)該語句按商品代號連接商品表1和商品表2,查詢出數(shù)量小于分類名為‘洗衣機’或‘微波爐’的每一個商品數(shù)量的所有元組。查詢結(jié)果P98。2.格式之二<列名><比較符>{ANY|SOME}(<子查詢>)當(dāng)<子查詢>的查詢結(jié)果中的任一個值滿足所給的比較條件時,此比較式的值才為真。例4-19從商品庫中查詢出產(chǎn)地與品牌為“春蘭”的商品的產(chǎn)地相同的所有商品的商品代號、分類名、品牌、產(chǎn)地等屬性的值。SELECTx.商品代號,x.分類名,y.品牌,y.產(chǎn)地FROM商品表1xinnerjoin商品表2yonx.商品代號=y.商品代號Where產(chǎn)地=some(select產(chǎn)地from商品表2where品牌=‘春蘭’)查詢結(jié)果P99。例4-20從教學(xué)庫中查詢出選修了課程名為“C++語言”的所有學(xué)生的姓名和成績。該查詢采用雙重查詢語句處理。在外查詢中需投影出學(xué)生.姓名和選課.成績,所以需要對學(xué)生和選課關(guān)系進行等值連接,該查詢的篩選條件是選課關(guān)系的課程號必須等于“C++語言”課程的課程號,而“C++語言”課程的課程號可以通過對課程關(guān)系的子查詢求出。該查詢語句為:例4-20從教學(xué)庫中查詢出選修了課程名為“C++語言”的所有學(xué)生的姓名和成績。SELECT姓名,成績FROM學(xué)生xinnerjoin選課yonx.學(xué)生號=y.學(xué)生號Where課程號=any(select課程號from課程where課程名=‘C++語言’)查詢結(jié)果P99。例4-21從商品庫中查詢出所有商品中單價最高的商品和單價最低的商品。SELECT*FROM商品表1Where單價=any(selectmax(單價)from商品表1)or單價=any(selectmin(單價)from商品表1)

此查詢只涉及到商品表1,要查詢出單價最高和單價最低的商品,首先必須知道單價最高值和最低值,然后用每種商品的單價同其比較,符合則選擇出來。采用雙重查詢實現(xiàn)。此查詢的篩選條件是一個或邏輯表達式,其中每個比較式都帶有子查詢。查詢結(jié)果P100。例4-21從商品庫中查詢出所有商品中單價最高的商品和單價最低的商品。此查詢也可以寫成:SELECT*FROM商品表1Where單價=any(selectmax(單價)from商品表1)union

單價=any(selectmin(單價)from商品表1)

該查詢中的子查詢是兩個查詢的并。查詢結(jié)果P100。3.格式之三<列名>[NOT]BETWEEN<開始值>AND<結(jié)束值>與下面的邏輯表達式等效:<列名>>=<開始值>AND<列名><=<結(jié)束值>(不選NOT)<列名><<開始值>OR<列名>><結(jié)束值>(選NOT)例4-22從商品表1中查詢出單價在1000到2000元之間的所有商品。SELECT*FROM商品表1Where單價between1000and2000查詢結(jié)果P100。4.格式之四[NOT]EXISTS(<子查詢>)當(dāng)<子查詢>的查詢結(jié)果中至少存在一個元組時,表明查詢結(jié)果非空,此判斷式為真。帶NOT關(guān)鍵字,則相反。表明查詢結(jié)果為空,此判斷式為真。例4-23從教學(xué)庫中查詢出選修至少一門課程的所有學(xué)生。SELECT*FROM學(xué)生Whereexits(select*from選課where選課.學(xué)生號=學(xué)生.學(xué)生號)查詢結(jié)果P100。若要查詢出沒有選修任何課程的學(xué)生,只要在該查詢語句中加入NOT關(guān)鍵字。例4-24從教學(xué)庫中查詢出與姓名為“王明”的學(xué)生選課至少有一門相同的所有學(xué)生。SELECT*FROM學(xué)生xWherex.姓名<>“王明”andexits(selecty.課程號from選課ywherey.學(xué)生號=x.學(xué)生號andy.課程號=any(selectw.課程號from學(xué)生z,選課wwherez.學(xué)生號=w.學(xué)生號andz.姓名=‘王明’))查詢結(jié)果P100。若在該查詢語句中加入NOT關(guān)鍵字,則查詢出與王明同學(xué)的選課完全不同的所有學(xué)生。此查詢也可通過如下語句實現(xiàn)。SELECT*FROM學(xué)生xWherex.姓名<>‘王明’andx.學(xué)生號=any(selecty.學(xué)生號from選課y,選課zwherey.課程號=z.課程號andz.學(xué)生號=any(selectw.學(xué)生號from學(xué)生wwherew.姓名=‘王明’))例4-25從教學(xué)庫中查詢出選修了課程表中所有課程的學(xué)生。SELECT*FROM學(xué)生Wherenotexits(select*from課程wherenotexits(select*from選課where學(xué)生.學(xué)生號=選課.學(xué)生號and課程.課程號=選課.課程號))查詢結(jié)果P102。5.格式之五<列名>[NOT]IN{(<常量表>)|(<子查詢>)}當(dāng)<列名>所指定列的當(dāng)前值包含在由<常量表>所給定的值之內(nèi)時,則此判斷式為真,否則為假。若在IN關(guān)鍵字后面不是使用<常量表>,而是使用<子查詢>,則當(dāng)由<列名>所指定列的當(dāng)前值包含在子查詢結(jié)果之中時,判斷式為真,否則為假。若選用了NOT關(guān)鍵字,則判斷結(jié)果正好相反。該格式若為“<列名>IN(<子查詢>)”,則與“<列名>=any(<子查詢>)”格式等價。例4-26從學(xué)生表中查詢出專業(yè)為計算機、電氣、通信的所有學(xué)生。SELECT*FROM學(xué)生Where專業(yè)in(‘計算機’,‘電氣’,‘通信’)查詢結(jié)果P102。例4-27從教學(xué)庫中查詢出選修了課程名為“操作系統(tǒng)”的所有學(xué)生。SELECT*FROM學(xué)生Where學(xué)生號in(select學(xué)生號from選課,課程where選課.課程號=課程.課程號and課程名=‘操作系統(tǒng)’)查詢結(jié)果P103。6.格式之六<字符型列名>[NOT]LIKE<字符表達式>當(dāng)<字符型列名>的當(dāng)前值與<字符型表達式>的值相匹配時,此判斷式為真。帶NOT關(guān)鍵字,則相反。通常所使用的<字符型表達式>為字符常量,若在其中使用下劃線(—)則表示能和任何一個字符匹配,若使用百分號(%)則表示能和任意多個(含零個)任意字符相匹配。例4-28從商品表1中查詢出商品代號以字符串“dsj”開頭”的所有商品。SELECT*FROM商品表1Where商品代號like‘dsj%’查詢結(jié)果P103。SELECT*FROM商品表1Where商品代號like‘dsj_1%’4.5.5GROUPBY選項該選項中的<分組列名1><分組列名2>等必須是出現(xiàn)在SELECT選項中的被投影的表達式所指定的列名。語句執(zhí)行時將按該選項中給定的分組列(通常只有一個)對連接和選擇后得到的所有元組進行分組,使得分組列值相同的元組為一組,形成結(jié)果表中的一個元組。當(dāng)選項中含有多個分組列時,則首先按第一個列值進行分組,若第一個列值相同,再按第二個列值進行分組。通常在SELECT選項中使用列函數(shù)對列值相同的每一組進行有關(guān)統(tǒng)計。例4-29從學(xué)生表中查詢出每個專業(yè)的學(xué)生數(shù)。SELECT專業(yè)as專業(yè)名,count(專業(yè))學(xué)生數(shù)FROM學(xué)生Groupby專業(yè)該語句首先按學(xué)生專業(yè)屬性的值進行分組,然后對每個分組選擇并投影出一個元組,該元組包含專業(yè)值和該專業(yè)值的個數(shù)。查詢結(jié)果P103。例4-30從教學(xué)庫中查詢出每個學(xué)生的學(xué)生號、姓名及所選課程的門數(shù)。SELECTx.學(xué)生號,y.姓名,count(x.學(xué)生號)選課門數(shù)FROM選課x,學(xué)生yWherex.學(xué)生號=y.學(xué)生號Groupbyx.學(xué)生號,y.姓名查詢結(jié)果P104。學(xué)生號姓名選課門數(shù)例4-31從商品表1中查詢出每一類(即分類名相同)商品的最高價、最低價和平均價。SELECT分類名,max(單價)as最高價,min(單價)as最低價,avg(單價)as平均價FROM商品表1Groupby分類名查詢結(jié)果P105。分類名最高價最低價平均價4.5.6HAVING選項該選項中的<邏輯表達式>是一個篩選條件。該選項通常跟在GROUPBY子句后面用來從分組統(tǒng)計中篩選出部分統(tǒng)計結(jié)果,因此該選項中的邏輯表達式通常帶有字段函數(shù)。例4-32從學(xué)生表中查詢出專業(yè)的學(xué)生數(shù)多于1人的專業(yè)名及人數(shù)。SELECT

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論