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

下載本文檔

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

文檔簡介

第4章SQL結(jié)構(gòu)化查詢語言4.1SQL簡介SQL是在20世紀(jì)70年代末由IBM公司開發(fā)出來的一套程序語言,并被用在DB2關(guān)系數(shù)據(jù)庫系統(tǒng)中。但是,直到1981年,IBM推出商用的SQL/DS關(guān)系型數(shù)據(jù)庫系統(tǒng);Oracle及其他大型關(guān)系型數(shù)據(jù)庫系統(tǒng)相繼出現(xiàn),SQL才得以廣泛應(yīng)用。例如,Sybase與Microsoft公司使用T(transact)-SQL,而Oracle公司使用PL/SQL。4.1SQL簡介SQL的發(fā)展1974年提出,在SYSTEMR上實(shí)現(xiàn)。1986年10月,ANSI定為關(guān)系數(shù)據(jù)庫語言的美國標(biāo)準(zhǔn),并公布了標(biāo)準(zhǔn)SQL。1992年通過的修改標(biāo)準(zhǔn)SQL---92(簡稱SQL2)。1999年---SQL99標(biāo)準(zhǔn)。2003年---SQL2003標(biāo)準(zhǔn)。4.1SQL簡介SQL(StructuredQueryLanguage)稱為結(jié)構(gòu)化查詢語言,它集數(shù)據(jù)定義語言DDL、數(shù)據(jù)操縱語言DML、數(shù)據(jù)控制語言DCL于一體。SQL已成為關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)查詢語言。4.1SQL簡介SQL語言是應(yīng)用于數(shù)據(jù)庫的語言,本身是不能獨(dú)立存在的。它是一種非過程性(non-procedural)語言,與一般的高級(jí)語言(如C、JAVA)不同。一般的高級(jí)語言在存取數(shù)據(jù)庫時(shí),需要依照每一行程序的順序處理許多的動(dòng)作。但是使用SQL時(shí),只需告訴數(shù)據(jù)庫需要什么數(shù)據(jù),怎么顯示就可以了。具體的內(nèi)部操作則由數(shù)據(jù)庫系統(tǒng)來完成。4.1SQL簡介SQL的分類DDL(數(shù)據(jù)定義語言):用于定義數(shù)據(jù)庫對(duì)象(數(shù)據(jù)庫、表、視圖、索引)。如create,drop,alter;DML(數(shù)據(jù)操縱語言):用于對(duì)表或視圖進(jìn)行添加、刪除和修改等操作,如insert,update,delete。DQL(數(shù)據(jù)查詢語言):用于從數(shù)據(jù)庫中檢索數(shù)據(jù)。如select。DCL(數(shù)據(jù)控制語言):用于控制用戶對(duì)數(shù)據(jù)庫的存取能力。如grant,deny,revoke。4.1SQL簡介SQL語言的主要特點(diǎn)是:SQL語言是一種一體化的語言,提供了完整的數(shù)據(jù)定義和操縱功能。SQL語言具有完備的查詢功能。SQL語言非常簡潔,易學(xué)易用。SQL語言是一種高度非過程化的語言。SQL語言的執(zhí)行方式多樣。SQL語言不僅能對(duì)數(shù)據(jù)表進(jìn)行各種操作,也可對(duì)視圖進(jìn)行操作。4.2Select語句查詢是SQL的核心。用于表達(dá)查詢的SELECT語句是功能最強(qiáng)也是最復(fù)雜的SQL語句。它可以實(shí)現(xiàn)各種查詢,還能進(jìn)行統(tǒng)計(jì)、結(jié)果排序等。4.2.1SELECT語句格式SELECT[謂詞][表別名.]SELECT表達(dá)式[AS列別名][,[[表別名.]SELECT表達(dá)式[AS列別名]…][INTO新表名][IN庫名]FROM表名[AS表別名][[INNER|LEFT|RIGHT|JOIN{{<表名>][AS表別名][ON聯(lián)接條件]]…][IN庫名][WHERE邏輯表達(dá)式][GROUPBY分組字段列表][HAVING過濾條件][UNION[ALL]SELECT語句][ORDERBY排序字段[ASC|DESC][,排序字段[ASC|DESC]...]]4.2.1SELECT語句格式SELECT語句的完整格式中包括6個(gè)子句。SELECT和FROM子句是必須的,其它子句任選。SELECT子句列出所有要求SELECT語句檢索的數(shù)據(jù)項(xiàng)。這些項(xiàng)可以取自數(shù)據(jù)庫中的字段,也可以是SQL在執(zhí)行查詢時(shí)計(jì)算出的列。FROM子句列出包含所要查詢數(shù)據(jù)的表。WHERE子句告訴SQL只查詢某些行中的數(shù)據(jù),這些行用邏輯表達(dá)式描述。GROUPBY子句將結(jié)果按<分組字段列表>的值進(jìn)行分組,該值相等的記錄為一個(gè)組。4.2.1SELECT語句格式HAVING子句告訴SQL只產(chǎn)生由GROUPBY得到的某些組的結(jié)果。ORDERBY子句將查詢結(jié)果按一列或多列中的數(shù)據(jù)排序。4.2.1簡單查詢1、SELECT子句用于指定在查詢結(jié)果中包含的字段、常量和表達(dá)式。①[表別名]:在FROM子句中給表取別名,主要用于當(dāng)不同的表中存在同名字段時(shí)區(qū)別數(shù)據(jù)來源表。②SELECT表達(dá)式:是用戶要查詢的內(nèi)容。如果多個(gè)字段用逗號(hào)分割。內(nèi)容可以是字段名,也可以是函數(shù)(系統(tǒng)及自定義函數(shù)),還可以是*,表示輸出表中的所有字段。

4.2.1簡單查詢③[謂詞]:指定查詢選擇的記錄,可取ALL、DISTINCT、DISTINCTROW、TOPn[PERCENT]謂詞說明

例子SELECTALL學(xué)號(hào)FROMALL顯示查詢結(jié)果中全部數(shù)據(jù)學(xué)生選課忽略在選定字段中包含重復(fù)數(shù)SELECTDISTINCT學(xué)號(hào)DISTINCT據(jù)的記錄。FROM學(xué)生選課忽略整個(gè)重復(fù)記錄的數(shù)據(jù),而SELECTDISTINCTROW學(xué)DISTINCTROW不僅僅是重復(fù)的字段。號(hào)FROM學(xué)生選課TOPn [PERCENT]返回在一定范圍內(nèi)的一定數(shù)量 的記錄。SELECTTOP5學(xué)號(hào)FROM

學(xué)生選課4.2.1簡單查詢1、SELECT子句例如:select學(xué)號(hào),姓名,性別from學(xué)生select*from課程select學(xué)生.學(xué)號(hào),學(xué)生.姓名,專業(yè).專業(yè)名稱FROM學(xué)生,專業(yè)where學(xué)生.專業(yè)編號(hào)=專業(yè).專業(yè)編號(hào)select學(xué)號(hào),姓名,性別,year(出生日期)as出生年份from學(xué)生4.2.1簡單查詢2、FROM子句用于指定在查詢的表名,并給出表別名。①[表名][AS表別名]:為表指定一個(gè)臨時(shí)別名。若指定了別名,則整個(gè)SELECT語句中必須使用這個(gè)別名代替表名。②INNERJOIN:規(guī)定內(nèi)連接。只有在被連接的表中有匹配的記錄才會(huì)出現(xiàn)在查詢結(jié)果中。4.2.1簡單查詢③LEFTJOIN:規(guī)定左外連接。JOIN左側(cè)表中的所有記錄及JOIN右側(cè)表中匹配的記錄才會(huì)出現(xiàn)在查詢結(jié)果中。④RIGHTJOIN:規(guī)定右外連接。JOIN右側(cè)表中的所有記錄及JOIN左側(cè)表中匹配的記錄才會(huì)出現(xiàn)在查詢結(jié)果中。⑤[ON連接條件]:指定連接條件。⑥[IN庫名]:指定表所在的庫。省略表示當(dāng)前庫。!SQL查詢的結(jié)果總是一個(gè)數(shù)據(jù)表。4.2.1簡單查詢例如:SELECT學(xué)生.姓名,學(xué)生.性別,專業(yè).專業(yè)名稱FROM專業(yè)INNERJOIN學(xué)生ON專業(yè).專業(yè)編號(hào)=學(xué)生.專業(yè)編號(hào);SELECT學(xué)生.姓名,學(xué)生.性別,學(xué)生.專業(yè)編號(hào)FROM學(xué)生INNERJOIN學(xué)生選課ON學(xué)生.[學(xué)號(hào)]=學(xué)生選課.[學(xué)號(hào)];SELECT學(xué)生.姓名,學(xué)生.性別,學(xué)生.專業(yè)編號(hào)FROM學(xué)生LEFTJOIN學(xué)生選課ON學(xué)生.[學(xué)號(hào)]=學(xué)生選課.[學(xué)號(hào)]WHERE(((學(xué)生選課.學(xué)號(hào))IsNull));4.2.1簡單查詢3.單表查詢最簡單的查詢是從單表中請(qǐng)求得到數(shù)據(jù)列的值(1)選擇需要的列SELECT*FROM學(xué)生SELECT姓名,出生日期,性別FROM學(xué)生SELECTALL*FROM學(xué)生選課4.2.1簡單查詢(2)列計(jì)算SELECT學(xué)號(hào),平時(shí)成績*0.3+考試成績*0.7as學(xué)期成績FROM學(xué)生選課4.2.1簡單查詢(3)重復(fù)行在“學(xué)生選課”表中列出所有選課的學(xué)生學(xué)號(hào)。

SELECTDISTINCT學(xué)號(hào)FROM學(xué)生選課!“學(xué)生選課”表中存儲(chǔ)著選課學(xué)生的學(xué)號(hào),有些學(xué)生同時(shí)選了幾門課,如果直接用SELECT選取就會(huì)出現(xiàn)重復(fù)記錄。因此,加DISTINCT可去掉重復(fù)行。4.2.1簡單查詢4.WHERE子句指定查詢條件。只將滿足邏輯表達(dá)式的數(shù)據(jù)作為查詢結(jié)果。如果不加WHERE子句,則所有數(shù)據(jù)都作為查詢結(jié)果。4.2.1簡單查詢(1)邏輯表達(dá)式邏輯表達(dá)式一般包括連接條件和過濾條件。(1)連接條件用于當(dāng)從多個(gè)表中進(jìn)行數(shù)據(jù)查詢時(shí),指定表和表之間的連接字段,也可以在FROM的ON子句中指定連接條件。格式為:別名1.字段表達(dá)式1=別名2.字段表達(dá)式24.2.1簡單查詢(2)過濾條件用于對(duì)數(shù)據(jù)進(jìn)行篩選時(shí)指定篩選條件。格式為:別名.字段表達(dá)式=值4.2.1簡單查詢

查詢條件關(guān)系條件復(fù)合條件確定范圍

所用符號(hào)或關(guān)鍵字=,>,>=,<,<=,=,<>NOT,AND,ORBETWEEN…AND(或NOTBETWEEN… AND)包含子項(xiàng)IN(或NOTIN)字符匹配字符串表達(dá)式[NOT]LIKE<模式>4.2.1簡單查詢(2)有條件查詢(1)列出2009級(jí)學(xué)生的學(xué)號(hào)、姓名等信息。SELECT學(xué)號(hào),姓名,入學(xué)成績FROM學(xué)生whereleft(學(xué)號(hào),4)="2009“(2)查詢2009年9月1日入學(xué)且入學(xué)成績不低于600分的學(xué)生信息。SELECT*FROM學(xué)生where入學(xué)時(shí)間=#2009-9-1#AND入學(xué)成績>=60020004.2.1簡單查詢?nèi)绻竽沉械臄?shù)據(jù)在某個(gè)區(qū)間內(nèi),可以

使用該運(yùn)算符(3)列出工資在1000—2000之間的教師信息。

SELECT*FROM教師where工資BETWEEN 1000AND2000

SELECT*FROM教師where工資NOT BETWEEN1000AND等價(jià)于:

SELECT*FROM教師

注意:WHERE工資>=1000AND工

資<=2000

BETWEEN包括邊界值,而NOTBETWEEN

不包括邊界值4.2.1簡單查詢當(dāng)要求表的列值是某幾個(gè)值中的一個(gè)時(shí)用

IN運(yùn)算符(4)列出選修了課程號(hào)為“01”和“53”的學(xué)生的學(xué)號(hào)和成績。

SELECT學(xué)號(hào),成績FROM學(xué)生選課WHERE

課程編號(hào)IN("01","53")

SELECT學(xué)號(hào),成績FROM學(xué)生選課WHERE

課程編號(hào)NOTIN("01","53")

等價(jià)于:

SELECT學(xué)號(hào),成績FROM學(xué)生選 課WHERE課程編號(hào)="01"OR課 程編號(hào)="53"ISNULL的功能是4.2.1簡單查詢(5)查找考試成績?yōu)榭盏膶W(xué)生的學(xué)號(hào)和課程號(hào)。

SELECT學(xué)號(hào),課程編號(hào)FROM學(xué)生選課WHERE

考試成績ISNULL!注意WHERE不要寫成“WHERE成績=NULL”測(cè)試屬性值是否為空值。SELECT學(xué)號(hào),課程編號(hào)FROM學(xué)生選課WHERE考試成績ISNOTNULLSELECT學(xué)號(hào),課程編號(hào)FROM學(xué)生選課WHERENOT考試成績ISNULL4.2.1簡單查詢(6)在“教師”表中列出非計(jì)算機(jī)系的教師信息。SELECT*FROM教師WHERE所屬系<>"計(jì)算機(jī)“或SELECT*FROM教師WHERE所屬系!=“計(jì)算機(jī)“(在SQLSERVER中)或SELECT*FROM教師WHERENOT(所屬系="計(jì)算機(jī)")*%?#[]

4.2.1簡單查詢(7)LIKE中可使用的通配符通配符

含義匹配零個(gè)或多個(gè)字符例子任意類型和長度的字符串匹配任何一個(gè)字符‘李%’姓李的_(下劃線)任何單個(gè)字符‘_文%’第2個(gè)字為文匹配一個(gè)數(shù)字描述可匹配的字符范圍4.2.1簡單查詢從學(xué)生表中查找姓名中第2個(gè)字是“天”的學(xué)生:SELECT*FROM學(xué)生WHERE姓名LIKE‘?天*'從“學(xué)生”表中查找姓“劉”的學(xué)生:SELECT*FROM學(xué)生WHERE(姓名LIKE'劉*')SELECT*FROM學(xué)生WHERE(姓名LIKE'劉%')4.2.1簡單查詢5.ORDER子句指定查詢結(jié)果排列順序,一般放在SQL語句的最后。其中:排序字段:設(shè)置排序的字段或表達(dá)式。ASC:按表達(dá)式升序排列。(默認(rèn))DESC:按表達(dá)式降序排列。4.2.1簡單查詢根據(jù)“學(xué)生”表查詢所有入學(xué)成績大于500分的女生的姓名、性別、專業(yè)和入學(xué)成績,并按入學(xué)成績升序排列記錄。SELECT學(xué)號(hào),性別,專業(yè),入學(xué)成績FROM學(xué)生WHERE性別="女"AND入學(xué)成績>500ORDERBY入學(xué)成績ASCASC是用來指明顯示結(jié)果的順序,在此處可以不加。4.2.1簡單查詢列出學(xué)生表前3個(gè)學(xué)生的全部信息SELECTTOP3*FROM學(xué)生ORDERBY學(xué)號(hào)注意:TOP是指邏輯頭,若存在排序,則是排序后的TOP4.2.1簡單查詢6.GROUP子句對(duì)查詢結(jié)果進(jìn)行分組統(tǒng)計(jì),統(tǒng)計(jì)選項(xiàng)必須是數(shù)值型的數(shù)據(jù)。其中:分組字段列表:列表中的字段名稱的順序決定了分組的先后順序??梢院虶ROUPBY一起使用的統(tǒng)計(jì)函數(shù)有:sum、avg、max、min、first、last等。4.2.1簡單查詢根據(jù)學(xué)生選課表查詢輸出已選了課的學(xué)生的信息SELECT學(xué)號(hào),avg(考試成績)FROM學(xué)生選課GROUPBY學(xué)號(hào)ORDERBY學(xué)號(hào)4.2.1簡單查詢7.HAVING子句根據(jù)HAVING指出的條件,GROUPBY選取滿足該條件的組輸出。給出所有超過5個(gè)學(xué)生所選修課程的學(xué)生數(shù)。

SELECT課程編號(hào),COUNT(學(xué)號(hào))FROM學(xué)生選 課GROUPBY課程編號(hào)HAVINGCOUNT(*)>54.2.2多表查詢(連接)在查詢中,如果同時(shí)涉及兩個(gè)或者兩個(gè)以上的表,就稱其為多表查詢。使用多表查詢時(shí)要注意:

在FROM子句中列出參與查詢的表; 如果參與查詢的表存在同名的字段,并且這些字段要參與查 詢,必須在字段前加表名; 必須在FROM子句中用JOIN語句或在WHERE子句中將多個(gè) 表用某些字段或表達(dá)式連接起來。多表查詢的實(shí)現(xiàn)有兩種基本途徑,即連接查詢和嵌套查詢(子查詢)。4.2.2多表查詢(連接)多表查詢中如果需要實(shí)行連接運(yùn)算,就可以采用連接查詢方式。連接查詢中連接條件在WHERE子句中實(shí)現(xiàn)。用來連接兩個(gè)表的條件稱為連接條件或連接謂詞。按照連接謂詞的不同,可以將其分為如下幾種類型:

等值與非等值連接。連接查詢時(shí),如果連接謂詞為比較

運(yùn)算符,則稱之為等值或非等值連接。

自身連接。有時(shí)在查詢中需要對(duì)相同的表進(jìn)行連接,即

同一個(gè)表與其自身進(jìn)行連接,稱其為自身連接。在自身 連接中,為了區(qū)別兩個(gè)相同的表,需對(duì)一個(gè)表使用兩種 表名。

外部連接。字段不在一張表中,其中“學(xué)生學(xué)生選課是這兩張表的連接條件。學(xué)生.學(xué)號(hào)=姓名,成績FROM4.2.2多表查詢(連接)1.等值與非等值連接查詢[<表名1>.]<列名><比較運(yùn)算符>[<表名2>.]<列名>

列出選修了“01”號(hào)課程的學(xué)生姓名及成績。

SELECT姓名,考試成績FROM學(xué)生,學(xué)生選課

WHERE學(xué)生.學(xué)號(hào)=學(xué)生選課.學(xué)號(hào)AND課程編號(hào)="01"

“姓名”和“考試成績”兩個(gè)

引入“別名”,也可如下實(shí)現(xiàn):

SELECT學(xué)生選課.學(xué)號(hào)”學(xué)生S,學(xué)生選課SC WHERES.學(xué)號(hào)=SC.學(xué)號(hào)AND課程編號(hào)="01"4.2.2多表查詢(連接)查詢學(xué)習(xí)課程號(hào)為“11”課程的所有學(xué)生學(xué)號(hào)與姓名。

SELECT學(xué)號(hào),姓名FROM學(xué)生,學(xué)生選課WHERE

學(xué)生.學(xué)號(hào)=學(xué)生選課.學(xué)號(hào)AND課程編號(hào)=“11”4.2.2多表查詢(連接)2.自身連接查詢

SQL不僅可以對(duì)多個(gè)數(shù)據(jù)表實(shí)行連接操作,也可

以將同一數(shù)據(jù)表與其自身進(jìn)行連接,這種連接稱 為自身連接。 列出同時(shí)選修了“01”號(hào)課程和“02”號(hào)課程的學(xué)生學(xué) 號(hào)。

SELECTX.學(xué)號(hào)FROM學(xué)生選課X,學(xué)生選課Y WHEREX.學(xué)號(hào)=Y.學(xué)號(hào)ANDX.課程編號(hào)= "01"ANDY.課程編號(hào)="02"4.2.2多表查詢(連接)查詢至少選修“2009303010001”所選修的一門課程的學(xué)生學(xué)號(hào)。

SELECTX.學(xué)號(hào)FROM學(xué)生選課X,學(xué)生選課Y WHEREX.課程編號(hào)=Y.課程編號(hào)ANDY.學(xué)號(hào)= “2009303010001”4.2.2多表查詢(連接)列出所有選修“01”號(hào)課程的學(xué)生中,成績大于學(xué)號(hào)為“2009303010001”的學(xué)生“01”號(hào)課程考試成績的學(xué)號(hào)和成績。

SELECTX.學(xué)號(hào),X.考試成績FROM學(xué)生選課X,學(xué)生

選課YWHEREX.課程編號(hào)="01"ANDX.課程編

號(hào)=Y.課程編號(hào)ANDY.學(xué)號(hào)

="2009303010001"ANDX.考試成績>Y.考試

成績4.2.2多表查詢(連接)3.外部連接查詢

外部連接查詢也是一種將多表進(jìn)行連接的查詢,其格 式為:

FROM表名1INNER|LEFT|RIGHT|FULL

JOIN表名2ON連接條件 其中:

INNERJOIN等價(jià)于JOIN,為普通連接,亦稱內(nèi)部

連接。

LEFTJOIN為左連接,RIGHTJOIN為右連接,F(xiàn)ULL JOIN為全連接,這幾種連接不太常用。

ON連接條件:用來指定連接條件。由于此子句已經(jīng)給

出連接條件,所以不再在WHERE子句中給出。4.2.2多表查詢(連接)列出“陳誠”同學(xué)所選修的課程編號(hào)和成績。

SELECT課程編號(hào),平時(shí)成績,考試成績FROM學(xué)生

INNERJOIN學(xué)生選課ON學(xué)生.學(xué)號(hào)=學(xué)生選課.

學(xué)號(hào)WHERE學(xué)生.姓名="陳誠"

它等價(jià)于:

SELECT課程編號(hào),平時(shí)成績,考試成績FROM學(xué)生

S,學(xué)生選課SCWHERES.姓名="陳誠"ANDS.

學(xué)號(hào)=SC.學(xué)號(hào)4.2.2多表查詢(連接)根據(jù)“學(xué)生”、“課程”和“學(xué)生選課”表,查詢選修成績不低于85分的學(xué)生的學(xué)號(hào)、姓名、所選課程的課程名、成績,并按考試成績降序排列記錄。

SELECTb.學(xué)號(hào),姓名,課程名稱,考試成績FROM(

課程aINNERJOIN學(xué)生選課bONa.課程編號(hào)=b.

課程編號(hào))INNERJOIN學(xué)生cONb.學(xué)號(hào)=c.學(xué)號(hào)

WHERE考試成績>=85ORDERBY考試成績

DESC4.2.2多表查詢(連接)JOIN可以進(jìn)行多個(gè)表的連接。在連接時(shí),JOIN的順序和ON的順序(相應(yīng)的連接條件)正好相反:

SELECTb.學(xué)號(hào),姓名,課程名稱,考試成績FROM課程

aINNERJOIN(學(xué)生選課bINNERJOIN學(xué)生c ONb.學(xué)號(hào)=c.學(xué)號(hào))ONa.課程編號(hào)=b.課程編號(hào)

WHERE考試成績>=85ORDERBY考試成績desc

注意書寫順序,先為后連接的 表指定連接條件4.2.2多表查詢(連接)查詢所有學(xué)生選課的課程號(hào)和相應(yīng)成績。

SELECT學(xué)生.學(xué)號(hào),姓名,課程編號(hào),考試成績

FROM學(xué)生LEFTJOIN學(xué)生選課ON學(xué)生.學(xué)號(hào)

=學(xué)生選課.學(xué)號(hào)

SELECT學(xué)生選課.學(xué)號(hào),課程.課程編號(hào),考試成績

FROM學(xué)生選課RIGHTJOIN課程ON學(xué)生選 課.課程編號(hào)=課程.課程編號(hào)4.2.3嵌套查詢?cè)谝粋€(gè)SELECT-SQL語句中又出現(xiàn)了另一個(gè)SELECT語句的情形,稱之為SELECT嵌套。對(duì)于嵌套的查詢,通常利用一個(gè)SELECT查詢(內(nèi)層查詢)的結(jié)果來筑構(gòu)另一個(gè)SELECT查詢(外層查詢)的篩選條件。子查詢出現(xiàn)在另一個(gè)SELECT語句的WHERE或HAVING子句中的查詢。在嵌套查詢中,內(nèi)層的SELECT語句稱為子查詢,而把包含有子查詢的SELECT語句稱為雙親語句。用簡單的SELECT語句實(shí)現(xiàn)不了查詢時(shí)用嵌套查詢。4.2.3嵌套查詢1.返回單值的子查詢

返回單值的子查詢:子查詢的結(jié)果只返回一個(gè)值,如:查

詢學(xué)號(hào)為“2009303010001”的同學(xué)的性別,只有一個(gè) 值。 列出選修了編譯原理的所有學(xué)生的學(xué)號(hào)。

SELECT學(xué)號(hào)FROM學(xué)生選課WHERE課程編號(hào)=

(SELECT課程編號(hào)FROM課程WHERE課程名稱="

編譯原理")

!由于編譯原理的“課程編號(hào)”只有一個(gè)(返回結(jié)果不只一 個(gè)時(shí),不能用“=”號(hào))4.2.3嵌套查詢?cè)凇皩W(xué)生”表中查詢與陳靜同鄉(xiāng)的學(xué)生情況。

SELECT*FROM學(xué)生WHERE籍貫=(SELECT

籍貫FROM學(xué)生WHERE姓名=“陳靜”)列出學(xué)生選課中01號(hào)考試課程成績高于該課程平均成績的學(xué)生信息。

SELECT學(xué)號(hào),考試成績FROM學(xué)生選課WHERE課程 編號(hào)="01"AND考試成績>(SELECTINT(AVG(考

試成績))FROM學(xué)生選課WHERE課程編號(hào)="01")

子查詢中,計(jì)算出01號(hào)課程的平均成 績,作為主查詢的比較條件4.2.3嵌套查詢根據(jù)學(xué)生表查詢?nèi)雽W(xué)成績小于600但最接近600的學(xué)生情況,包括姓名、入學(xué)日期和入學(xué)成績。

SELECT姓名,出生日期,入學(xué)成績FROM學(xué)生

WHERE入學(xué)成績=(SELECTMAX(入學(xué)成績) FROM學(xué)生WHERE入學(xué)成績<600)

子查詢從學(xué)生表中取出入學(xué)成績低于

600分的學(xué)生之最高成績4.2.3嵌套查詢找出每個(gè)學(xué)生超過他選修課程平均成績的課程號(hào)。

SELECT學(xué)號(hào),課程編號(hào),考試成績FROM學(xué)生選 課ASAWHERE考試成績>=(SELECTAVG(考

試成績)FROM學(xué)生選課ASBWHEREA.學(xué)號(hào)

=B.學(xué)號(hào))

相關(guān)子查詢4.2.3嵌套查詢?cè)谝粋€(gè)SELECT-SQL語句中又出現(xiàn)了另一個(gè)SELECT語句的情形,稱之為SELECT嵌套。對(duì)于嵌套的查詢,通常利用一個(gè)SELECT查詢(內(nèi)層查詢)的結(jié)果來筑構(gòu)另一個(gè)SELECT查詢(外層查詢)的篩選條件。在嵌套查詢中,內(nèi)層的SELECT語句稱為子查詢,而把包含有子查詢的SELECT語句稱為雙親語句。子查詢出現(xiàn)在另一個(gè)SELECT語句的WHERE或HAVING子句中的查詢。用簡單的SELECT語句實(shí)現(xiàn)不了查詢時(shí)用嵌套查詢。4.2.3嵌套查詢1.返回單值的子查詢

返回單值的子查詢:子查詢的結(jié)果只返回一個(gè)值。4.2.3嵌套查詢2、返回一組值的子查詢

如果某個(gè)子查詢的返回值不止一個(gè),則必須指明在

WHERE子句中應(yīng)怎樣使用這些返回值。通常使用

謂詞ANY、ALL和IN。(1)ANY謂詞的用法

使用ANY謂詞表示查詢結(jié)果中的任意一個(gè)值。4.2.3嵌套查詢求選修01號(hào)課程的學(xué)生中成績比選修了02號(hào)課程的最低成績要高的學(xué)生的學(xué)號(hào)和成績。

SELECT學(xué)號(hào),考試成績FROM學(xué)生選課WHERE課 程編號(hào)="01"AND考試成績>ANY(SELECT MIN(考試成績)FROM學(xué)生選課WHERE課程編號(hào)

="02")4.2.3嵌套查詢(2)ALL謂詞的用法。

使用ALL謂詞表示查詢結(jié)果中的所有值或每一個(gè)值。 在“學(xué)生”表中查詢出生年份最早的學(xué)生情況。

SELECT*FROM學(xué)生

WHEREYEAR(出生日期)<=ALL (SELECTYEAR(出生日期)FROM學(xué)生)

出生年份最早的學(xué)生一定比其他年份出生的學(xué) 生都要小,所以,該查詢首先找出所有學(xué)生的 出生年份,然后在全部記錄中找出生年份小于 等于前面所有年份的記錄。4.2.3嵌套查詢或:

SELECT*FROM學(xué)生WHEREYEAR(出生日

期)=(SELECTMIN(YEAR(出生日期))FROM

學(xué)生)或:

SELECT*FROM學(xué)生WHEREYEAR(出生日期)

IN(SELECTMIN(YEAR(出生日期))FROM學(xué) 生)4.2.3嵌套查詢查詢比計(jì)算機(jī)專業(yè)的學(xué)生年齡都小的學(xué)生姓名和年齡。

SELECT姓名,2011-year(出生日期)FROM學(xué)生

WHERE2011-year(出生日期)<ALL(SELECT 2011-year(出生日期)FROM學(xué)生WHERE專業(yè) 編號(hào)="04")AND專業(yè)編號(hào)<>"04“

或:

SELECT姓名,2011-year(出生日期)FROM學(xué)生

WHERE2011-year(出生日期)<(SELECT MIN(2011-year(出生日期))FROM學(xué)生

WHERE專業(yè)編號(hào)="04")AND專業(yè)編號(hào)<>"04"4.2.3嵌套查詢使用ANY或ALL謂詞時(shí),必須同時(shí)使用比較運(yùn)算符。=<><<=>>=ANY ALLIN --

--NOTIN<MAX<MIN<=MAX<=MIN>MIN>MAX>=MIN>=MAX4.2.3嵌套查詢(3)IN謂詞的用法。

使用IN謂詞表示包含于查詢結(jié)果中。

列出“學(xué)生”表中“計(jì)算機(jī)”專業(yè)未選課的學(xué)生。

SELECT*FROM學(xué)生WHERE專業(yè)編號(hào)="04"

AND學(xué)號(hào)NOTIN(SELECT學(xué)號(hào)FROM學(xué)生 選課)4.2.3嵌套查詢列出學(xué)生表中“計(jì)算機(jī)”專業(yè)選課的學(xué)生。

SELECT*FROM學(xué)生WHERE專業(yè)編號(hào)="04"

AND學(xué)號(hào)IN(SELECT學(xué)號(hào)FROM學(xué)生選課)4.2.3嵌套查詢列出“電子信息”專業(yè)學(xué)生的選課情況。

SELECT*FROM學(xué)生選課WHERE學(xué)號(hào)IN

(SELECT學(xué)號(hào)FROM學(xué)生WHERE專業(yè)編號(hào)

="05")

使用IN運(yùn)算符時(shí),子查詢字段表中 只能指定一個(gè)表達(dá)式4.2.3嵌套查詢查詢與陳誠在同一個(gè)專業(yè)學(xué)習(xí)的學(xué)生。

SELECT學(xué)生.學(xué)號(hào),姓名FROM學(xué)生WHERE專業(yè) 編號(hào)IN(SELECT專業(yè)編號(hào)FROM學(xué)生WHERE

姓名='陳誠')4.2.3嵌套查詢根據(jù)課程和學(xué)生選課表,查詢選修了“大學(xué)英語”的學(xué)生的學(xué)號(hào)、課程名、成績。

SELECTb.學(xué)號(hào),課程名稱,考試成績FROM課程a,

學(xué)生選課b WHEREa.課程編號(hào)=b.課程編號(hào)AND課程名稱IN

(SELECT課程名稱FROM課程

WHERE課程名稱="大學(xué)英語")4.2.3嵌套查詢查詢選修了課程名為“編譯原理”的所有學(xué)生的姓名。

SELECT姓名FROM學(xué)生WHERE學(xué)生.學(xué)號(hào)IN

(SELECT學(xué)生選課.學(xué)號(hào)FROM學(xué)生選課WHERE

課程編號(hào)IN (SELECT課程編號(hào)FROM課程

WHERE課程名稱="編譯原理"))4.2.3嵌套查詢查詢同時(shí)選修了01號(hào)和02號(hào)課程的學(xué)生學(xué)號(hào)。

SELECT學(xué)號(hào)from學(xué)生選課WHERE課程編號(hào)

="01"AND學(xué)號(hào)IN(SELECT學(xué)號(hào)from學(xué)生選課

WHERE課程編號(hào)="02")

交4.2.3嵌套查詢查詢選修了01號(hào)課程而沒有選修02號(hào)課程的學(xué)生學(xué)號(hào)。

SELECT學(xué)號(hào)from學(xué)生選課WHERE課程編號(hào)

="01"AND學(xué)號(hào)NOTIN(SELECT學(xué)號(hào)from學(xué) 生選課WHERE課程編號(hào)="02")

差EXISTS相4.2.3嵌套查詢(4)EXISTS存在量詞的用法。

查詢“選修了課程號(hào)為01的所有學(xué)生的姓名”。

SELECT姓名FROM學(xué)生WHEREEXISTS

(SELECT*FROM學(xué)生選課WHERE學(xué)生.學(xué) 號(hào)=學(xué)生選課.學(xué)號(hào)AND課程編號(hào)="01")

關(guān)子查詢

SELECT姓名FROM學(xué)生,學(xué)生選課

WHERE學(xué)生.學(xué)號(hào)=學(xué)生選課.學(xué)號(hào)AND課連接查詢

程編號(hào)="01"

SELECT姓名FROM學(xué)生WHERE學(xué)號(hào)IN

(SELECT學(xué)號(hào)FROM學(xué)生選課WHERE課程編號(hào)="01")IN嵌套查詢4.2.3嵌套查詢查詢與陳誠在同一個(gè)專業(yè)學(xué)習(xí)的學(xué)生。前面用IN來實(shí)現(xiàn)了,現(xiàn)在采用EXISTS謂詞:

SELECT學(xué)號(hào),姓名,專業(yè)編號(hào)FROM學(xué)生S1 WHEREEXISTS(SELECT*FROM學(xué)生S2 WHERES1.專業(yè)編號(hào)=S2.專業(yè)編號(hào)ANDS2.姓名

="陳誠")4.2.3嵌套查詢查詢同時(shí)選修了01號(hào)和02號(hào)課程的學(xué)生學(xué)號(hào)。前面用IN來實(shí)現(xiàn)了,現(xiàn)在采用EXISTS謂詞:

SELECT學(xué)號(hào)from學(xué)生選課AWHERE課程編號(hào)

="01"ANDEXISTS(SELECT*from學(xué)生選課B WHEREB.課程編號(hào)="02"ANDA.學(xué)號(hào)=B.學(xué)號(hào))4.2.3嵌套查詢查詢選修了01號(hào)課程而沒有選修02號(hào)課程的學(xué)生學(xué)號(hào)。前面用IN來實(shí)現(xiàn)了,現(xiàn)在采用EXISTS謂詞:

SELECT學(xué)號(hào)from學(xué)生選課AWHERE課程編號(hào)

="01"ANDNOTEXISTS(SELECT*from學(xué)生選 課BWHERE課程編號(hào)="02"ANDA.學(xué)號(hào)=B.學(xué)號(hào)

)4.2.3嵌套查詢所有帶IN謂詞、ANY和ALL謂詞的子查詢都能用EXISTS謂詞的子查詢等價(jià)替換。但是一些帶有EXISTS(NOTEXISTS)的子查詢不能夠用其他形式的子查詢等價(jià)替換。4.2.3嵌套查詢查詢至少選修了2009303010001號(hào)學(xué)生所選全部課程的學(xué)號(hào)。分析后得出含義為:不存在這樣的課程,2009303010001號(hào)學(xué)生選了,學(xué)生x沒有選!某個(gè)學(xué)生所選課B 2009303010001號(hào) 學(xué)生所選課程A應(yīng)該滿足:NotExists(A-B)為真4.2.3嵌套查詢

A-B表示:SELECT課程編號(hào)FROM學(xué)生選課WHERE學(xué)號(hào)

=‘2009303010001’AND課程編號(hào)notINSELECT課程編號(hào)FROM學(xué)生選課WHERE學(xué)號(hào)=‘x’SELECT課程號(hào)FROM學(xué)生選課asAWHERE學(xué)號(hào)=‘2009303010001’

ANDnotExists (SELECT課程編號(hào)

FROM學(xué)生選課asB WHERE學(xué)號(hào)=‘x’

ANDA.課程編號(hào)=B.課程編

號(hào))學(xué)號(hào)=‘x’4.2.3嵌套查詢NotExists(A-B)的表示:

SELECT學(xué)號(hào)FROM學(xué)生選課asC WHERENotExists

(SELECT*FROM學(xué)生選課asAWHERE學(xué) 號(hào)="2009303010001"ANDnotExists

(SELECT* FROM學(xué)生選課asB WHEREC.學(xué)號(hào)=B.學(xué)號(hào)

ANDA.課程編號(hào)=B.課程編號(hào)))4.2.3嵌套查詢查詢選修了全部課程的學(xué)生。某個(gè)學(xué)生所選課B

全部課程A應(yīng)該滿足:A-B為空即:NotExists(A-B)為真4.2.3嵌套查詢

SELECTdistinct學(xué)號(hào)FROM學(xué)生選課asC WHERE NOTEXISTS(SELECT*FROM學(xué)生選課asA WHERENOTEXISTS(SELECT*FROM學(xué)生選課asB WHEREC.學(xué)號(hào)=B.學(xué)號(hào)ANDA.課程編號(hào)

=B.課程編號(hào)))

查詢這樣的學(xué)生,沒有—

門課程是他不選修的4.2.3嵌套查詢3.使用HAVING條件構(gòu)造SELECT語句。

根據(jù)學(xué)生和學(xué)生選課表,列出這樣的學(xué)生的姓名,對(duì)于 課程號(hào)01,他們的平均考試成績高于總的平均考試成 績。

SELECT姓名,AVG(考試成績)FROM學(xué)生,學(xué)生

選課WHERE學(xué)生.學(xué)號(hào)=學(xué)生選課.學(xué)號(hào)AND課程 編號(hào)="01"

GROUPBY姓名

HAVINGAVG(考試成績)>(SELECTAVG(考試

成績)FROM學(xué)生選課)4.2.4匯總查詢可以通過庫函數(shù)對(duì)滿足條件的記錄進(jìn)行最大值、最小值、平均值、總和、計(jì)數(shù)等運(yùn)算。常用庫函數(shù)有:MIN():求(字符、日期、數(shù)值等)最小值。MAX():求(字符、日期、數(shù)值等)最大值。COUNT():計(jì)算所選數(shù)據(jù)的行數(shù)。SUM():計(jì)算數(shù)值列的總和。AVG():計(jì)算數(shù)值列的平均值。這些庫函數(shù)一般是從一組值中計(jì)算出一個(gè)匯總信息。4.2.4匯總查詢用GROUPBY子句來定義或劃分字段的值成為多個(gè)組,它能控制和影響查詢的結(jié)果??梢杂蒙鲜龅膸旌瘮?shù)來對(duì)分組后的數(shù)據(jù)進(jìn)行各種運(yùn)算。4.2.4匯總查詢列出各門課的平均成績、最高成績、最低成績、選課人數(shù)。SELECT課程編號(hào),AVG(考試成績)AS平均分,MAX(考試成績)AS最高分,MIN(考試成績)AS最低分,COUNT(學(xué)號(hào))AS人數(shù)FROM學(xué)生選課GROUPBY課程編號(hào)4.2.4匯總查詢查詢計(jì)算機(jī)專業(yè)的學(xué)生人數(shù)。SELECTCOUNT(*)FROM學(xué)生WHERE專業(yè)編號(hào)="04"COUNT的特殊形式是COUNT(*),統(tǒng)計(jì)滿足WHERE子句中邏輯表達(dá)式的記錄的行數(shù)。先在“學(xué)生選課”表中按學(xué)號(hào)進(jìn)行分組,然后,對(duì)每個(gè)分組檢測(cè)其元組個(gè)數(shù)是否大于等于2,如果滿足條件,則顯示其學(xué)號(hào),否則不顯示。4.2.4匯總查詢列出至少選修了兩門課程的學(xué)生的學(xué)號(hào)。SELECT學(xué)號(hào)FROM學(xué)生選課GROUPBY學(xué)號(hào)HAVINGCOUNT(*)>=2HAVING子句和WHERE子句的區(qū)別:WHERE子句是用來指定表中各行所應(yīng)滿足的條件,而HAVING子句是用來指定每一分組所應(yīng)滿足的條件,只有滿足HAVING條件的那些組才能在結(jié)果中被顯示。4.2.5聯(lián)合查詢使用UNION可以把兩個(gè)SELECT查詢結(jié)果合并起來,形成一個(gè)新的查詢結(jié)果。要求參與UNION合并的兩個(gè)查詢結(jié)果必須具有相同的輸出項(xiàng)。除非UNION后帶有ALL,否則合并結(jié)果將不會(huì)有重復(fù)的記錄。4.2.5聯(lián)合查詢列出單科考試成績最高和最低的學(xué)生的選課情況。SELECT*FROM學(xué)生選課WHERE考試成績=(SELECTMAX(考試成績)FROM學(xué)生選課)UNIONSELECT*FROM學(xué)生選課WHERE考試成績=(SELECTMIN(考試成績)FROM學(xué)生選課)4.2.5聯(lián)合查詢將學(xué)生和教師信息表合并,列出姓名,性別,出生日期,和身份。SELECT姓名,性別,出生日期,"學(xué)生"AS身份FROM學(xué)生UNIONSELECT教師姓名,性別,出生日期,"教師"AS身份FROM教師4.3Access中使用SQL查詢實(shí)質(zhì)上,Access2007中所有的數(shù)據(jù)庫操作都是由SQL語言構(gòu)成的。當(dāng)用設(shè)計(jì)視圖建立一個(gè)查詢后,切換到SQL視圖,可以看到SQL編輯器中有相應(yīng)的SQL語句,這是Access自動(dòng)生成的SQL語句。4.3.1SQL視圖4.3.1SQL視圖直接使用SQL語句。4.3.2傳遞查詢

Access的傳遞查詢可直接將命令發(fā)送到ODBC數(shù)據(jù)庫服務(wù)器,在另一個(gè)數(shù)據(jù)庫中執(zhí)行查詢。使用傳遞查詢時(shí),可以不與服務(wù)器的表鏈接,就可以使用相應(yīng)的表。使用傳遞查詢的主要目的是為了減少網(wǎng)絡(luò)負(fù)荷。在Access中使用傳遞查詢分兩個(gè)步驟,首先設(shè)置要連接的數(shù)據(jù)庫,然后在SQL編輯器中輸入SQL語句。4.3.2傳遞查詢1、創(chuàng)建傳遞查詢。

訪問SQLServer中名為Student的數(shù)據(jù)庫中Stu_Info表的Stu_ID、Stu_Name、Stu_Sex、Stu_Age、Stu_Dep等字段的值。(1)在數(shù)據(jù)庫窗口中單擊“創(chuàng)建”“查詢?cè)O(shè)計(jì)”。(2)單擊“關(guān)閉”按鈕,關(guān)閉”顯示表”對(duì)話框。(3)執(zhí)行“傳遞”命令,打開“查詢”窗口。(4)打開屬性表。4.3.2傳遞查詢(5)設(shè)置“ODBC鏈接字符串”屬性來指定要連接的數(shù)據(jù)庫信息。打開“選擇數(shù)據(jù)源”對(duì)話框,單擊“機(jī)器數(shù)據(jù)源”選項(xiàng)卡:4.3.2傳遞查詢(6)如果已經(jīng)建立了要選擇的數(shù)據(jù)源,可以在列表中直接選擇。如果不存在,單擊“新建”按鈕。(7)單擊“新建”按鈕,打開“創(chuàng)建新數(shù)據(jù)源”第一個(gè)對(duì)話框,在該對(duì)話框中選擇數(shù)據(jù)源類型。?“用戶數(shù)據(jù)源”單選按鈕:只有用戶自己能夠使用。?“系統(tǒng)數(shù)據(jù)源”單選按鈕:登錄到該臺(tái)計(jì)算機(jī)上的任何用戶都可以使用。4.3.2傳遞查詢(8)選擇“系統(tǒng)數(shù)據(jù)源”,然后單擊“下一步”按鈕,打開“創(chuàng)建新數(shù)據(jù)源”的第2個(gè)對(duì)話框。在該對(duì)話框中選擇安裝數(shù)據(jù)源的驅(qū)動(dòng)程序,這里選擇“SQLServer”列表項(xiàng)。4.3.2傳遞查詢(9)單擊“下一步”按鈕,打開“創(chuàng)建新數(shù)據(jù)源”的第3個(gè)對(duì)話框。在該對(duì)話框中顯示了前兩

溫馨提示

  • 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)論