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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

查詢條件關系條件復合條件確定范圍

所用符號或關鍵字=,>,>=,<,<=,=,<>NOT,AND,ORBETWEEN…AND(或NOTBETWEEN… AND)包含子項IN(或NOTIN)字符匹配字符串表達式[NOT]LIKE<模式>4.2.1簡單查詢(2)有條件查詢(1)列出2009級學生的學號、姓名等信息。SELECT學號,姓名,入學成績FROM學生whereleft(學號,4)="2009“(2)查詢2009年9月1日入學且入學成績不低于600分的學生信息。SELECT*FROM學生where入學時間=#2009-9-1#AND入學成績>=60020004.2.1簡單查詢如果要求某列的數(shù)據(jù)在某個區(qū)間內,可以

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

SELECT*FROM教師where工資BETWEEN 1000AND2000

SELECT*FROM教師where工資NOT BETWEEN1000AND等價于:

SELECT*FROM教師

注意:WHERE工資>=1000AND工

資<=2000

BETWEEN包括邊界值,而NOTBETWEEN

不包括邊界值4.2.1簡單查詢當要求表的列值是某幾個值中的一個時用

IN運算符(4)列出選修了課程號為“01”和“53”的學生的學號和成績。

SELECT學號,成績FROM學生選課WHERE

課程編號IN("01","53")

SELECT學號,成績FROM學生選課WHERE

課程編號NOTIN("01","53")

等價于:

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

SELECT學號,課程編號FROM學生選課WHERE

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

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

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

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

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

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

運算符,則稱之為等值或非等值連接。

自身連接。有時在查詢中需要對相同的表進行連接,即

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

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

列出選修了“01”號課程的學生姓名及成績。

SELECT姓名,考試成績FROM學生,學生選課

WHERE學生.學號=學生選課.學號AND課程編號="01"

“姓名”和“考試成績”兩個

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

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

SELECT學號,姓名FROM學生,學生選課WHERE

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

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

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

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

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

SELECTX.學號,X.考試成績FROM學生選課X,學生

選課YWHEREX.課程編號="01"ANDX.課程編

號=Y.課程編號ANDY.學號

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

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

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

FROM表名1INNER|LEFT|RIGHT|FULL

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

INNERJOIN等價于JOIN,為普通連接,亦稱內部

連接。

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

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

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

SELECT課程編號,平時成績,考試成績FROM學生

INNERJOIN學生選課ON學生.學號=學生選課.

學號WHERE學生.姓名="陳誠"

它等價于:

SELECT課程編號,平時成績,考試成績FROM學生

S,學生選課SCWHERES.姓名="陳誠"ANDS.

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

SELECTb.學號,姓名,課程名稱,考試成績FROM(

課程aINNERJOIN學生選課bONa.課程編號=b.

課程編號)INNERJOIN學生cONb.學號=c.學號

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

DESC4.2.2多表查詢(連接)JOIN可以進行多個表的連接。在連接時,JOIN的順序和ON的順序(相應的連接條件)正好相反:

SELECTb.學號,姓名,課程名稱,考試成績FROM課程

aINNERJOIN(學生選課bINNERJOIN學生c ONb.學號=c.學號)ONa.課程編號=b.課程編號

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

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

SELECT學生.學號,姓名,課程編號,考試成績

FROM學生LEFTJOIN學生選課ON學生.學號

=學生選課.學號

SELECT學生選課.學號,課程.課程編號,考試成績

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

返回單值的子查詢:子查詢的結果只返回一個值,如:查

詢學號為“2009303010001”的同學的性別,只有一個 值。 列出選修了編譯原理的所有學生的學號。

SELECT學號FROM學生選課WHERE課程編號=

(SELECT課程編號FROM課程WHERE課程名稱="

編譯原理")

!由于編譯原理的“課程編號”只有一個(返回結果不只一 個時,不能用“=”號)4.2.3嵌套查詢在“學生”表中查詢與陳靜同鄉(xiāng)的學生情況。

SELECT*FROM學生WHERE籍貫=(SELECT

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

SELECT學號,考試成績FROM學生選課WHERE課程 編號="01"AND考試成績>(SELECTINT(AVG(考

試成績))FROM學生選課WHERE課程編號="01")

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

SELECT姓名,出生日期,入學成績FROM學生

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

子查詢從學生表中取出入學成績低于

600分的學生之最高成績4.2.3嵌套查詢找出每個學生超過他選修課程平均成績的課程號。

SELECT學號,課程編號,考試成績FROM學生選 課ASAWHERE考試成績>=(SELECTAVG(考

試成績)FROM學生選課ASBWHEREA.學號

=B.學號)

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

返回單值的子查詢:子查詢的結果只返回一個值。4.2.3嵌套查詢2、返回一組值的子查詢

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

WHERE子句中應怎樣使用這些返回值。通常使用

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

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

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

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

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

SELECT*FROM學生

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

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

SELECT*FROM學生WHEREYEAR(出生日

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

學生)或:

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

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

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

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

或:

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

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

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

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

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

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

SELECT*FROM學生WHERE專業(yè)編號="04"

AND學號NOTIN(SELECT學號FROM學生 選課)4.2.3嵌套查詢列出學生表中“計算機”專業(yè)選課的學生。

SELECT*FROM學生WHERE專業(yè)編號="04"

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

SELECT*FROM學生選課WHERE學號IN

(SELECT學號FROM學生WHERE專業(yè)編號

="05")

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

SELECT學生.學號,姓名FROM學生WHERE專業(yè) 編號IN(SELECT專業(yè)編號FROM學生WHERE

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

SELECTb.學號,課程名稱,考試成績FROM課程a,

學生選課b WHEREa.課程編號=b.課程編號AND課程名稱IN

(SELECT課程名稱FROM課程

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

SELECT姓名FROM學生WHERE學生.學號IN

(SELECT學生選課.學號FROM學生選課WHERE

課程編號IN (SELECT課程編號FROM課程

WHERE課程名稱="編譯原理"))4.2.3嵌套查詢查詢同時選修了01號和02號課程的學生學號。

SELECT學號from學生選課WHERE課程編號

="01"AND學號IN(SELECT學號from學生選課

WHERE課程編號="02")

交4.2.3嵌套查詢查詢選修了01號課程而沒有選修02號課程的學生學號。

SELECT學號from學生選課WHERE課程編號

="01"AND學號NOTIN(SELECT學號from學 生選課WHERE課程編號="02")

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

查詢“選修了課程號為01的所有學生的姓名”。

SELECT姓名FROM學生WHEREEXISTS

(SELECT*FROM學生選課WHERE學生.學 號=學生選課.學號AND課程編號="01")

關子查詢

SELECT姓名FROM學生,學生選課

WHERE學生.學號=學生選課.學號AND課連接查詢

程編號="01"

SELECT姓名FROM學生WHERE學號IN

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

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

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

SELECT學號from學生選課AWHERE課程編號

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

SELECT學號from學生選課AWHERE課程編號

="01"ANDNOTEXISTS(SELECT*from學生選 課BWHERE課程編號="02"ANDA.學號=B.學號

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

A-B表示:SELECT課程編號FROM學生選課WHERE學號

=‘2009303010001’AND課程編號notINSELECT課程編號FROM學生選課WHERE學號=‘x’SELECT課程號FROM學生選課asAWHERE學號=‘2009303010001’

ANDnotExists (SELECT課程編號

FROM學生選課asB WHERE學號=‘x’

ANDA.課程編號=B.課程編

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

SELECT學號FROM學生選課asC WHERENotExists

(SELECT*FROM學生選課asAWHERE學 號="2009303010001"ANDnotExists

(SELECT* FROM學生選課asB WHEREC.學號=B.學號

ANDA.課程編號=B.課程編號))4.2.3嵌套查詢查詢選修了全部課程的學生。某個學生所選課B

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

SELECTdistinct學號FROM學生選課asC WHERE NOTEXISTS(SELECT*FROM學生選課asA WHERENOTEXISTS(SELECT*FROM學生選課asB WHEREC.學號=B.學號ANDA.課程編號

=B.課程編號))

查詢這樣的學生,沒有—

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

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

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

選課WHERE學生.學號=學生選課.學號AND課程 編號="01"

GROUPBY姓名

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

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

Access的傳遞查詢可直接將命令發(fā)送到ODBC數(shù)據(jù)庫服務器,在另一個數(shù)據(jù)庫中執(zhí)行查詢。使用傳遞查詢時,可以不與服務器的表鏈接,就可以使用相應的表。使用傳遞查詢的主要目的是為了減少網(wǎng)絡負荷。在Access中使用傳遞查詢分兩個步驟,首先設置要連接的數(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)建”“查詢設計”。(2)單擊“關閉”按鈕,關閉”顯示表”對話框。(3)執(zhí)行“傳遞”命令,打開“查詢”窗口。(4)打開屬性表。4.3.2傳遞查詢(5)設置“ODBC鏈接字符串”屬性來指定要連接的數(shù)據(jù)庫信息。打開“選擇數(shù)據(jù)源”對話框,單擊“機器數(shù)據(jù)源”選項卡:4.3.2傳遞查詢(6)如果已經(jīng)建立了要選擇的數(shù)據(jù)源,可以在列表中直接選擇。如果不存在,單擊“新建”按鈕。(7)單擊“新建”按鈕,打開“創(chuàng)建新數(shù)據(jù)源”第一個對話框,在該對話框中選擇數(shù)據(jù)源類型。?“用戶數(shù)據(jù)源”單選按鈕:只有用戶自己能夠使用。?“系統(tǒng)數(shù)據(jù)源”單選按鈕:登錄到該臺計算機上的任何用戶都可以使用。4.3.2傳遞查詢(8)選擇“系統(tǒng)數(shù)據(jù)源”,然后單擊“下一步”按鈕,打開“創(chuàng)建新數(shù)據(jù)源”的第2個對話框。在該對話框中選擇安裝數(shù)據(jù)源的驅動程序,這里選擇“SQLServer”列表項。4.3.2傳遞查詢(9)單擊“下一步”按鈕,打開“創(chuàng)建新數(shù)據(jù)源”的第3個對話框。在該對話框中顯示了前兩

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論