數(shù)據(jù)庫(kù)數(shù)據(jù)查詢應(yīng)用實(shí)踐資料大全_第1頁(yè)
數(shù)據(jù)庫(kù)數(shù)據(jù)查詢應(yīng)用實(shí)踐資料大全_第2頁(yè)
數(shù)據(jù)庫(kù)數(shù)據(jù)查詢應(yīng)用實(shí)踐資料大全_第3頁(yè)
數(shù)據(jù)庫(kù)數(shù)據(jù)查詢應(yīng)用實(shí)踐資料大全_第4頁(yè)
數(shù)據(jù)庫(kù)數(shù)據(jù)查詢應(yīng)用實(shí)踐資料大全_第5頁(yè)
已閱讀5頁(yè),還剩60頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第五章數(shù)據(jù)庫(kù)數(shù)據(jù)查詢應(yīng)用實(shí)踐(1)

1內(nèi)容Select語(yǔ)句上機(jī)實(shí)驗(yàn)2在SQLServer中,對(duì)數(shù)據(jù)庫(kù)的查詢使用SELECT語(yǔ)句。SELECT語(yǔ)句功能非常強(qiáng)大,使用靈活,可以對(duì)圖書管理數(shù)據(jù)庫(kù)進(jìn)行各類查詢。圖書管理數(shù)據(jù)庫(kù)查詢3在進(jìn)行一些簡(jiǎn)單的查詢操作時(shí),經(jīng)常需要從單個(gè)表中提取數(shù)據(jù)?!厩榫?】從圖書管理數(shù)據(jù)庫(kù)MBOOK中查詢出所有讀者的信息。在“SQLServerManagementStudio”中單擊“新建查詢”按鈕新建一個(gè)查詢窗口,在窗口中輸入如下語(yǔ)句:USEMBOOKGOSELECT* FROMTReader從單個(gè)表中查詢數(shù)據(jù)4執(zhí)行完以上語(yǔ)句后,“SQLServerManagementStudio”的結(jié)果窗口中將顯示TReader表中的所有讀者信息,如圖5.1所示。圖5.1查詢所有讀者的信息從單個(gè)表中查詢數(shù)據(jù)5說(shuō)明:在以上SQL語(yǔ)句中,通過(guò)SELECT關(guān)鍵字選擇列,“*”表示查詢一個(gè)表或視圖中的所有列。FROM子句用于指定要查詢的對(duì)象,這里是從表TReader中查詢?!厩榫?】查詢姓名為“王林”的讀者的借書證號(hào)、專業(yè)和借書量。新建一個(gè)查詢窗口,輸入并執(zhí)行以下語(yǔ)句:SELECT借書證號(hào),專業(yè),借書量 FROMTReader WHERE姓名='王林'執(zhí)行結(jié)果如下所示:說(shuō)明:在以上語(yǔ)句中,SELECT關(guān)鍵字后列出了要查詢的列,使用WHERE子句指定要查詢的條件。從單個(gè)表中查詢數(shù)據(jù)6【情景3】計(jì)算“SQLServer實(shí)用教程(第3版)”借出多少本。SELECT復(fù)本量-庫(kù)存量 FROMTBook WHERE書名='SQLServer實(shí)用教程(第3版)'執(zhí)行結(jié)果如下所示:從單個(gè)表中查詢數(shù)據(jù)7【情景4】模糊查詢書名中有“SQLSever”字樣的圖書的書名、作譯者和出版社。查詢結(jié)果中將這三列的標(biāo)題更改為BookName、Author和Press。SELECT書名ASBookName,作譯者ASAuthor,出版社ASPressFROMTBookWHERE書名LIKE'%SQLServer%'執(zhí)行結(jié)果如下所示:從單個(gè)表中查詢數(shù)據(jù)8【情景5】查詢電子工業(yè)出版社出版的作者為鄭阿奇的圖書信息。SELECT* FROMTBook WHERE出版社='電子工業(yè)出版社' AND作譯者='鄭阿奇'執(zhí)行結(jié)果如下所示:從單個(gè)表中查詢數(shù)據(jù)9【情景6】查詢TReader表中第6到10行的讀者記錄。SELECTTOP5* FROMTReader WHERE借書證號(hào)NOTIN( SELECTTOP5借書證號(hào) FROMTReader )執(zhí)行結(jié)果如下所示:從單個(gè)表中查詢數(shù)據(jù)10【情景1】查找讀者“081101”對(duì)“SQLServer實(shí)用教程(第3版)”的借書記錄。SELECTTLend.借書證號(hào),TLend.ISBN,圖書ID,借書時(shí)間,應(yīng)還時(shí)間

FROMTLend,TBook WHERETLend.ISBN=TBook.ISBN ANDTLend.借書證號(hào)='081101' ANDTBook.書名='SQLServer實(shí)用教程(第3版)說(shuō)明:要查找081101的借書記錄,首先需要根據(jù)書名從TBook表中查找圖書的ISBN,再根據(jù)ISBN和借書證號(hào)在TLend表中查找該借書記錄。所以以上語(yǔ)句在FROM子句中指定了兩個(gè)表TLend和TBook,由于在兩個(gè)表中都有ISBN字段,所以在指定時(shí),需要在字段名之前加上表名以示區(qū)別。從多個(gè)表中查詢數(shù)據(jù)11通過(guò)子查詢也可以實(shí)現(xiàn)以上功能:SELECT* FROMTLend WHERE借書證號(hào)='081101' ANDISBNIN ( SELECTISBN FROMTBook WHERE書名='SQLServer實(shí)用教程(第3版)' )從多個(gè)表中查詢數(shù)據(jù)12【情景2】查找出還書時(shí)借書已經(jīng)超過(guò)5天的讀者姓名。SELECTDISTINCT姓名 FROMTReaderJOINHLend ONTReader.借書證號(hào)=HLend.借書證號(hào) WHERE(HLend.還書時(shí)間-HLend.借書時(shí)間)>5執(zhí)行結(jié)果如下所示:說(shuō)明:讀者的姓名只在TReader表中存儲(chǔ),所以只能從TReader表中查找姓名。但是還書記錄只有在還書記錄表HLend中查詢,所以以上語(yǔ)句中使用了JOIN關(guān)鍵字連接了TReader表和HLend表,ON子句用于指定連接的條件,即兩個(gè)表的借書證號(hào)要相等。在WHERE子句中指定了要查詢還書時(shí)間和借書時(shí)間差大于5的記錄。從多個(gè)表中查詢數(shù)據(jù)13SELECTDISTINCT姓名

FROMTReader,HLend whereTReader.借書證號(hào)=HLend.借書證號(hào)

and(HLend.還書時(shí)間-HLend.借書時(shí)間)>514在對(duì)圖書管理數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行檢索時(shí),經(jīng)常需要對(duì)結(jié)果進(jìn)行匯總或計(jì)算,例如,求圖書的總庫(kù)存量、統(tǒng)計(jì)讀者的總數(shù)等。【情景1】查詢圖書管理數(shù)據(jù)庫(kù)中讀者的總數(shù)。USEMBOOKGOSELECTCOUNT(*)AS讀者總數(shù) FROMTReader執(zhí)行結(jié)果如下所示:數(shù)據(jù)匯總15【情景2】統(tǒng)計(jì)圖書管理數(shù)據(jù)庫(kù)中男女生的人數(shù)。SELECT性別,COUNT(性別)AS人數(shù) FROMTReader GROUPBY性別說(shuō)明:以上語(yǔ)句中使用GROUPBY子句對(duì)性別進(jìn)行分組,將性別讀者分為0和1兩組,再使用COUNT函數(shù)統(tǒng)計(jì)每組的人數(shù)。數(shù)據(jù)匯總16【情景3】從借閱表TLend中查找借書大于等于2本且借書時(shí)間早于2009年9月23日的讀者的借書證號(hào)。SELECT借書證號(hào) FROMTLend WHERE借書時(shí)間<'2009-09-23' GROUPBY借書證號(hào) HAVINGCOUNT(借書證號(hào))>=2說(shuō)明:以上語(yǔ)句中使用GROUPBY子句對(duì)TLend表中“借書時(shí)間<'2009-09-23'”的記錄根據(jù)借書證號(hào)進(jìn)行分組,再使用HAVING子句篩選出有相同借書證號(hào)的記錄數(shù)大于2的記錄。數(shù)據(jù)匯總17有時(shí)需要將查詢出的記錄按照指定的順序進(jìn)行排序?!厩榫?】將計(jì)算機(jī)專業(yè)的讀者信息按照出生時(shí)間升序排列。SELECT* FROMTReader WHERE專業(yè)='計(jì)算機(jī)' ORDERBY出生時(shí)間ASC說(shuō)明:在以上語(yǔ)句中,使用ORDERBY子句將所得記錄按照出生時(shí)間排列,關(guān)鍵字ASC表示升序。排序18【情景2】將圖書管理數(shù)據(jù)庫(kù)中的圖書信息按照出版年月降序排列。SELECTISBN,書名,作譯者,出版社,出版年月,價(jià)格

FROMTBook ORDERBY出版年月DESC排序19通過(guò)T-SQL的SELECT語(yǔ)句可以從表或視圖中迅速方便地檢索數(shù)據(jù),可以實(shí)現(xiàn)對(duì)表的選擇、投影及連接操作,其功能十分強(qiáng)大。語(yǔ)法格式如下:SELECT[ALL|DISTINCT] [TOPexpression[PERCENT][WITHTIES]] <列名> /*指定要選擇的列及其限定*/ [INTO<表名>] /*INTO子句,指定結(jié)果存入新表*/ [FROM<查詢對(duì)象>] /*FROM子句,指定表或視圖*/ [WHERE<條件>] /*WHERE子句,指定查詢條件*/ [GROUPBY<分組表達(dá)式>] /*GROUPBY子句,指定分組表達(dá)式*/ [HAVING<分組統(tǒng)計(jì)條件>] /*HAVING子句,指定分組統(tǒng)計(jì)條件*/ [ORDERBY<排序表達(dá)式>[ASC|DESC]] /*ORDER子句,指定排序表達(dá)式和順序*/說(shuō)明:所有被使用的子句必須按語(yǔ)法說(shuō)明中顯示的順序嚴(yán)格地排序。例如,一個(gè)HAVING子句必須位于GROUPBY子句之后,并位于ORDERBY子句之前。SELECT語(yǔ)句返回一個(gè)表的結(jié)果集,通常該結(jié)果集被稱為表值表達(dá)式。Select語(yǔ)句20通過(guò)SELECT語(yǔ)句中SELECT關(guān)鍵字后面的“<列名>”項(xiàng)組成結(jié)果表的列。語(yǔ)法格式:<列名>::={* /*選擇當(dāng)前表或視圖的所有列*/

|<表名或視圖名>.* /*選擇指定的表或視圖的所有列*/

|<列名1>[,<列名2>….] /*選擇指定的列*/ |<列名或表達(dá)式> [[AS]<列別名>] /*AS子句,定義列別名*/

|<列標(biāo)題>=<列名> /*選擇指定列并更改列標(biāo)題*/}

[,...n]選擇列211.選擇所有列使用“*”表示選擇一個(gè)表或視圖中的所有列?!緩?qiáng)化練習(xí)】查詢學(xué)生管理數(shù)據(jù)庫(kù)PXSCJ中XSB表的所有的學(xué)生數(shù)據(jù)。USEPXSCJGOSELECT* FROMXSB2.選擇一個(gè)表中指定的列使用SELECT語(yǔ)句選擇一個(gè)表中的某些列,各列名之間要以逗號(hào)分隔?!緩?qiáng)化練習(xí)】查詢PXSCJ數(shù)據(jù)庫(kù)的XSB表中所有學(xué)生的學(xué)號(hào)、姓名和總學(xué)分。SELECTXM,ZY,ZXF FROMXSB3.定義列別名當(dāng)希望查詢結(jié)果中的某些列或所有列顯示時(shí)使用自己選擇的列標(biāo)題時(shí),可以在列名之后使用AS子句定義一個(gè)列別名來(lái)更改查詢結(jié)果的列標(biāo)題名。選擇列22【強(qiáng)化練習(xí)】查詢XSB表中計(jì)算機(jī)系同學(xué)的XH(學(xué)號(hào))、XM(姓名)和ZXF(總學(xué)分),結(jié)果中各列的標(biāo)題分別指定為學(xué)號(hào)、姓名和總學(xué)分。SELECTXHAS學(xué)號(hào),XMAS姓名,ZXFAS總學(xué)分 FROMXSB WHEREZY='計(jì)算機(jī)'更改查詢結(jié)果中的列標(biāo)題也可以使用“<列名>=<列標(biāo)題>”的形式。例如:SELECT學(xué)號(hào)=XH,姓名=XM,總學(xué)分=ZXF FROMXSB WHEREZY='計(jì)算機(jī)'該語(yǔ)句的執(zhí)行結(jié)果與上例的結(jié)果完全相同。當(dāng)自定義的列標(biāo)題中含有空格時(shí),必須使用引號(hào)將標(biāo)題括起來(lái)。例如:SELECT'Studentnumber'=XH,XMAS'Studentname',mark=ZXF FROMXSB WHEREZY='計(jì)算機(jī)'說(shuō)明:不允許在WHERE子句中使用列別名。這是因?yàn)?,?zhí)行WHERE代碼時(shí),可能尚未確定列值。選擇列234.替換查詢結(jié)果中的數(shù)據(jù)在對(duì)表進(jìn)行查詢時(shí),有時(shí)對(duì)所查詢的某些列希望得到的是一種概念而不是具體的數(shù)據(jù)。要替換查詢結(jié)果中的數(shù)據(jù),則要使用查詢中的CASE表達(dá)式,格式為CASE WHEN條件1THEN表達(dá)式1 WHEN條件2THEN表達(dá)式2… ELSE表達(dá)式END選擇列24【強(qiáng)化練習(xí)】查詢XSB表中計(jì)算機(jī)系各同學(xué)的XH(學(xué)號(hào))、XM(姓名)和ZXF(總學(xué)分),對(duì)其總學(xué)分按以下規(guī)則進(jìn)行替換:若總學(xué)分為空值,替換為“尚未選課”;若總學(xué)分小于50,替換為“不及格”;若總學(xué)分在50與52之間,替換為“合格”;若總學(xué)分大于52,替換為“優(yōu)秀”。列標(biāo)題更改為“等級(jí)”。SELECTXHAS學(xué)號(hào),XMAS姓名,等級(jí)= CASE WHENZXFISNULLTHEN'尚未選課' WHENZXF<50THEN'不及格' WHENZXF>=50andZXF<=52THEN'合格' ELSE'優(yōu)秀' END FROMXSB WHEREZY='計(jì)算機(jī)'GO選擇列25執(zhí)行結(jié)果如下所示:選擇列265.計(jì)算列值使用SELECT對(duì)列進(jìn)行查詢時(shí),在結(jié)果中可以輸出對(duì)列值計(jì)算后的值,即SELECT子句可使用表達(dá)式作為結(jié)果。【強(qiáng)化練習(xí)】按120分計(jì)算成績(jī)顯示學(xué)號(hào)為081101的學(xué)生的成績(jī)情況。SELECTXHAS學(xué)號(hào),KCHAS課程號(hào),成績(jī)120=CJ*1.20 FROMCJB WHEREXH='081101'執(zhí)行結(jié)果如下所示:選擇列276.消除結(jié)果集中的重復(fù)行在只選擇表中某些列時(shí),可能會(huì)出現(xiàn)重復(fù)行。例如,對(duì)PXSCJ數(shù)據(jù)庫(kù)的XSB表只選擇ZY(專業(yè))和ZXF(總學(xué)分),則出現(xiàn)多行重復(fù)的情況??梢允褂肈ISTINCT關(guān)鍵字消除結(jié)果集中的重復(fù)行,其格式是SELECTDISTINCT|ALL<列名>關(guān)鍵字DISTINCT的含義是對(duì)結(jié)果集中的重復(fù)行只選擇一個(gè),保證行的唯一性。【強(qiáng)化練習(xí)】對(duì)PXSCJ數(shù)據(jù)庫(kù)的XSB表只選擇專業(yè)和總學(xué)分,消除結(jié)果集中的重復(fù)行。SELECTDISTINCTZY,ZXF FROMXSB

執(zhí)行結(jié)果如下所示:選擇列287.限制結(jié)果集返回行數(shù)如果SELECT語(yǔ)句返回的結(jié)果集的行數(shù)非常多,可以使用TOP選項(xiàng)限制其返回的行數(shù)。TOP選項(xiàng)的基本格式為[TOPexpression[PERCENT][WITHTIES]]指示只能從查詢結(jié)果集返回指定的第一組行或指定的百分比數(shù)目的行。expression可以是指定數(shù)目或百分比數(shù)目的行。若帶PERCENT關(guān)鍵字,則表示返回結(jié)果集的前expression%行。TOP子句可以用于

SELECT、INSERT、UPDATE和

DELETE語(yǔ)句中?!緩?qiáng)化練習(xí)】對(duì)PXSCJ數(shù)據(jù)庫(kù)的XSB表選擇XM(姓名)、ZY(專業(yè))和ZXF(總學(xué)分),返回結(jié)果集的前6行。SELECTTOP6XM,ZY,ZXF FROMXSB該語(yǔ)句執(zhí)行結(jié)果如下所示:選擇列298.聚合函數(shù)SELECT子句中的表達(dá)式中還可以包含所謂的聚合函數(shù)。聚合函數(shù)常常用于對(duì)一組值進(jìn)行計(jì)算,然后返回單個(gè)值。聚合函數(shù)通常與GROUPBY子句一起使用。如果一個(gè)SELECT語(yǔ)句中有一個(gè)GROUPBY子句,則這個(gè)聚合函數(shù)對(duì)所有列起作用;如果沒(méi)有,則SELECT語(yǔ)句只產(chǎn)生一行作為結(jié)果。SQLServer常用的聚合函數(shù)如表5.10中所示。函數(shù)名說(shuō)明AVG求組中值的平均值BINARY_CHECKSUM返回對(duì)表中的行或表達(dá)式列表計(jì)算的二進(jìn)制校驗(yàn)值,可用于檢測(cè)表中行的更改CHECKSUM返回在表的行上或在表達(dá)式列表上計(jì)算的校驗(yàn)值,用于生成哈希索引CHECKSUM_AGG返回組中值的校驗(yàn)值COUNT求組中項(xiàng)數(shù),返回int類型整數(shù)COUNT_BIG求組中項(xiàng)數(shù),返回bigint類型整數(shù)GROUPING產(chǎn)生一個(gè)附加的列MAX求最大值MIN求最小值SUM返回表達(dá)式中所有值的和STDEV返回給定表達(dá)式中所有值的統(tǒng)計(jì)標(biāo)準(zhǔn)偏差STDEVP返回給定表達(dá)式中所有值的填充統(tǒng)計(jì)標(biāo)準(zhǔn)偏差VAR返回給定表達(dá)式中所有值的統(tǒng)計(jì)方差VARP返回給定表達(dá)式中所有值的填充統(tǒng)計(jì)方差表5.10聚合函數(shù)表選擇列30下面對(duì)常用的幾個(gè)聚合函數(shù)加以介紹。(1)SUM和AVG。SUM和AVG分別用于求表達(dá)式中所有值項(xiàng)的總和與平均值,語(yǔ)法格式為SUM/AVG([ALL|DISTINCT]expression)其中expression是常量、列、函數(shù)或表達(dá)式,其數(shù)據(jù)類型只能是:int、smallint、tinyint、bigint、decimal、numeric、float、real、money和smallmoney。ALL表示對(duì)所有值進(jìn)行運(yùn)算,DISTINCT表示去除重復(fù)值,默認(rèn)為ALL。SUM/AVG忽略NULL值。(2)MAX和MIN。MAX和MIN分別用于求表達(dá)式中所有值項(xiàng)的最大值與最小值,語(yǔ)法格式為MAX/MIN([ALL|DISTINCT]expression)其中expression可以是數(shù)字、字符和時(shí)間日期類型。ALL、DISTINCT的含義及默認(rèn)值與SUM/AVG函數(shù)相同。MAX/MIN忽略NULL值。(3)COUNT。COUNT用于統(tǒng)計(jì)組中滿足條件的行數(shù)或總行數(shù),格式為COUNT({[ALL|DISTINCT]expression}|*)其中expression可以是除text、image或ntext之外的任何類型。COUNT忽略NULL值。選擇列31【強(qiáng)化練習(xí)】(1)求選修101課程的學(xué)生的平均成績(jī)。SELECTAVG(CJ)AS'課程101平均成績(jī)' FROMCJB WHEREKCH='101'執(zhí)行結(jié)果如下所示:選擇列32(2)求選修101課程的學(xué)生的最高分和最低分。SELECTMAX(CJ)AS'課程101的最高分',MIN(CJ)AS'課程101的最低分' FROMCJB WHEREKCH='101'執(zhí)行結(jié)果如下所示:選擇列33(3)統(tǒng)計(jì)備注不為空的學(xué)生數(shù)。SELECTCOUNT(BZ)AS'備注不為空的學(xué)生數(shù)' FROMXSB;注意:這里COUNT(BZ)計(jì)算時(shí)備注為NULL的行被忽略,所以結(jié)果是7而不是22。(4)統(tǒng)計(jì)總學(xué)分在50分以上的人數(shù)。SELECTCOUNT(ZXF)AS'總學(xué)分50分以上的人數(shù)' FROMXSB WHEREZXF>50;執(zhí)行結(jié)果如下:選擇列34FROM子句指定了SELECT語(yǔ)句查詢的對(duì)象的構(gòu)成形式。語(yǔ)法格式如下:FROM<查詢對(duì)象><查詢對(duì)象>的構(gòu)成如下:<查詢對(duì)象>::={

<表名或視圖名>[[AS]<別名>] /*查詢表或視圖,可指定別名*/

|<行集函數(shù)名>[[AS]<別名>][(<列別名>[,...n])] /*行集函數(shù)*/

|<表值函數(shù)>[[AS]<別名>] /*指定表值函數(shù)*/

|<結(jié)果集>[AS]<別名>[(<列別名>[,...n])] /*結(jié)果集*/

|<連接> /*連接表*/}From子句351.表名或視圖名FROM子句后可以指定一個(gè)或多個(gè)表名或視圖名作為查詢對(duì)象??梢允褂肁S選項(xiàng)為表指定別名,AS關(guān)鍵字也可以省略,直接給出別名即可。別名主要用在相關(guān)子查詢及連接查詢中。如果FROM子句指定了表別名,這條SELECT語(yǔ)句中的其他子句都必須使用表別名來(lái)代替原始的表名。2.行集函數(shù)行集函數(shù)通常返回一個(gè)表或視圖??梢允褂脛e名來(lái)替代返回的表,還可以使用列別名替代結(jié)果集內(nèi)的列名。主要的行集函數(shù)有:CONTAINSTABLE、FREETEXTTABLE、OPENDATASOURCE、OPENQUERY、OPENROWSET和OPENXML。3.表值函數(shù)表值函數(shù)就是返回一個(gè)表的用戶自定義函數(shù)。4.結(jié)果集FROM子句中還可以指定一個(gè)使用SELECT語(yǔ)句返回的中間結(jié)果集,但必須使用AS關(guān)鍵字為產(chǎn)生的中間表定義一個(gè)別名。From子句36【強(qiáng)化練習(xí)】(1)查找表KCB中的課程101的KKXQ(開課學(xué)期)。USEPXSCJGOSELECTKKXQ FROMKCB WHEREKCH='101'(2)從XSB表中查找總學(xué)分大于50的男同學(xué)的姓名和學(xué)號(hào)。SELECTXM,XH,ZXFFROM(SELECTXM,XH,XB,ZXF FROMXSB WHEREZXF>50 )ASSTUDENTWHEREXB=1執(zhí)行結(jié)果如下所示:From子句37在SQLServer中,通過(guò)在SELECT語(yǔ)句的WHERE子句中指定選擇的條件來(lái)選擇行。WHERE子句必須緊跟在FROM子句之后,其基本格式為WHERE<條件><條件>的構(gòu)成如下所示:<條件>::= [NOT]<判定運(yùn)算> [{AND|OR}[NOT]<判定運(yùn)算>] [,…n]判定運(yùn)算的結(jié)果為TRUE或FALSE。NOT表示對(duì)判定的結(jié)果取反。AND用于組合兩個(gè)條件,兩個(gè)條件都為TRUE時(shí)值才為TRUE。OR也用于組合兩個(gè)條件,兩個(gè)條件有一個(gè)條件為TRUE時(shí)值就為TRUE。Where子句38<判定運(yùn)算>的一般構(gòu)成如下所示:<判定運(yùn)算>::={ <表達(dá)式>{=|<|<=|>|>=|<>|!=|!<|!>}<表達(dá)式> /*比較運(yùn)算*/|<匹配表達(dá)式>[NOT]LIKEpattern[ESCAPEescape_character] /*字符串模式匹配*/|<表達(dá)式>[NOT]BETWEEN<表達(dá)式1>AND<表達(dá)式2> /*指定范圍*/|<表達(dá)式>IS[NOT]NULL /*是否空值判斷*/|<表達(dá)式>[NOT]IN(<子查詢>|<表達(dá)式>[,…n]) /*IN子句*/|<表達(dá)式>{=|<|<=|>|>=|<>|!=|!<|!>}{ALL|SOME|ANY}(<子查詢>) /*比較子查詢*/|EXIST(<子查詢>) /*EXIST子查詢*/}Where子句391.比較運(yùn)算比較運(yùn)算符用于比較兩個(gè)表達(dá)式值,共有9個(gè),分別是:

=(等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、<>(不等于)、!=(不等于)、!<(不小于)、!>(不大于)。比較運(yùn)算的格式為<表達(dá)式>{=|<|<=|>|>=|<>|!=|!<|!>}<表達(dá)式>當(dāng)兩個(gè)表達(dá)式值均不為空值(NULL)時(shí),比較運(yùn)算返回邏輯值TRUE(真)或FALSE(假)。而當(dāng)兩個(gè)表達(dá)式值中有一個(gè)為空值或都為空值時(shí),比較運(yùn)算將返回UNKNOWN?!緩?qiáng)化練習(xí)】查詢PXSCJ數(shù)據(jù)庫(kù)XSB表中學(xué)號(hào)為081101同學(xué)的情況。USEPXSCJGO SELECTXM,XH,ZXFFROMXSBWHEREXH='081101'執(zhí)行結(jié)果如下所示:Where子句40從查詢條件的構(gòu)成可以看出,可以將多個(gè)判定運(yùn)算的結(jié)果通過(guò)邏輯運(yùn)算符(NOT、AND和OR)再組成更為復(fù)雜的查詢條件。例如,查詢XSB表中通信工程專業(yè)總學(xué)分大于等于42的同學(xué)的情況:SELECT* FROMXSB WHEREZY='通信工程'ANDZXF>=42Where子句412.模式匹配LIKE謂詞用于指出一個(gè)字符串是否與指定的字符串相匹配,返回邏輯值TRUE或FALSE。LIKE謂詞表達(dá)式的格式為<匹配表達(dá)式>[NOT]LIKEpattern[ESCAPE<轉(zhuǎn)義字符>]說(shuō)明:匹配表達(dá)式一般為字符串表達(dá)式,在查詢語(yǔ)句中可以是列名。pattern為在匹配表達(dá)式中的搜索模式串。在搜索模式串中可以使用通配符,表5.11列出了LIKE謂詞可以使用的通配符及其說(shuō)明。通配符說(shuō)明%代表0個(gè)或多個(gè)字符_(下畫線)代表單個(gè)字符[]指定范圍(如[a-f]、[0-9])或集合(如[abcdef])中的任何單個(gè)字符[^]指定不屬于范圍(如[^a-f]、[^0-9])或集合(如[^abcdef])的任何單個(gè)字符表5.11通配符列表Where子句42轉(zhuǎn)義字符應(yīng)為有效的SQLServer字符,沒(méi)有默認(rèn)值,且必須為單個(gè)字符。當(dāng)模式串中含有與通配符相同的字符時(shí),此時(shí)應(yīng)通過(guò)該字符前的轉(zhuǎn)義字符指明其為模式串中的一個(gè)匹配字符。使用ESCAPE關(guān)鍵字可指定轉(zhuǎn)義符。NOTLIKE:使用NOTLIKE與LIKE的作用相反。使用帶“%”通配符的LIKE時(shí),若使用LIKE進(jìn)行字符串比較,模式字符串中的所有字符都有意義,包括起始或尾隨空格。Where子句43【強(qiáng)化練習(xí)】(1)查詢XSB表中姓“王”且單名的學(xué)生情況。USEPXSCJGOSELECT* FROMXSB WHEREXMLIKE'王_'執(zhí)行結(jié)果如下所示:Where子句44(2)查詢XSB表中學(xué)號(hào)中倒數(shù)第3個(gè)數(shù)字為1且倒數(shù)第1個(gè)數(shù)在1到5之間的學(xué)生學(xué)號(hào)、姓名及專業(yè)。SELECTXH,XM,ZY FROMXSB WHEREXHLIKE'%1_[12345]'執(zhí)行結(jié)果如下所示:Where子句453.范圍比較用于范圍比較的關(guān)鍵字有兩個(gè):BETWEEN和IN。當(dāng)要查詢的條件是某個(gè)值的范圍時(shí),可以使用BETWEEN關(guān)鍵字。BETWEEN關(guān)鍵字指出查詢范圍,格式為:<表達(dá)式>[NOT]BETWEEN<表達(dá)式1>AND<表達(dá)式2>當(dāng)不使用NOT時(shí),若<表達(dá)式>的值在<表達(dá)式1>與<表達(dá)式2>(包括這兩個(gè)值)之間,則返回TRUE,否則返回FALSE;使用NOT時(shí),返回值剛好相反。使用IN關(guān)鍵字可以指定一個(gè)值表,值表中列出所有可能的值,當(dāng)與值表中的任一個(gè)匹配時(shí),即返回TRUE,否則返回FALSE。使用IN關(guān)鍵字指定值表的格式為:<表達(dá)式>IN(<表達(dá)式>[,…n])【強(qiáng)化練習(xí)】(1)查詢XSB表中不在1989年出生的學(xué)生情況。SELECTXH,XM,ZY,CSSJ FROMXSB WHERECSSJNOTBETWEEN'1989-1-1'and'1989-12-31'(2)查詢XSB表中專業(yè)為“計(jì)算機(jī)”或“通信工程”或“無(wú)線電”的學(xué)生情況。SELECT* FROMXSB WHERE專業(yè)

IN('計(jì)算機(jī)','通信工程','無(wú)線電')Where子句464.空值比較當(dāng)需要判定一個(gè)表達(dá)式的值是否為空值時(shí),使用ISNULL關(guān)鍵字,格式為<表達(dá)式>IS[NOT]NULL當(dāng)不使用NOT時(shí),若表達(dá)式的值為空值,返回TRUE,否則返回FALSE;當(dāng)使用NOT時(shí),結(jié)果剛好相反。Where子句475.子查詢?cè)诓樵儣l件中,可以使用另一個(gè)查詢的結(jié)果作為條件的一部分,例如判定列值是否與某個(gè)查詢的結(jié)果集中的值相等,作為查詢條件一部分的查詢稱為子查詢。T-SQL允許SELECT多層嵌套使用,用來(lái)表示復(fù)雜的查詢。子查詢除了可以用在SELECT語(yǔ)句中,還可以用在INSERT、UPDATE及DELETE語(yǔ)句中。子查詢通常與IN、EXIST謂詞及比較運(yùn)算符結(jié)合使用。(1)IN子查詢。IN子查詢用于進(jìn)行一個(gè)給定值是否在子查詢結(jié)果集中的判斷,格式為<表達(dá)式>[NOT]IN(<子查詢>)當(dāng)表達(dá)式與子查詢的結(jié)果表中的某個(gè)值相等時(shí),IN謂詞返回TRUE,否則返回FALSE;若使用了NOT,則返回的值剛好相反?!緩?qiáng)化練習(xí)】查找選修了課程號(hào)為206的課程的學(xué)生的情況。SELECT* FROMXSB WHEREXHIN (SELECTXH FROMCJB WHEREKCH='206')Where子句48執(zhí)行結(jié)果如下所示:在執(zhí)行包含子查詢的SELECT語(yǔ)句時(shí),系統(tǒng)先執(zhí)行子查詢,產(chǎn)生一個(gè)結(jié)果表,再執(zhí)行查詢。本例中,先執(zhí)行上面括號(hào)里面的子查詢:SELECTXHFROMCJBWHEREKCH='206'得到一個(gè)只含有XH列的表,CJB表中的每個(gè)KCH值為206的行在結(jié)果表中都有一行。再執(zhí)行外查詢,若XSB表中某行的XH列值等于子查詢結(jié)果表中的任一個(gè)值,則該行就被選擇。Where子句49(2)比較子查詢。這種子查詢可以認(rèn)為是IN子查詢的擴(kuò)展,它使表達(dá)式的值與子查詢的結(jié)果進(jìn)行比較運(yùn)算,格式為<表達(dá)式>{<|<=|=|>|>=|!=|<>|!<|!>}{ALL|SOME|ANY}(<子查詢>)ALL、SOME和ANY說(shuō)明對(duì)比較運(yùn)算的限制。ALL指定表達(dá)式要與子查詢結(jié)果集中的每個(gè)值都進(jìn)行比較,當(dāng)表達(dá)式與每個(gè)值都滿足比較的關(guān)系時(shí),才返回TRUE,否則返回FALSE;SOME或ANY表示表達(dá)式只要與子查詢結(jié)果集中的某個(gè)值滿足比較的關(guān)系時(shí),就返回TRUE,否則返回FALSE。Where子句50【強(qiáng)化練習(xí)】(1)查找選修了離散數(shù)學(xué)的學(xué)生學(xué)號(hào)。SELECTXH FROMCJB WHEREKCH= ( SELECTKCH FROMKCB WHEREKCM='離散數(shù)學(xué)' )(2)查找比所有計(jì)算機(jī)系的學(xué)生年齡都大的學(xué)生。SELECT* FROMXSB WHERECSSJ<ALL ( SELECTCSSJ FROMXSB WHEREZY='計(jì)算機(jī)' )Where子句51執(zhí)行結(jié)果如下所示:Where子句52(3)EXISTS子查詢。EXISTS謂詞用于測(cè)試子查詢的結(jié)果是否為空表,若子查詢的結(jié)果集不為空,則EXISTS返回TRUE,否則返回FALSE。EXISTS還可與NOT結(jié)合使用,即NOTEXISTS,其返回值與EXISTS剛好相反。其格式為[NOT]EXISTS(<子查詢>)【強(qiáng)化練習(xí)】查找選修206號(hào)課程的學(xué)生姓名。SELECTXM FROMXSB WHEREEXISTS ( SELECT* FROMCJB WHEREXH=XSB.XHANDKCH='206' )Where子句53GROUPBY子句主要用于根據(jù)字段對(duì)行分組。例如,在學(xué)生成績(jī)管理數(shù)據(jù)庫(kù)PXSCJ中根據(jù)學(xué)生所學(xué)的專業(yè)對(duì)XSB表中的所有行分組,結(jié)果是每個(gè)專業(yè)的學(xué)生成為一組。在SQLServer中GROUPBY子句的語(yǔ)法格式如下:[GROUPBY[ALL]<分組表達(dá)式>[,…n]說(shuō)明:<分組表達(dá)式>中通常包含字段名。指定ALL將顯示所有組。使用GROUPBY子句后,SELECT語(yǔ)句的SELECT關(guān)鍵字后只能包含在GROUPBY中指出的列或在聚合函數(shù)中指定的列?!緩?qiáng)化練習(xí)】(1)將PXSCJ數(shù)據(jù)庫(kù)中各專業(yè)輸出。USEPXSCJGOSELECTZY FROMXSB GROUPBYZY執(zhí)行結(jié)果如下所示:Groupby子句54(2)求被選修的各門課程的平均成績(jī)和選修該課程的人數(shù)。SELECTKCHAS課程號(hào),AVG(CJ)AS'平均成績(jī)',COUNT(XH)AS'選修人數(shù)' FROMCJB GROUPBYKCH執(zhí)行結(jié)果如下所示:Groupby子句55(3)求每個(gè)專業(yè)的男生、女生人數(shù)。SELECTZY,XB,COUNT(*)AS'人數(shù)' FROMXSB GROUPBYZY,XB執(zhí)行結(jié)果如下所示:Groupby子句56使用GROUPBY子句和聚合函數(shù)對(duì)數(shù)據(jù)進(jìn)行分組后,還可以使用HAVING子句對(duì)分組數(shù)據(jù)進(jìn)行進(jìn)一步的篩選。例如查找PXSCJ數(shù)據(jù)庫(kù)中平均成績(jī)?cè)?5分以上的學(xué)生,就是在CJB表上按學(xué)號(hào)分組后篩選出符合平均成績(jī)大于等于85的學(xué)生。HAVING子句的格式為[HAVING<條件>]HAVING子句中的條件與WHERE子句的查詢條件類似,不過(guò)HAVING子句中可以使用聚合函數(shù),而WHERE子句中不可以。在SELECT語(yǔ)句中,當(dāng)WHERE、GROUPBY與HAVING子句都被使

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論