




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 助動車維修技術(shù)交流考核試卷
- 機器視覺與圖像處理技術(shù)考核試卷
- 智能儀器儀表項目規(guī)劃考核試卷
- 醫(yī)用針灸貼的種類和使用建議考核試卷
- 供應(yīng)鏈數(shù)字化轉(zhuǎn)型案例與啟示考核試卷
- 木紋設(shè)計與加工考核試卷
- 苗圃白蟻防治合同范本
- 留置權(quán)合同范本
- 業(yè)擴報裝培訓(xùn)課件
- 8.3 摩擦力(共28張) 2024-2025學(xué)年人教版物理八年級下冊
- 人教版(2024新版)七年級上冊英語各單元重點語法知識點講義
- 生豬屠宰獸醫(yī)衛(wèi)生人員考試題庫答案(414道)
- 《完善中國特色社會主義法治體系》課件
- 2025版 高考試題分析-數(shù)學(xué)-部分4
- 湘教版三年級美術(shù)下冊教案全冊
- 重癥監(jiān)護-ICU的設(shè)置、管理與常用監(jiān)測技術(shù)
- 2024版高一上冊語文模擬試卷
- 法律顧問服務(wù)投標(biāo)方案(完整技術(shù)標(biāo))
- 知道網(wǎng)課智慧樹《哲學(xué)導(dǎo)論(湖南師范大學(xué))》章節(jié)測試答案
- 防止員工集體離職合同
- 加油站合作協(xié)議書
評論
0/150
提交評論