計算機軟件及應(yīng)用SQL查詢基礎(chǔ)_第1頁
計算機軟件及應(yīng)用SQL查詢基礎(chǔ)_第2頁
計算機軟件及應(yīng)用SQL查詢基礎(chǔ)_第3頁
計算機軟件及應(yīng)用SQL查詢基礎(chǔ)_第4頁
計算機軟件及應(yīng)用SQL查詢基礎(chǔ)_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

3.3SQL數(shù)據(jù)查詢

3.3.1SELECT命令的格式與基本使用

>數(shù)據(jù)查詢是數(shù)據(jù)庫中最常見的操作。

ASQL語言提供SELECT語句,通過查詢操作可得到所

需的信息。

>SELECT語句的一般格式為:

SELECT〈列名〉[{,〈列名〉}]

FROM〈表名或視圖名〉[{,〈表名或視圖名〉}]

[WHERE〈檢索條件〉]

[GROUPBY<列名1>[HAVING〈條件表達式習(xí)]

?■JORDERBY〈歹lj名2>[ASC|DESC]];

1

>SELECT語句的格式:

SELECT[ALL|DISTINCT][TOPN[PERCENT][WITH

TIES]]

列名1[AS別名1]

[,列名2[AS別名2]…]

[INTO新表名]

FROM表名1[[AS]表1別名]

[INNER|RIGHT|FULL|OUTER][OUTER]JOIN

表名2[[AS]表2別名]

ON條件

>查詢的結(jié)果是仍是一個表。乎

>SELECT語句的執(zhí)行過程是:

?根據(jù)WHERE子句的檢索條件,從FROM子句指定的

基本表或視圖中選取滿足條件的元組,再按照

SELECT子句中指定的列,投影得到結(jié)果表。

>如果有GROUP子句,則將查詢結(jié)果按照〈列名1>相

同的值進行分組。

?如果GROUP子句后有HAVING短語,則只輸出滿足

HAVING條件的元組。

A如果有ORDER子句,查詢結(jié)果還要按照〈列名2>的

值進行排序。

碗3.21查詢?nèi)玘^^^蔣、姓名和年鼠

SELECTSNO,SN,AGE

FROMS

例3.22查詢學(xué)生的全部信息。

SELECT*

FROMS

?用表示S表的全部列名,而不必逐一列出。

SELECTSNO,SN,SEX,AGE,DEPTFROMS

例3.23查詢選修了課程的學(xué)生號。

SELECTDISTINCTSNO

FROMSC

>查詢結(jié)果中的重復(fù)行被去掉

止述查詢均為不使用WHERE子句的無條件查詢,也

?另外,利用投影查詢可控制列名的順序,并可迺送甯

定別名改變查詢結(jié)果的列標(biāo)題的名字。

例3.24查詢?nèi)w學(xué)生的姓名、學(xué)號和年齡。

SELECTSN,SNO,AGE

FROMS

SELECTSNNAME,SNO,AGE

FROMS

A其中,NAME為SN的別名

>重新指定查詢的列標(biāo)題:

(1)列名新列名

勺2)列名AS新列名

■4)新列名=列名

:新列名加單引號括住。.

3.3.2條件查詢

?當(dāng)要在表中找出滿足某些條件的行時,則需使用

WHERE子句指定查詢條件。

>WHERE子句中,條件通常通過三部分來描述:

1.列名;

2.比較運算符;

運算符含義

3.列名、常數(shù)。

=,>,<,>=,v=,!=比較大小

AND,OR,NOT多重條件

BETWEENAND確定范圍

IN確定集合

LIKE字符匹配

ISNULL空值

4f

表3.8常用的比較運算符

6

比較大小

例3.25查詢選修課程號為'cr的學(xué)生的學(xué)號和成績。

SELECTSNO,SCORE

FROMSC

WHERECNO'Cl'

例3.26查詢成績高于85分的學(xué)生的學(xué)號、課程號和成績。

SELECTSNO,CNO,SCORE

FROMSC

WHERESCORE>85

3?3.2.2多重條件查詢%△產(chǎn)

>當(dāng)WHERE子句需要指定一個以上的查詢條件時,則

需要使用邏輯運算符AND、OR和NOT將其連結(jié)成復(fù)

合的邏輯表達式。

?其優(yōu)先級由高到低為:NOT、AND、OR,用戶可以

使用括號改變優(yōu)先級。

例3.27查詢選修C1或C2且分數(shù)大于等于85分學(xué)生的的學(xué)

號、課程號和成績。

SELECTSNO,CNO,SCORE

FROMSC

WHERE(CNO='C1'OR(CNO='C2'AND

QSCORE>=85))

3?3.2.3確定范圍片

例3.28查詢工資在1000至1500之間的教師的教師號、姓

名及職稱。

SELECTTNO,TN,PROF

FROMT

WHERESALBETWEEN1000AND1500

>等價于

SELECTTNO,TN,PROF

FROMT

WHERESAL>1000ANDSAL<1500

例3.29查詢工,

姓名及職稱。

SELECTTNO,TN,PROF

FROMT

WHERESALNOTBETWEEN1000AND1500

確定集合

>利用“IN”操作可以查詢屬性值屬于指定集合的元組。

例3.30查詢選修C1或C2的學(xué)生的學(xué)號、課程號和成績。

SELECTSNO,CNO,SCORE

FROMSC

_WHERECNOIN(C11S)

語句也可以使用邏輯運算符“OR”實現(xiàn)。

——]

10

SELECTSNO,CNO,SCORE

FROMSC

WHERECNOCPORCNO=C2'

>利用“NOTIN”可以查詢指定集合外的元組。

例3.31查詢沒有選修CL也沒有選修C2的學(xué)生的學(xué)號、

課程號和成績。

SELECTSNO,CNO,SCORE

FROMSC

WHERECNONOTIN,C1「C2,)

>等價于:

SELECTSNO,CNO,SCORE

FROMSC

WHERECNO!='C1'ANDCNO!='C2'

11

部分匹配查詢

>上例均屬于完全匹配查詢,當(dāng)不知道完全精確面值時,

用戶還可以使用LIKE或NOTLIKE進行部分匹配查詢

(也稱模糊查詢)。

>LIKE定義的一般格式為:

v屬性名>LIKEv字符串常量,

?屬性名必須為字符型,字符串常量的字符可以包含

如下兩個特殊符號:

>%:表示任意知長度的字符串;

>_:表示任意單個字符。

例3.32查詢所有姓張的教師的教師號和姓名。

SELECTTNO,TN

FROMT

7HERETNLIKE'張%'

12

例3.33查詢姓名中第二個漢字是“力”的教師號和姓名。匕

SELECTTNO,TN

FROMT

WHERETNLIKE'―力%,

>注:一個漢字占兩個字符。

注意:1)如果字符串常量中不含通配符,則可用=取代LIKE,用!=

或v>取代NOTLIKEo

2)如果用戶要查詢的字符串中本身就含有通配符,則要使用以下兩

種方法:

a使用ESCAPE關(guān)鍵字定義轉(zhuǎn)義符。

b在方括號([])中只包含通配符本身。

例如,要搜索在任意位置包含字符串5%的字符串,請使用:

WHEREColumnALIKE1%5/%%'ESCAPE'/'

,,或許:WHEREColumnALIKE'5[%]%'

33.2.6空值查詢?nèi)龖?

>某個字段沒有值稱之為具有空值(NULL)。

>通常沒有為一個列輸入值時,該列的值就是空值。

?空值不同于零和空格,它不占任何存儲空間。

>例如,某些學(xué)生選課后沒有參加考試,有選課記錄,

但沒有考試成績,考試成績?yōu)榭罩担@與參加考試,

成績?yōu)榱惴值牟煌?/p>

例3.34查詢沒有考試成績的學(xué)生的學(xué)號和相應(yīng)的課程號。

SELECTSNO,CNO

FROMSC

WHERESCOREISNULL

這里的空值條件為ISNULL,不能寫成

=NULL。

14

333常用庫函數(shù)及統(tǒng)計匯總查詢

>SQL提供了許多庫函數(shù),增強了基本檢索能力。

>常用的庫函數(shù),如表3.2所示

函數(shù)名稱功能

AVG按列計算平均值

SUM按列計算值的總和

MAX求一列中的最大值

MIN求一列中的最小值

COUNT按列值計個數(shù)

例3.35求學(xué)號為S1學(xué)生的總分和平均分。

SELECTSUM(SCORE)ASTotalScore,AVG(SCORE)

ASAveScore

FROMSC

WHERE(SNO='SI')

>注意:函數(shù)SUM和AVG只能對數(shù)值型字段進行計算。

例3.36求選修Cl號課程的最高分、最低分及之間相差的

分數(shù)

SELECTMAX(SCORE)ASMaxScore,

MIN(SCORE)ASMinScore,

MAX(SCORE)-MIN(SCORE)ASDiff

FROMSC

WHERE(CNO=CP)

例3.37求計算機系學(xué)生的總數(shù)

SELECTCOUNT(*)

FROMS

WHEREDEPT='計算機'

例3.38求學(xué)校中共有多少個系

SELECTCOUNT(DISTINCTDEPT)ASDeptNum

FROMS

>注意:加入關(guān)鍵字DISTINCT后表示消去重復(fù)行,可計算

字段"DEPT”不同值的數(shù)目。

>COUNT函數(shù)對空值不計算,但對零進行計算。

例3.39統(tǒng)計有成績同學(xué)的人數(shù)

SELECTCOUNT(distinctsno)

FROMSC

Wherescoreisnotnull

例中成績?yōu)榱愕耐瑢W(xué)計算在內(nèi),沒有成績(即為空值)的不計算。

例3.40利用特殊函數(shù)COUNT(*)求計算機系學(xué)生的總委

SELECTCOUNT(*)

FROMS

WHEREDEPT-計算機,

>COUNT(*)用來統(tǒng)計元組的個數(shù)

>不消除重復(fù)行,不允許使用DISTINCT關(guān)鍵字。

例利用特殊函數(shù)COUNT(*)求計算機系女學(xué)生的總數(shù)

SELECTCOUNT(*)

FROMS

WHEREDEPT-計算機,ANDSEX/女,

3.3.4分組查詢

>GROUPBY子句可以將查詢結(jié)果按屬性列或?qū)傩粤薪M

合在行的方向上進行分組,每組在屬性列或?qū)傩粤薪M

合上具有相同的值。

例3.42查詢各位教師的教師號及其任課的門數(shù)。

SELECTTNO,COUNT(*)ASC_NUM

FROMTC

GROUPBYTNO

AGROUPBY子句按TNO的值分組,所有具有相同TNO

的元組為一組,對每一組使用函數(shù)COUNT進行計算,

統(tǒng)計出各位教師任課的門數(shù)。

>若在分組后還要按照一定的條件進行篩選,

HAVING子句。

例3.43查詢選修兩門以上課程的學(xué)生學(xué)號和選課門數(shù)

SELECTSNO,COUNT(*)ASSC_NUM

FROMSC

GROUPBYSNO

HAVINGCOUNT(*)>=2

>GROUPBY子句按SNO的值分組,所有具有相同SNO

的元組為一組,對每一組使用函數(shù)COUNT進行計算,

統(tǒng)計出每位學(xué)生選課的門數(shù)。

AVING子句去掉不滿足COUNT(*)>=2的組。

21

11*111廣W〉

>當(dāng)在一個SQL查詢中同時使用WHERE子句,GROTP

BY子句和HAVING子句時,其順序是WHERE一

GROUPBY-HAVINGo

>WHERE與HAVING子句的根本區(qū)別在于作用對象不

同:

AWHERE子句作用于基本表或視圖,從中選擇滿足

條件的元組;

AHAVING子句作用于組,選擇滿足條件的組,必須

用于GROUPBY子句之后,但GROUPBY子句可沒

有HAVING子句。

335查詢的排序

>當(dāng)需要對查詢結(jié)果排序時,應(yīng)該使用ORDERBY子句

>ORDERBY子句必須出現(xiàn)在其他子句之后

?排序方式可以指定,DESC為降序,ASC為升序,缺

省時為升序

例3.44查詢選修C1的學(xué)生學(xué)號和成績,并按成績降序排

列。

SELECTSNO,SCORE

FROMSC

WHERECNO'Cl'

ORDERBYSCOREDESC

例3.45查詢選修C2、C3:C4或C5課程的學(xué)號、課程號和成瀛看

詢結(jié)果按學(xué)號升序排列,學(xué)號相同再按成績降序排列。‘;廳4k

SELECTSNO,CNO,SCORE

FROMSC

WHERECNOINCC2〈C3「C4;C5)

ORDERBYSNO,SCOREDESC

例3.46求選課在三門以上且各門課程均及格的學(xué)生的學(xué)號及其總成

績,查詢結(jié)果按總成績降序列出。

SELECTSNO,SUM(SCORE)ASTotalScore

FROMSC

WHERESCORE>=60

GROUPBYSNO

HAVINGCOUNT(*)>=3

ORDERBYSUM(SCORE)DESC

>此語句為分組排序,執(zhí)行過程如下:¥

1.(FROM)取出整個SC

2.(WHERE)篩選SCORE>=60的元組

3.(GROUPBY)將選出的元組按SNO分組

4.(HAVING)篩選選課三門以上的分組

5.(SELECT)以剩下的組中提取學(xué)號和總成績

6.(ORDERBY)將選取結(jié)果排序

>ORDERBYSUM(SCORE)DESC可以改寫成

ORDERBY2DESC

-2代表查詢結(jié)果的第二列。

練習(xí):

1、查詢所有的課程信息。

2、查詢計算機系所有學(xué)生的姓名、學(xué)號。

3、查詢信息系所有女學(xué)生的信息。

4、查詢C1課程的成績在90分以上的學(xué)生學(xué)號。

5、求計算機系的教授人數(shù)。

6、求講師的平均工資。

7、查詢教師的基本信息,并按工資降序排列。

8、求各種職稱的教師的平均工資。

3.3.6數(shù)據(jù)表連接及連接查詢\*

?數(shù)據(jù)表之間的聯(lián)系是通過表的字段值來體現(xiàn)的,這種

字段稱為連接字段。

>連接操作的目的就是通過加在連接字段的條件將多個

表連接起來,以便從多個表中查詢數(shù)據(jù)。

A前面的查詢都是針對一個表進行的,當(dāng)查詢同時涉及

兩個以上的表時,稱為連接查詢。

>表的連接方法有兩種:

?方法1:表之間滿足一定的條件的行進行連接,此

時FROM子句中指明進行連接的表名,WHERE子句

指明連接的列名及其連接條件。

?方法2:利用關(guān)鍵字JOIN進行連接。

具體分為以下幾種:

>INNERJOIN:顯示符合條件的記錄,此為默認值;

>LEFT(OUTER)JOIN:顯示符合條件的數(shù)據(jù)行以及左邊表中

不符合條件的數(shù)據(jù)行,此時右邊數(shù)據(jù)行會以NULL來顯示,此稱

為左連接;

>RIGHT(OUTER)JOIN:顯示符合條件的數(shù)據(jù)行以及右邊表

中不符合條件的數(shù)據(jù)行,此時左邊數(shù)據(jù)行會以NULL來顯示,此

稱為右連接;

>FULL(OUTER)JOIN:顯示符合條件的數(shù)據(jù)行以及左邊表和

右邊表中不符合條件的數(shù)據(jù)行,此時缺乏數(shù)據(jù)的數(shù)據(jù)行會以

NULL來顯示;

>CROSSJOIN:會將一個表的每一筆數(shù)據(jù)和另一表的每筆數(shù)據(jù)匹

配成新的數(shù)據(jù)行。

將JOIN關(guān)鍵詞放于FROM子句中時,應(yīng)有關(guān)鍵詞ON與之相對

T應(yīng)」以表明連接的條件。

等值連接與非等值連接

>例3.47查詢劉偉老師所講授的課程。

>方法L

SELECTT.TNO,TN,CNO

FROMT,TC

WHERE(T.TNO=TC.TNO)AND(TN='文U偉')

>這里,TN-劉偉'為查詢條件,而T.TNO=TC.TNO為連接

條件,TNO為連接字段。連接條件的一般格式為:

[v表名1>.]〈歹U名1>v比較運算符〉卜表名2>.]<列名2>

A其中,比較運算符主要有:=、>、<、〉=、<=、!=o

>當(dāng)比較運算符為“="時,稱為等值連接,其他情況為非等

一值連接。

?引用列名TNO時要加上表名前綴,是因為兩個黃市

的列名相同,必須用表名前綴來確切說明所指列屬

于哪個表,以避免二義性。如果列名是唯一的,比

如TN,就不必須加前綴。

A上面的操作是將T表中的TNO和TC表中的TNO相等

的行連接,同時選取TN為“劉偉”的行,然后再在

TN,CNO列上投影,這是連接、選取和投影的操作

組合。

>方法2:

SELECTT.TNO,TN,CNO

FROMTINNERJOINTC

T.TNO=TC.TNOANDT.TN='劉偉'

r^.工

30

>方法3:先選擇出一些列作為一張表在于其他表還

SELECTR2.TNO,R2.TN,Rl.CNO

FROM

(SELECTTNO,CNOFROMTC)ASRI

INNERJOIN

(SELECTTNO,TNFROMT

WHERETN±文U偉')ASR2

ONR1.TNO=R2.TNO

例3.48查詢所有選課學(xué)生的學(xué)號、姓名、選課名稱及成徽金*

SELECTS.SNO,SN,CN,SCORE

FROMS,C,SC

WHERES.SNOSC.SNOANDSC.CNOC.CNO

>本例涉及三個表,WHERE子句中有兩個連接條件。當(dāng)有

兩個以上的表進行連接時,稱為多表連接。

33.6.2自身連接;、個

A當(dāng)一個表與其自己進行連接操作時,稱為表的自身連

接。

例3.49查詢所有比劉偉工資高的教師姓名、性別、工資

和劉偉的工資。

?要查詢的內(nèi)容均在同一表T中,可以將表T分別取兩個

別名,一個是X,一個是Y。將X,Y中滿足比劉偉工資

高的行連接起來。這實際上是同一表T的自身連接。

>方法1:

SELECTX.TN,X.SALASSAL_a,Y.SALASSALb

FROMTASX,TASY

0WHEREX.SAL>Y.SALANDY.TN士文U偉'

二法2:———¥

SELECTX.TN,X.SAL,Y.SAL

FROMTASXINNERJOINTASY

ONX.SAL>Y.SALANDY.TN='文U偉'

>方法3:

SELECTRI.TN,RI.SAL,R2.SALFROM

(SELECTTN,SALFROMT)ASR1

INNERJOIN

(SELECTSALFROMT

WHERETN士文U偉,)ASR2

ONR1.SAL>R2.SAL

例3.50檢索所有學(xué)生姓名「年齡和選課名稱G

>方法1:

SELECTSN,AGE,CN

FROMS,C,SC

WHERES.SNO=SC.SNOANDSC.CNO=C.CNO

>方法2

SELECTR3.SNO,R3.SN,R3.AGE,R4.CN

FROM

(SELECTSNO,SN,AGEFROMS)ASR3

INNERJOIN

(SELECTR2.SNO,R1.CN

FROM

(SELECTCNO,CNFROMC)ASRI

INNERJOIN

(SELECTSNO,CNOFROMSC)ASR2

ONR1.CNO=R2.CNO)ASR4

NR3£NO=R4.SNO

工---*

35

3.3.6.3外連接〔父今

>在上面的連接操作中,不滿足連接條件的元組不能作為香布嘉果

輸出。

>如例3.48的查詢結(jié)果只包括有選課記錄的學(xué)生,而不會有吳麗同

學(xué)的信息。若將例3.48改成:

例3.51查詢所有學(xué)生的學(xué)號、姓名、選課名稱及成績。(沒有選課

的同學(xué)的選課信息顯示為空)則應(yīng)寫成如下的SQL語句。

SELECTS.SNO,SN,CN,SCORE

FROMS

LEFTOUTERJOINSC

ONS.SNO=SC.SNO

LEFTOUTERJOINC

ONC.CNO-SC.CNO

則查詢結(jié)果只包括所有的學(xué)生,沒有選課的吳麗同學(xué)的選課信息

O

36

3.3.7子查詢

>在WHERE子句中包含一個形如SELECT-FROM-WHERE的查詢

塊,此查詢塊稱為子查詢或嵌套查詢,包含子查詢的語

句稱為父查詢或外部查詢。

A嵌套查詢可以將一系列簡單查詢構(gòu)成復(fù)雜查詢,增強查

詢能力。

?子查詢的嵌套層次最多可達到255層,以層層嵌套的方

式構(gòu)造查詢充分體現(xiàn)了SQL“結(jié)構(gòu)化”的特點。

A嵌套查詢在執(zhí)行時由里向外處理,每個子查詢是在上一

級外部查詢處理之前完成,父查詢要用到子查詢的結(jié)果。

3.3.7.1返回一個值的子查詢

?當(dāng)子查詢的返回值只有一個時,可以使用比較《算符

(二,>,<,>=,〈二,!二)將父查詢和子查詢連接起來。

例3.52查詢與劉偉教師職稱相同的教師號、姓名。

SELECTTNO,TN

FROMT

WHEREPROF=(SELECTPROF

FROMT

WHERETN='文U偉')

A此查詢相當(dāng)于分成兩個查詢塊來執(zhí)行。先執(zhí)行子查詢:

SELECTPROF

FROMT

WHERETN='劉偉'

A子查詢向主查詢只返回一個值,即劉偉教師的膜常

“講師”,然后以此作為父查詢的條件,相當(dāng)于再執(zhí)

行父查詢,查詢所有職稱為“講師”的教師號、姓名。

SELECTTNO,TN

FROMT

WHEREPROF='講師,

3.3.7.2返回一組值的子查詢

>如果子查詢的返回值不止一個,而是一個集合時,則

不能直接使用比較運算符,可以在比較運算符和子查

詢之間插入ANY或ALL。其具體含義詳見以下各例。

1.使用ANY

例3.53查詢講授課程號為C5的教師姓名。

SELECTTN

FROMT

WHERETNO=ANY

(SELECTTNO

FROMTC

WHERECNO='C5')

>先執(zhí)行子查詢:我到講授課程號為C5的教師號;:東七

組值構(gòu)成的集合(T2,T3,T5);"

>再執(zhí)行父查詢,其中ANY的含義為任意一個,查詢教師

號為T2、T3、T5的教師的姓名。

>該例也可以使用前面所講的連接操作來實現(xiàn):

SELECTTN

FROMT,TC

WHERET.TNO=TC.TNO

ANDTC.CNCAC5'

?可見,對于同一查詢可使用子查詢和連接兩種方法來

用決,可根據(jù)習(xí)慣任意選用。

41

例3.54查詢其他系相比計算機系某一教師工資高的冢啟

的姓名和工資。/k

SELECTTN,SAL

FROMT

WHERESAL>ANY

(SELECTSAL

FROMT

WHEREDEPT士計算機)

ANDDEPTH'計算機'

/*注意:此行是父查詢中的條件*/

>先執(zhí)行子查詢,找到計算機系中所有教師的工資集合

(1500,900);

執(zhí)行父查詢,查詢所有不是計算機系且工資高于

口0耍00的教師姓名和工資。

42

>此查詢也可以寫成:

SELECTTN,SAL

FROMT

WHERESAL>

(SELECTMIN(SAL)

FROMT

WHEREDEPT與計算機)

ANDDEPTH,計算機,

>先執(zhí)行子查詢,利用庫函數(shù)MIN找到計算機系中所有教

師的最低工資—900;

>再執(zhí)行父查詢,查詢所有不是計算機系且工資高于900

勺教師。

43

2.使用IN

>可以使用IN代替“二ANY”。

>例3.55(題目同3.53)

SELECTTN

FROMT

WHERETNOIN

(SELECTTNO

FROMTC

WHERECNO='C5')

3.使用ALL

>ALL的含義為全部。

例3.56查詢其他系中比計算機系所有教師工資都高的教師的姓名和

工資。

SELECTTN,SAL

FROMT

WHERESAL>ALL

(SELECTSAL

FROMT

WHEREDEPTM算機)

ANDDEPTH,計算機,

>子查詢找到計算機系中所有教師的工資集合(1500,900);

>父查詢找到所有不是計算機系且工資高于1500的教師姓名和工資。

>此查詢也可以寫成:

SELECTTN,SAL

FROMT

WHERESAL>

(SELECTMAX(SAL)

FROMT

WHEREDEPT士計算機,)

ANDDEPTH,計算機,

>庫函數(shù)MAX的作用是找到計算機系中所有教師的最高工

資1500。

例3.57查詢不講授課程號為C5的教師姓名。

SELECTDISTINCTTN/

FROMT

WHERE951!=ALL

(SELECTCNO

FROMTC

WHERETNO=T.TNO)

>!=ALL的含義為不等于子查詢結(jié)果中的任何一個值,也

可使用NOTIN代替!二ALL。

>子查詢包含普通子查詢和相關(guān)子查詢。

?前面所講的子查詢均為普通子查詢,而本例中子查詢

的查詢條件引用了父查詢表中的屬性值(T表的TN0

二我們把這類查詢稱為相關(guān)子查詢。

>二者的執(zhí)行方式不同:

>普通子查詢的執(zhí)行順序是:',尸?

?首先執(zhí)行子查詢,然后把子查詢的結(jié)果作為父查詢的查詢

條件的值。

?普通子查詢只執(zhí)行一次,而父查詢所涉及的所有記錄行都

與其查詢結(jié)果進行比較以確定查詢結(jié)果集合。

>相關(guān)子查詢的執(zhí)行順序是:

?首先選取父查詢表中的第一行記錄,內(nèi)部的子查詢利用此

行中相關(guān)的屬性值進行查詢,

?然后父查詢根據(jù)子查詢返回的結(jié)果判斷此行是否滿足查詢

條件。如果滿足條件,則把該行放入父查詢的查詢結(jié)果集

合中。重復(fù)執(zhí)行這一過程,直到處理完父查詢表中的每一

行數(shù)據(jù)。

此可以看出,相關(guān)子查詢的執(zhí)行次數(shù)是由父查詢表的行數(shù)決定

>如上例表T中每的一行即每個教師記錄都要執(zhí)行二次子

查詢以確定該教師是否講授C5這門課,當(dāng)C5不是教師

的任一門課時,則該教師被選取。

>以下幾例均為相關(guān)子查詢。

4.使用EXISTS

>EXISTS表示存在量詞,帶有EXISTS的子查詢不返回任

何實際數(shù)據(jù),它只得到邏輯值“真”或“假”。

>當(dāng)子查詢的的查詢結(jié)果集合為非空時,外層的WHERE子

句返回真值,否則返回假值。NOTEXISTS與此相反。

含有IN的查詢通??捎肊XISTS表示,但反過來不一定。

例3.58(題目同3.53)略

SELECTTN

FROMT

WHEREEXISTS

(SELECT*

FROMTC

WHERETNO=T.TNO

ANDCN0='C5')

>當(dāng)子查詢TC表存在一行記錄滿足其WHERE子句中的條件

一時,則父查詢便得到一個TN值,重復(fù)執(zhí)行以上過程,

富-到得出最后結(jié)果。

50

例3.59查詢選修所有課程的學(xué)生姓名

查詢沒有不存在他們選修的課程的學(xué)生

SELECTSNFROMS

WHERENOTEXISTS

(SELECT*FROMC

WHERENOTEXISTS

(SELECT*FROMSC

WHERESNO=S.SNO

ANDCNO=C.CNO))

走出這樣一些學(xué)生名單,在sc表中不存在他們沒有選

3.3.8合并查詢

合并查詢就是使用UNION操作符將來自不同查詢的數(shù)據(jù)

組合起來,形成一個具有綜合信息的查詢結(jié)果。并自

動將重復(fù)的數(shù)據(jù)行刪除。

注意:參加合并的各個子查詢的使用的表結(jié)構(gòu)應(yīng)該相

同,即各個子查詢中的數(shù)據(jù)數(shù)目和對應(yīng)的數(shù)據(jù)類型都

必須相同。

例3.60從SC數(shù)據(jù)表中查詢出學(xué)號為“S1”同學(xué)的學(xué)號和

總分,再從SC數(shù)據(jù)表中查詢出學(xué)號為“S5”的同學(xué)的學(xué)

和總分,然后將兩個查詢結(jié)果合并成一個結(jié)果集。

SELECTSNOAS學(xué)號,SUM(SCORE)AS總分

FROMSC

WHERE(SNO='S1')

GROUPBYSNO

UNION

SELECTSNOAS學(xué)號,SUM(SCORE)AS總分

FORMSC

WHERE(SNO='S5')

BROUPBYSNO

3.3.9存儲查詢結(jié)果到表中

使用SELECT…INTO語句可以將查詢結(jié)果存儲到一個新

建的數(shù)據(jù)庫表或臨時表。

例3.61從SC數(shù)據(jù)表中查詢出所有同學(xué)的學(xué)號和總分,并

將查詢結(jié)果存放到一個新的數(shù)據(jù)表cal_table中。

SELECTSNOAS學(xué)號,SUM(SCORE)AS總分

INTOcallable

FROMSC

GROUPBYSNO

3.4SQL數(shù)據(jù)更新

ASQL語言的數(shù)據(jù)更新語句DML主要包括插入數(shù)據(jù)、修改

數(shù)據(jù)和刪除數(shù)據(jù)三種語句。

3.4.1插入數(shù)據(jù)記錄

?插入數(shù)據(jù)是把新的記錄插入到一個存在的表中。插入

數(shù)據(jù)使用語句INSERTINTO,可分為以下幾種情況。

3.4.1.1插入一4亍新記錄

>語法格式為:

INSERTINTO〈表名>[(〈歹U名1〉[,〈歹U名2>...])]VALUES(〈值〉)

左其中,〈表名〉是指要插入新記錄的表

〈列名〉是可選項,指定待添加數(shù)據(jù)的列

VALUES子句指定待添加數(shù)據(jù)的具體值-

55

>列名的排列順序不一定要和表定義時的順序一可、今

>但當(dāng)指定列名表時VALUES子句值的排列順序必擊口列

名表中的列名排列順序一致,個數(shù)相等,數(shù)據(jù)類型一

一對應(yīng)。

?例3.60在S表中插入一條學(xué)生記錄(學(xué)號:S7;姓名:

鄭冬;性別:女;年齡:21;系別:計算機)。

INSERTINTOS

VALUES(,s7?鄭冬?女,,2"計算機)

注意:

>必須用逗號將各個數(shù)據(jù)分開,字符型數(shù)據(jù)要用單引號

括起來。

INTO子句中沒有指定列名,則新插入的記錄必須在每

9屬性列上均有值,且VALUES子句中值的排列順序要

屬性列的排列順序一致。

56

3.4.1.2插入一行的部分數(shù)據(jù)值

例3.61在SC表中插入一條選課記錄('例361,)。

INSERTINTOSC(SNO,CNO)

VALUES('s7','cl')

>將VALUES子句中的值按照INTO子句中指定列名的順序

插入到表中

>對于INTO子句中沒有出現(xiàn)的列,則新插入的記錄在這

些列上將取空值,如上例的SCORE即賦空值。

>但在表定義時有NOTNULL約束的屬性列不能取空值。

3.4.1.3插入多行記錄JU

?用于表間的拷貝,將一個表中的數(shù)據(jù)抽取數(shù)行插入另

一表中,可以通過子查詢來實現(xiàn)。

>插入數(shù)據(jù)的命令語法格式為:

INSERTINTO〈表名》[(〈列名1>[,〈列名

子查詢

A例3.62求出各系教師的平均工資,把結(jié)果存放在新表

AVGSAL中。

A首先建立新表AVGSAL,用來存放系名和各系的平均

工資

CREATETABLEAVGSAL

(DEPARTMENTVARCHAR(20),

GS肚SMALLINT)

>然后利用子查詢求出T表中各系的平均工資,把結(jié)果存

放在新表AVGSAL中。

INSERTINTOAVGSAL

SELECTDEPT,AVG(SAL)

FROMT

GROUPBYDEPT

2.4.2修改數(shù)據(jù)記錄)裊)

>SQL語言可以使用UPDATE語句對表中的一行或多行記錄

的某些列值進行修改,其語法格式為:

UPDATE〈表名〉

SET<列名〉二<表達式》[,〈列名>二〈表達式》]…

[WHERE〈條件〉]

其中:

>〈表名>是指要修改的表

>SET子句給出要修改的列及其修改后的值

>W(wǎng)HERE子句指定待修改的記錄應(yīng)當(dāng)滿足的條件,WHERE

子句省略時,則修改表中的所有記錄。

3.4.2.1修改一行

例3.63把劉偉教師轉(zhuǎn)到信息系。

UPDATET

SETDEPT='信息'

WHERETN='劉偉'

3.4.2.2修改多行

例3.64將所有學(xué)生年齡增加1歲

UPDATES

SETAGE=AGE+1

例3.65把教師表中工資小于等于1000元的講師的避提

iWj20%o

UPDATET

SETSAL=1.2*SAL

WHEREPROF='講師'

ANDSAL<=1000

3.4.2.3用子查詢選擇要修改的行

例3.66把講授C5課程的教師的崗位津貼增加100元。

UPDATET

SETCOMN=COMN+100

WHERETNOIN

(SELECTT.TNO

FROMT,TC

WHERET.TNO=TC.TNO

ANDTC.CNO='C5')

查海的作用是得到講授C5課程的教師號。

63

3.4.2.4用子查詢提供要修改的值

例3.67把所有教師的工資提高到平均工資的1.2倍

UPDATET

SETSAL=

(SELECT1.2*AVG(SAL)FROMT)

>子查詢的作用是得到所有教師的平均工資。

3.4.3刪除數(shù)據(jù)記錄

?使用DELETE語句可以刪除表中的一行或多行記錄,其

語法格式為:

DELETE

FROM〈表名〉

[WHERE〈條件>]

其中,

>〈表名>是指要刪除數(shù)據(jù)的表。

AWHERE子句指定待刪除的記錄應(yīng)當(dāng)滿足的條件,

WHERE子句省略時,則刪除表中的所有記錄。

3.4.3.1刪除一行記錄

例3.68刪除劉偉教師的記錄。

DELETE

FROMT

WHERE劉偉,

3.4.3.2刪除多行記錄

例3.69刪除所有教師的授課記錄

DELETE

FROMTC

旅行此語句后,TC表即為一個空表,但其定義仍存在

3.4.3.3利用子查詢選擇要刪除的行

例3.70刪除劉偉教師授課的記錄。

DELETE

FROMTC

WHERETNO二

(SELECTTNO

FROMT

WHERETN='劉偉,)

3.5視圖”:將

?視圖是虛表,其數(shù)據(jù)不存儲,其記錄來自基本,,只

在數(shù)據(jù)庫中存儲其定義。

?視圖在概念上與基本表等同,用戶可以在視圖上再定

義視圖,可以對視圖進行查詢.刪除.更新等操作。

3.5.1定義和刪除視圖

3.5.1.1定義視圖

>定義視圖使用語句CREATEVIE肌其語法格式為:

CREATEVIEW〈視圖名>[(〈視圖列表>)]

AS〈子查詢〉

A其中,〈視圖列表》為可選項,省略時,視圖的列名由

4子查詢的結(jié)果決定。

金—

—?

以下兩種情況下,視圖列名不可省略:‘工34

1.視圖由多個表連接得到,在不同的表中存在同義列,

則需指定列名;

2.當(dāng)視圖的列名為表達式或庫函數(shù)的計算結(jié)果時,而

不是單純的屬性名時,則需指明列名。

>在子查詢中不許使用ORDERBY子句和DISTINCT短語,

如果需要排序,則可在視圖定義后,對視圖查詢時再

進行排序。

例3.71創(chuàng)建一個計算機系教師情況的視圖SUBJE

CREATEVIEWSUBT

ASSELECTTNO?TN,PROF

ROMTWHEREDEPT='計算機'

>其中:

A視圖名字為SUB_T,省略了視圖列表。

A視圖由子查詢中的三列TNO,TN,PROF組成。

A視圖創(chuàng)建后,對視圖SUB_T的數(shù)據(jù)的訪問只限制在

計算機系內(nèi),且只能訪向TNO,TN,PROF三列的內(nèi)容,

從而達到了數(shù)據(jù)保密的目的。

?視圖創(chuàng)建后,只在數(shù)據(jù)字典中存放視圖的定義,

而其中的子查詢SELECT語句并不執(zhí)行。

?只有當(dāng)用戶對視圖進行操作時,才按照視圖的

一定義將數(shù)據(jù)從基本表中取出。

例3.72創(chuàng)建一學(xué)生情況視圖S_SC_C(包括衾名

姓名、課程名及成績)。

CREATEVIEWS_SC_C(SNO,SN,CN,SCORE)

ASSELECTS.SNO,SN,CN,SCORE

FROMS,C,SC

WHERES.SNO=SC.SNOAND

SC.CNO=C.CNO

A此視圖由三個表連接得到,在S表和SC表中均

存在SNO列,則需指定視圖列名。

溫馨提示

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

評論

0/150

提交評論