第4章 數(shù)據(jù)庫的查詢和視圖_第1頁
第4章 數(shù)據(jù)庫的查詢和視圖_第2頁
第4章 數(shù)據(jù)庫的查詢和視圖_第3頁
第4章 數(shù)據(jù)庫的查詢和視圖_第4頁
第4章 數(shù)據(jù)庫的查詢和視圖_第5頁
已閱讀5頁,還剩135頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章

數(shù)據(jù)庫的查詢和視圖4.1關(guān)系運(yùn)算4.2數(shù)據(jù)庫的查詢4.3視圖4.4游標(biāo)4.1關(guān)系運(yùn)算1.選擇(Selection)選擇是單目運(yùn)算,其運(yùn)算對象是一個表。該運(yùn)算按給定的條件,從表中選出滿足條件的行,形成一個新表,作為運(yùn)算結(jié)果。選擇運(yùn)算的記號為F(R)。其中,是選擇運(yùn)算符,下標(biāo)F是一個條件表達(dá)式,R是被操作的表。例如,若要在T表(表4.1)中找出T1<20的行形成一個新表,則運(yùn)算式為F(T)上式中F:T1<20,該選擇運(yùn)算的結(jié)果如表4.2所示。T1T2T3T4T51A133M2B120N3A21212O5D1024P20F14Q100A328N表4.1T表4.1關(guān)系運(yùn)算T1T2T3T4T51A133M2B120N3A21212O5D1024P表4.2F(T)4.1關(guān)系運(yùn)算2.投影(Projection)投影也是單目運(yùn)算,該運(yùn)算從表中選出指定的屬性值組成一個新表,記為ΠA(R)。其中,A是屬性名(即列名)表,R是表名。例如,在T表中對T1、T2和T5投影,運(yùn)算式為T1,T2,T5(T)該運(yùn)算得到如表4.3所示的新表。T1T2T5T1T2T51A1M5DP2B1N20FQ3A2O100A3N表4.3T1,T2,T5(T)4.1關(guān)系運(yùn)算3.連接(JOIN)連接是把兩個表中的行按照給定的條件進(jìn)行拼接而形成新表,記為

。其中,R、S是被操作的表,F(xiàn)是條件。例如,若表A和B分別如表4.4和表4.5所示,則

如表4.6所示,其中,F(xiàn)為T1=T3。T1T2T1T2T1T21A6F2BT3T4T5T3T4T513M20NT1T2T3T4T51A13M2B20N表4.4A表表4.5B表表4.64.1關(guān)系運(yùn)算數(shù)據(jù)庫應(yīng)用中最常用的是“自然連接”。進(jìn)行自然連接運(yùn)算要求兩個表有共同屬性(列),自然連接運(yùn)算的結(jié)果表是在參與操作的兩個表的共同屬性上進(jìn)行等值連接后,再去除重復(fù)的屬性后所得的新表。自然連接運(yùn)算記為

,其中,R和S是參與運(yùn)算的兩個表。例如,若表A和B分別如表4.7和表4.8所示,則

如表4.9所示。T1T2T3T1T2T3T1T2T310A1B15A1C220D2C2T1T4T5T6T1T4T5T61100A1D1200A2D11002B2C1510A2C2T1T2T3T4T5T65A1C210A2C220D2C20A2D1表4.7A表表4.8B表表4.94.2數(shù)據(jù)庫的查詢當(dāng)用戶登錄到SQLServer后,即被指定一個默認(rèn)數(shù)據(jù)庫,通常是master數(shù)據(jù)庫。使用USEdatabase_name語句可以選擇當(dāng)前要操作的數(shù)據(jù)庫。其中,database_name是要選為當(dāng)前數(shù)據(jù)庫的數(shù)據(jù)庫名。例如,要選擇PXSCJ為當(dāng)前數(shù)據(jù)庫,可以使用如下語句實現(xiàn):USEPXSCJGO下面介紹SELECT語句,它是T-SQL的核心。語法格式如下:[WITH<common_table_expression>] /*指定臨時命名的結(jié)果集*/SELECT[ALL|DISTINCT] [TOPexpression[PERCENT][WITHTIES]] <select_list> /*指定要選擇的列及其限定*/ [INTOnew_table] /*INTO子句,指定結(jié)果存入新表*/ [FROMtable_source] /*FROM子句,指定表或視圖*/ [WHEREsearch_condition] /*WHERE子句,指定查詢條件*/ [GROUPBYgroup_by_expression] /*GROUPBY子句,指定分組表達(dá)式*/ [HAVINGsearch_condition] /*HAVING子句,指定分組統(tǒng)計條件*/ [ORDERBYorder_expression[ASC|DESC]] /*ORDER子句,指定排序表達(dá)式和順序*/4.2.1選擇列通過SELECT語句的<select_list>項組成結(jié)果表的列。語法格式如下:<select_list>::={* /*選擇當(dāng)前表或視圖的所有列*/

|{table_name|view_name|table_alias}.*/*選擇指定的表或視圖的所有列*/

|{column_name|[]expression|$IDENTITY|$ROWGUID} /*選擇指定的列*/

|udt_column_name[{.|::}{{property_name|field_name}|method_name(argument[,...n])}] /*選擇用戶定義數(shù)據(jù)類型的屬性、方法和字段*/ |expression [[AS]column_alias] /*AS子句,定義列別名*/

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

[,...n]4.2.1選擇列1.選擇所有列使用“*”表示選擇一個表或視圖中的所有列。【例4.1】

查詢PXSCJ數(shù)據(jù)庫中XSB表的所有數(shù)據(jù)。USEPXSCJGOSELECT* FROMXSBGO執(zhí)行完后SQLServerManagementStudio的結(jié)果窗口中將顯示XSB表的所有數(shù)據(jù)。4.2.1選擇列2.選擇一個表中指定的列使用SELECT語句選擇一個表中的某些列,各列名之間要以逗號分隔。其中,$IDENTITY表示選擇標(biāo)識列,$ROWGUID表示選擇ROWGUIDCOL屬性的全局標(biāo)識列。如果在FROM子句中有多個表具有ROWGUIDCOL屬性,則必須用特定的表名限定$ROWGUID,如T1.$ROWGUID?!纠?.2】查詢PXSCJ數(shù)據(jù)庫的XSB表中各個同學(xué)的姓名、專業(yè)和總學(xué)分。USEPXSCJGOSELECT姓名,專業(yè),總學(xué)分 FROMXSBGOSQLServer2008中還能一次執(zhí)行多個查詢。4.2.1選擇列【例4.3】

查詢XSB表中計算機(jī)專業(yè)同學(xué)的學(xué)號、姓名和總學(xué)分,查詢XSB表中所有列。SELECT學(xué)號,姓名,總學(xué)分 FROMXSB WHERE專業(yè)='計算機(jī)'GOSELECT* FROMXSB4.2.1選擇列執(zhí)行后在結(jié)果窗口中將分別列出兩個查詢語句的結(jié)果,如圖4.1所示:圖4.1一次執(zhí)行多個查詢4.2.1選擇列3.定義列別名當(dāng)希望查詢結(jié)果中的某些列或所有列顯示時使用自己選擇的列標(biāo)題時,可以在列名之后使用AS子句來更改查詢結(jié)果的列標(biāo)題名。其中,column_alias是指定的列別名。【例4.4】

查詢XSB表中計算機(jī)系同學(xué)的學(xué)號、姓名和總學(xué)分,結(jié)果中各列的標(biāo)題分別指定為number、name和mark。USEPXSCJGOSELECT學(xué)號ASnumber,姓名ASname,總學(xué)分ASmark FROMXSB WHERE專業(yè)='計算機(jī)'4.2.1選擇列執(zhí)行結(jié)果如下:4.2.1選擇列更改查詢結(jié)果中的列標(biāo)題也可以使用column_alias=expression的形式。例如,SELECTnumber=學(xué)號,name=姓名,mark=總學(xué)分 FROMXSB WHERE專業(yè)='計算機(jī)'該語句的執(zhí)行結(jié)果與上例的結(jié)果完全相同。當(dāng)自定義的列標(biāo)題中含有空格時,必須使用引號將標(biāo)題括起來。例如,SELECT'Studentnumber'=學(xué)號,姓名AS'Studentname',mark=總學(xué)分 FROMXSB WHERE專業(yè)='計算機(jī)'4.2.1選擇列4.替換查詢結(jié)果中的數(shù)據(jù)在對表進(jìn)行查詢時,有時希望對所查詢的某些列得到的是一種概念而不是具體的數(shù)據(jù)。例如,查詢XSB表的總學(xué)分,希望知道的是學(xué)習(xí)的總體情況,這時,就可以用等級來替換總學(xué)分的具體數(shù)字。要替換查詢結(jié)果中的數(shù)據(jù),則要使用查詢中的CASE表達(dá)式,格式為CASE WHEN條件1THEN表達(dá)式1 WHEN條件2THEN表達(dá)式2…… ELSE表達(dá)式END4.2.1選擇列【例4.5】

查詢XSB表中計算機(jī)系各同學(xué)的學(xué)號、姓名和總學(xué)分,對其總學(xué)分按以下規(guī)則進(jìn)行替換:若總學(xué)分為空值,則替換為“尚未選課”;若總學(xué)分小于50,則替換為“不及格”;若總學(xué)分在50與52之間,則替換為“合格”;若總學(xué)分大于52,則替換為“優(yōu)秀”。列標(biāo)題更改為“等級”。USEPXSCJGOSELECT學(xué)號,姓名,等級= CASE WHEN總學(xué)分ISNULLTHEN'尚未選課' WHEN總學(xué)分<50THEN'不及格' WHEN總學(xué)分>=50and總學(xué)分<=52THEN'合格' ELSE'優(yōu)秀' END FROMXSB WHERE專業(yè)='計算機(jī)'GO4.2.1選擇列執(zhí)行結(jié)果如下:4.2.1選擇列5.計算列值使用SELECT對列進(jìn)行查詢時,在結(jié)果中可以輸出對列值計算后的值,即SELECT子句可使用表達(dá)式作為結(jié)果,格式為SELECTexpression[,expression]【例4.6】按120分計算成績并顯示學(xué)號為081101的學(xué)生的成績情況。USEPXSCJGOSELECT學(xué)號,課程號,成績120=成績*1.20 FROMCJB WHERE學(xué)號='081101'執(zhí)行結(jié)果如下:4.2.1選擇列6.消除結(jié)果集中的重復(fù)行對表只選擇其某些列時,可能會出現(xiàn)重復(fù)行。例如,若對PXSCJ數(shù)據(jù)庫的XSB表只選擇專業(yè)和總學(xué)分,則出現(xiàn)多行重復(fù)的情況。可以使用DISTINCT關(guān)鍵字消除結(jié)果集中的重復(fù)行,其格式是SELECTDISTINCT|ALLcolumn_name[,column_name…]關(guān)鍵字DISTINCT的含義是,對結(jié)果集中的重復(fù)行只選擇一個,保證行的唯一性?!纠?.7】

對PXSCJ數(shù)據(jù)庫的XSB表只選擇專業(yè)和總學(xué)分,消除結(jié)果集中的重復(fù)行。USEPXSCJGOSELECTDISTINCT專業(yè),總學(xué)分 FROMXSB執(zhí)行結(jié)果如下:4.2.1選擇列7.限制結(jié)果集返回行數(shù)如果SELECT語句返回的結(jié)果集的行數(shù)非常多,那么可以使用TOP選項限制其返回的行數(shù)。TOP選項的基本格式為[TOPexpression[PERCENT][WITHTIES]]指示只能從查詢結(jié)果集返回指定的第一組行或指定的百分比數(shù)目的行。expression可以是指定數(shù)目或百分比數(shù)目的行。若帶PERCENT關(guān)鍵字,則表示返回結(jié)果集的前expression%行。TOP子句可以用于SELECT、INSERT、UPDATE和DELETE語句中。【例4.8】

對PXSCJ數(shù)據(jù)庫的XSB表選擇姓名、專業(yè)和總學(xué)分,返回結(jié)果集的前6行。SELECTTOP6姓名,專業(yè),總學(xué)分 FROMXSB4.2.1選擇列8.選擇用戶定義數(shù)據(jù)類型列udt_column_name為要指定的用戶定義類型列的名稱。{.|::}指定用戶定義類型的方法、屬性或字段,將“.”用于實例(非靜態(tài))方法、屬性或字段,“::”用于靜態(tài)方法、屬性或字段。property_name為udt_column_name的公共屬性。field_name為udt_column_name的公共數(shù)據(jù)成員。method_name是采用一個或多個參數(shù)的udt_column_name的公共方法。有關(guān)用戶定義數(shù)據(jù)類型將在第5章中討論。9.聚合函數(shù)SELECT子句中的表達(dá)式中還可以包含所謂的聚合函數(shù)。聚合函數(shù)常常用于對一組值進(jìn)行計算,然后返回單個值。聚合函數(shù)通常與GROUPBY子句一起使用。如果一個SELECT語句中有一個GROUPBY子句,則這個聚合函數(shù)對所有列起作用,如果沒有,則SELECT語句只產(chǎn)生一行作為結(jié)果。SQLServer2008所提供的聚合函數(shù)列于表4.10中。4.2.1選擇列函

數(shù)

名說

明AVG求組中值的平均值BINARY_CHECKSUM返回對表中的行或表達(dá)式列表計算的二進(jìn)制校驗值,可用于檢測表中行的更改CHECKSUM返回在表的行上或在表達(dá)式列表上計算的校驗值,用于生成哈希索引CHECKSUM_AGG返回組中值的校驗值COUNT求組中項數(shù),返回int類型整數(shù)COUNT_BIG求組中項數(shù),返回bigint類型整數(shù)GROUPING產(chǎn)生一個附加的列GROUPING_ID為聚合列列表中的每一行創(chuàng)建一個值以標(biāo)識聚合級別MAX求最大值MIN求最小值SUM返回表達(dá)式中所有值的和STDEV返回給定表達(dá)式中所有值的統(tǒng)計標(biāo)準(zhǔn)偏差STDEVP返回給定表達(dá)式中所有值的填充統(tǒng)計標(biāo)準(zhǔn)偏差VAR返回給定表達(dá)式中所有值的統(tǒng)計方差VARP返回給定表達(dá)式中所有值的填充統(tǒng)計方差表4.10聚合函數(shù)表4.2.1選擇列下面對常用的聚合函數(shù)加以介紹。(1)SUM和AVGSUM和AVG分別用于求表達(dá)式中所有值項的總和與平均值,語法格式為SUM/AVG([ALL|DISTINCT]expression)其中,expression是常量、列、函數(shù)或表達(dá)式,其數(shù)據(jù)類型只能是int、smallint、tinyint、bigint、decimal、numeric、float、real、money和smallmoney。ALL表示對所有值進(jìn)行運(yùn)算,DISTINCT表示去除重復(fù)值,默認(rèn)為ALL。SUM/AVG忽略NULL值?!纠?.9】

求選修101課程的學(xué)生的平均成績。SELECTAVG(成績)AS'課程101平均成績' FROMCJB WHERE課程號='101'4.2.1選擇列使用聚合函數(shù)作為SELECT的選擇列時,若不為其指定列標(biāo)題,則系統(tǒng)將對該列輸出標(biāo)題“無列名”。【例4.10】

求學(xué)號為081101的同學(xué)所學(xué)課程的總成績。SELECTSUM(成績)AS'課程總成績' FROMCJB WHERE學(xué)號='081101';結(jié)果為234。4.2.1選擇列(2)MAX和MINMAX和MIN分別用于求表達(dá)式中所有值項的最大值與最小值,語法格式為MAX/MIN([ALL|DISTINCT]expression)其中,expression是常量、列、函數(shù)或表達(dá)式,其數(shù)據(jù)類型可以是數(shù)字、字符和時間日期類型。ALL、DISTINCT的含義及默認(rèn)值與SUM/AVG函數(shù)相同。MAX/MIN忽略NULL值?!纠?.11】求選修101課程的學(xué)生的最高分和最低分。SELECTMAX(成績)AS'課程101的最高分',MIN(成績)AS'課程101的最低分' FROMCJB WHERE課程號='101'執(zhí)行結(jié)果如下:4.2.1選擇列(3)COUNTCOUNT用于統(tǒng)計組中滿足條件的行數(shù)或總行數(shù),格式為COUNT({[ALL|DISTINCT]expression}|*)其中,expression是一個表達(dá)式,其數(shù)據(jù)類型是除text、image或ntext之外的任何類型。ALL、DISTINCT的含義及默認(rèn)值與SUM/AVG函數(shù)相同,COUNT忽略NULL值?!纠?.12】

求學(xué)生的總數(shù)。SELECTCOUNT(*)AS'學(xué)生總數(shù)' FROMXSB學(xué)生總數(shù)為22,使用COUNT(*)時將返回檢索行的總數(shù)目,不論其是否包含NULL值。【例4.13】

統(tǒng)計備注不為空的學(xué)生數(shù)。SELECTCOUNT(備注)AS'備注不為空的學(xué)生數(shù)' FROMXSB;4.2.1選擇列【例4.14】統(tǒng)計總學(xué)分在50分以上的人數(shù)。SELECTCOUNT(總學(xué)分)AS'總學(xué)分在50分以上的人數(shù)' FROMXSB WHERE總學(xué)分>50;執(zhí)行結(jié)果為2。【例4.15】

求選修了課程的學(xué)生總數(shù)。SELECTCOUNT(DISTINCT學(xué)號) FROMCJBCOUNT_BIG函數(shù)的格式、功能與COUNT函數(shù)都相同,區(qū)別僅在于COUNT_BIG返回bigint類型值。4.2.2WHERE子句在SQLServer2008中,選擇行是通過在SELECT語句的WHERE子句中指定選擇的條件來實現(xiàn)的。這一節(jié)將詳細(xì)討論WHERE子句中查詢條件的構(gòu)成。WHERE子句必須緊跟在FROM子句之后,其基本格式為WHERE<search_condition>其中,search_condition為查詢條件。<search_condition>::= {[NOT]<precdicate>|(<search_condition>)} [{AND|OR}[NOT]{<predicate>|(<search_condition>)}][,…n]4.2.2WHERE子句其中,<predicate>為判定運(yùn)算,結(jié)果為TRUE、FALSE或UNKNOWN。NOT表示對判定的結(jié)果取反,AND用于組合兩個條件,兩個條件都為TRUE時值才為TRUE。OR也用于組合兩個條件,兩個條件有一個條件為TRUE時值就為TRUE。<predicate>::={ expression{=|<|<=|>|>=|<>|!=|!<|!>}expression /*比較運(yùn)算*/|match_expression[NOT]LIKEpattern[ESCAPEEscape_character] /*字符串模式匹配*/|expression[NOT]BETWEENexpressionANDexpression /*指定范圍*/|expressionIS[NOT]NULL /*是否空值判斷*/|CONTAINS({column|*},'<contains_search_condition>') /*包含式查詢*/|FREETEXT({column|*},'freetext_string') /*自由式查詢*/|expression[NOT]IN(subquery|expression[,…n]) /*IN子句*/|expression{=|<|<=|>|>=|<>|!=|!<|!>}{ALL|SOME|ANY}(subquery) /*比較子查詢*/|EXIST(subquery) /*EXIST子查詢*/}4.2.2WHERE子句1.表達(dá)式比較比較運(yùn)算符用于比較兩個表達(dá)式值,共有9個,分別是=(等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、<>(不等于)、!=(不等于)、!<(不小于)、!>(不大于)。比較運(yùn)算的格式為expression{=|<|<=|>|>=|<>|!=|!<|!>}expression其中,expression是除text、ntext和image以外類型的表達(dá)式。當(dāng)兩個表達(dá)式值均不為空值(NULL)時,比較運(yùn)算返回邏輯值TRUE(真)或FALSE(假)。而當(dāng)兩個表達(dá)式值中有一個為空值或都為空值時,比較運(yùn)算將返回UNKNOWN?!纠?.16】

查詢PXSCJ數(shù)據(jù)庫XSB表中學(xué)號為081101的同學(xué)的情況。USEPXSCJGO SELECT姓名,學(xué)號,總學(xué)分FROMXSBWHERE學(xué)號='081101';執(zhí)行結(jié)果如下:4.2.2WHERE子句【例4.17】

查詢XSB表中總學(xué)分大于50的同學(xué)的情況。SELECT姓名,學(xué)號,出生時間,總學(xué)分FROMXSBWHERE總學(xué)分>50;執(zhí)行結(jié)果如下:【例4.18】

查詢XSB表中通信工程專業(yè)總學(xué)分大于等于42的同學(xué)的情況。USEPXSCJGOSELECT* FROMXSB WHERE專業(yè)='通信工程'AND總學(xué)分>=424.2.2WHERE子句2.模式匹配LIKE謂詞用于指出一個字符串是否與指定的字符串相匹配,返回邏輯值TRUE或FALSE。LIKE謂詞表達(dá)式的格式為match_expression[NOT]LIKEpattern[ESCAPEEscape_character]說明如下。match_expression:匹配表達(dá)式,一般為字符串表達(dá)式,在查詢語句中可以是列名。pattern:在match_expression中的搜索模式串。在搜索模式串中可以使用通配符,表4.11列出了LIKE謂詞可以使用的通配符及其說明。通

符說

明%代表0個或多個字符_(下畫線)代表單個字符[]指定范圍(如[a-f]、[0-9])或集合(如[abcdef])中的任何單個字符[^]指定不屬于范圍(如[^a-f]、[^0-9])或集合(如[^abcdef])的任何單個字符表4.11通配符列表4.2.2WHERE子句Escape_character:轉(zhuǎn)義字符,應(yīng)為有效的SQLServer字符,Escape_character沒有默認(rèn)值,且必須為單個字符。當(dāng)模式串中含有與通配符相同的字符時,應(yīng)通過該字符前的轉(zhuǎn)義字符指明其為模式串中的一個匹配字符。使用ESCAPE可指定轉(zhuǎn)義符。NOTLIKE:使用NOTLIKE與LIKE的作用相反。使用帶%通配符的LIKE時,若使用LIKE進(jìn)行字符串比較,則模式字符串中的所有字符都有意義,包括起始或尾隨空格。【例4.19】

查詢XSB表中姓“王”且單名的學(xué)生情況。SELECT* FROMXSB WHERE姓名LIKE'王_'執(zhí)行結(jié)果如下:4.2.2WHERE子句【例4.20】

查詢XSB表中學(xué)號倒數(shù)第3個數(shù)字為1,且倒數(shù)第1個數(shù)在1~5之間的學(xué)生學(xué)號、姓名及專業(yè)。SELECT學(xué)號,姓名,專業(yè) FROMXSB WHERE學(xué)號LIKE'%1_[12345]'如果需要查找一個通配符,則必須使用一個轉(zhuǎn)義字符。【例4.21】查詢XSB表中名字包含下劃線的學(xué)生學(xué)號和姓名。SELECT學(xué)號,姓名 FROMXSB WHERE學(xué)號LIKE'%#_%'ESCAPE'#'

4.2.2WHERE子句3.范圍比較用于范圍比較的關(guān)鍵字有兩個:BETWEEN和IN。當(dāng)要查詢的條件是某個值的范圍時,可以使用BETWEEN關(guān)鍵字。BETWEEN關(guān)鍵字指出查詢范圍,格式為:expression[NOT]BETWEENexpression1ANDexpression2當(dāng)不使用NOT時,若表達(dá)式expression的值在表達(dá)式expression1與expression2之間(包括這兩個值),則返回TRUE,否則返回FALSE;當(dāng)使用NOT時,返回值剛好相反。使用IN關(guān)鍵字可以指定一個值表,值表中列出所有可能的值,當(dāng)與值表中的任一個匹配時,即返回TRUE,否則返回FALSE。使用IN關(guān)鍵字指定值表的格式為:expressionIN(expression[,…n])【例4.22】查詢XSB表中不在1989年出生的學(xué)生情況。SELECT學(xué)號,姓名,專業(yè),出生時間 FROMXSB WHERE出生時間NOTBETWEEN'1989-1-1'and'1989-12-31'4.2.2WHERE子句【例4.23】

查詢XSB表中專業(yè)為“計算機(jī)”、“通信工程”或“無線電”的學(xué)生情況。SELECT* FROMXSB WHERE專業(yè)IN('計算機(jī)','通信工程','無線電')該語句與下列語句等價:SELECT* FROMXSB WHERE專業(yè)='計算機(jī)'or專業(yè)='通信工程'or專業(yè)='無線電'4.2.2WHERE子句4.空值比較當(dāng)需要判定一個表達(dá)式的值是否為空值時,使用ISNULL關(guān)鍵字,格式為:expressionIS[NOT]NULL當(dāng)不使用NOT時,若表達(dá)式expression的值為空值,則返回TRUE,否則返回FALSE;當(dāng)使用NOT時,結(jié)果剛好相反。【例4.24】查詢總學(xué)分尚不定的學(xué)生情況。SELECT* FROMXSB WHERE總學(xué)分ISNULL4.2.2WHERE子句5.CONTAINS謂詞下面介紹如何利用圖形化界面向?qū)У姆绞絹硇陆ㄈ乃饕?,其主要步驟如下。第1步:要建立全文索引,首先要啟動全文搜索服務(wù),這項服務(wù)默認(rèn)是禁用的。啟動的方法是:打開“SQLServer配置管理器”窗口,進(jìn)入“SQLFull-TextFilterDaemonLauncher”服務(wù)的屬性對話框。選擇“服務(wù)”選項卡,將“啟動模式”設(shè)置為“自動”,如圖4.2所示。設(shè)置完后單擊“應(yīng)用”按鈕,再選擇“登錄”選項卡,將內(nèi)置賬戶設(shè)置為本地賬戶,如localsystem,如圖4.3所示,單擊“啟動”按鈕啟動全文搜索,最后單擊“確定”按鈕關(guān)閉窗口。

圖4.2更改服務(wù)啟動模式

圖4.3啟動全文搜索4.2.2WHERE子句第2步:創(chuàng)建全文目錄。在對象資源管理器中展開數(shù)據(jù)庫“PXSCJ”,選擇“存儲”目錄下的“全文目錄”,右擊鼠標(biāo),選擇“新建全文目錄”選項。在彈出的“新建全文目錄-PXSCJ”窗口中填寫全文目錄名稱,如fulltext,如圖4.4所示,單擊“確定”按鈕。圖4.4創(chuàng)建全文目錄4.2.2WHERE子句第3步:在全文目錄中注冊需要全文索引的表。在“全文目錄”目錄下右擊剛剛新建的全文目錄“fulltext”,選擇“屬性”菜單項,進(jìn)入fulltext的屬性窗口。選擇“表/視圖”選項卡,選擇需要全文索引的表,如“dbo.XSB”,單擊

按鈕。選擇完需要全文索引的表后,在“合格列”欄中會顯示能夠進(jìn)行全文索引的列,選擇需要的列,如圖4.5所示,單擊“確定”按鈕。圖4.5在全文目錄中注冊需要全文索引的表4.2.2WHERE子句下面繼續(xù)討論CONTAINS謂詞的使用,CONTAINS謂詞的語法格式如下。CONTAINS({column|*},'<contains_search_condition>'[,LANGUAGElanguage_term])其中,column表示在指定的列中搜索,可以指定多個列,類型為char、varchar、nchar、nvarchar、text、ntext、image、xml和varbinary(max)的列是可進(jìn)行全文搜索的有效列。*表示在所有列中搜索,language_term表示用戶查詢時所用的語言。<contains_search_condition>指定要在column_name中搜索的文本和匹配條件。<contains_search_condition>::=

{ <simple_term>

|<prefix_term>

|<generation_term>

|<proximity_term>

|<weighted_term>

}

|{ (<contains_search_condition>)[{<AND>|<ANDNOT>|<OR>}] <contains_search_condition>[...n]

}4.2.2WHERE子句說明如下。<simple_term>:用于說明搜索的是單詞還是短語,格式為:word|"phrase"其中,word為單詞,即不含空格和標(biāo)點符號的字符串;短語是含一個或多個空格的字符串。如果搜索的是短語,則需要用雙引號將其括起來。<prefix_term>:給出了要搜索的單詞或短語必須匹配的前綴,其格式為:{"word*"|"phase*"}其中,word為單詞,phase為短語,當(dāng)查詢的串是短語時,需用雙引號定界。<generation_term>:說明搜索包含原詞的派生詞,所謂派生詞是指原詞的名詞單、復(fù)數(shù)形式或動詞的各種時態(tài)等。格式為:

FORMSOF({INFLECTIONAL|THESAURUS},<simple_term>[,...n])INFLECTIONAL選項表示指定要對指定的簡單字詞使用與語言相關(guān)的詞干分析器。THESAURUS選項表示指定使用對應(yīng)于列全文語言或指定的查詢語言的同義詞庫。<proximity_term>:表示搜索包含NEAR或~運(yùn)算符左右兩邊的詞或短語。格式為:{<simple_term>|<prefix_term>}{{NEAR|~}{<simple_term>|<prefix_term>}[…n]4.2.2WHERE子句<weight_term>:指明本語句是加權(quán)搜索,即查詢的數(shù)據(jù)與給定的權(quán)重進(jìn)行加權(quán)匹配。格式為:ISABOUT({{

<simple_term>

|<prefix_term>

|<generation_term>

|<proximity_term>

}

[WEIGHT(weight_value)]

}[,...n])其中,weight_value是一個0~1之間的數(shù),表示權(quán)重。4.2.2WHERE子句【例4.25】

使用CONTAINS謂詞搜索XSB表中包含字符“工程”的所有行。USEPXSCJGOSELECT* FROMXSB WHERECONTAINS(*,'工程')執(zhí)行結(jié)果如下:4.2.2WHERE子句6.FREETEXT謂詞與CONTAINS謂詞類似,F(xiàn)REETEXT謂詞也用于在一個表中搜索單詞或短語,并要求表已建立全文索引。格式為FREETEXT({column|column_list|*},'freetext_string'[,LANGUAGElanguage_term])其中,freetext_string是要搜索的字符串。FREETEXT的查詢精度沒有CONTAINS高,并不要求對它們進(jìn)行嚴(yán)格的模式匹配。FREETEXT對所查詢的串也沒有寫法要求,因此FREETEXT也稱為自由式查詢?!纠?.26】

使用FREETEXT謂詞搜索XSB表中包含字符“李”的所有行。SELECT* FROMXSB WHEREFREETEXT(*,'李')4.2.2WHERE子句7.子查詢T-SQL允許SELECT多層嵌套使用,用來表示復(fù)雜的查詢。子查詢除了可以用在SELECT語句中,還可以用在INSERT、UPDATE及DELETE語句中。子查詢通常與IN、EXIST謂詞及比較運(yùn)算符結(jié)合使用。(1)IN子查詢IN子查詢用于進(jìn)行一個給定值是否在子查詢結(jié)果集中的判斷,格式為:expression[NOT]IN(subquery)其中,subquery是子查詢。當(dāng)表達(dá)式expression與子查詢subquery的結(jié)果表中的某個值相等時,IN謂詞返回TRUE,否則返回FALSE;若使用了NOT,則返回的值剛好相反。4.2.2WHERE子句【例4.27】查找選修了課程號為206的課程的學(xué)生情況。在“查詢分析器”窗口中輸入并執(zhí)行如下查詢腳本:USEPXSCJGOSELECT* FROMXSB WHERE學(xué)號IN (SELECT學(xué)號 FROMCJB WHERE課程號='206')在執(zhí)行包含子查詢的SELECT語句時,系統(tǒng)先執(zhí)行子查詢,產(chǎn)生一個結(jié)果表,再執(zhí)行查詢。本例中,先執(zhí)行上面括號里面的子查詢:SELECT學(xué)號FROMCJBWHERE課程名='206'4.2.2WHERE子句【例4.28】

查找未選修離散數(shù)學(xué)的學(xué)生情況。SELECT* FROMXSB WHERE學(xué)號NOTIN ( SELECT學(xué)號 FROMCJB WHERE課程號IN ( SELECT課程號 FROMKCB WHERE課程名='離散數(shù)學(xué)' ) )4.2.2WHERE子句(2)比較子查詢這種子查詢可以認(rèn)為是IN子查詢的擴(kuò)展,它使表達(dá)式的值與子查詢的結(jié)果進(jìn)行比較運(yùn)算,格式為expression{<|<=|=|>|>=|!=|<>|!<|!>}{ALL|SOME|ANY}(subquery)其中,expression為要進(jìn)行比較的表達(dá)式,subquery是子查詢。ALL、SOME和ANY說明對比較運(yùn)算的限制。ALL指定表達(dá)式要與子查詢結(jié)果集中的每個值都進(jìn)行比較,當(dāng)表達(dá)式與每個值都滿足比較的關(guān)系時,才返回TRUE,否則返回FALSE;SOME或ANY表示表達(dá)式只要與子查詢結(jié)果集中的某個值滿足比較的關(guān)系,就返回TRUE,否則返回FALSE。4.2.2WHERE子句【例4.29】查找選修了離散數(shù)學(xué)的學(xué)生學(xué)號。SELECT學(xué)號 FROMCJB WHERE課程號= ( SELECT課程號 FROMKCB WHERE課程名='離散數(shù)學(xué)' );【例4.30】

查找比所有計算機(jī)系的學(xué)生年齡都大的學(xué)生。SELECT* FROMXSB WHERE 出生時間<ALL ( SELECT出生時間 FROMXSB WHERE專業(yè)='計算機(jī)' )4.2.2WHERE子句執(zhí)行結(jié)果如下:【例4.31】查找206號課程成績不低于101號課程最低成績的學(xué)生學(xué)號。SELECT學(xué)號

FROMCJB WHERE 課程號='206'AND成績!<ANY ( SELECT成績 FROMCJB WHERE課程號='101' )4.2.2WHERE子句(3)EXISTS子查詢EXISTS謂詞用于測試子查詢的結(jié)果是否為空表,若子查詢的結(jié)果集不為空,則EXISTS返回TRUE,否則返回FALSE。EXISTS還可與NOT結(jié)合使用,即NOTEXISTS,其返回值與EXISTS剛好相反。其格式為[NOT]EXISTS(subquery)【例4.32】查找選修206號課程的學(xué)生姓名。SELECT姓名 FROMXSB WHERE EXISTS ( SELECT* FROMCJB WHERE學(xué)號=XSB.學(xué)號AND課程號='206' )4.2.2WHERE子句其處理過程如下:首先查找外層查詢中XSB表的第一行,根據(jù)該行的學(xué)號列值處理內(nèi)層查詢,若結(jié)果不為空,則WHERE條件為真,就把該行的姓名值取出作為結(jié)果集的一行;然后再找XSB表的第2,3…行,重復(fù)上述處理過程直到XSB表的所有行都查找完為止?!纠?.33】查找選修了全部課程的同學(xué)的姓名。SELECT姓名 FROMXSB WHERENOTEXISTS ( SELECT* FROMKCB WHERENOTEXISTS ( SELECT* FROMCJB WHERE學(xué)號=XSB.學(xué)號AND課程號=KCB.課程號 ) )4.2.2WHERE子句另外,子查詢還可以用在SELECT語句的其他子句中,如FROM子句。SELECT關(guān)鍵字后面也可以定義子查詢。【例4.34】從XSB表中查找所有女學(xué)生的姓名、學(xué)號及其與081101號學(xué)生的年齡差距。SELECT學(xué)號,姓名,YEAR(出生時間)-YEAR( (SELECT出生時間 FROMXSB WHERE學(xué)號='081101' ))AS年齡差距 FROMXSB WHERE性別=0執(zhí)行結(jié)果如下:4.2.3FROM子句SELECT的查詢對象由FROM子句指定,其格式為[FROM{<table_source>}[,…n]]其中,table_source指出了要查詢的表或視圖。<table_source>::={

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

[WITH(<table_hint>[[,]...n])]

|rowset_function[[AS]table_alias] /*行集函數(shù)*/

[(bulk_column_alias[,...n])]

|user_defined_function[[AS]table_alias] /*指定表值函數(shù)*/

|OPENXML<openxml_clause> /*XML文檔*/

|derived_table[AS]table_alias[(column_alias[,...n])] /*子查詢*/

|<joined_table> /*連接表*/|<pivoted_table> /*將行轉(zhuǎn)換為列*/|<unpivoted_table> /*將列轉(zhuǎn)換為行*/}4.2.3FROM子句1.table_or_view_nametable_or_view_name指定SELECT語句要查詢的表或視圖,表和視圖可以是一個或多個,有關(guān)視圖的內(nèi)容在4.3節(jié)中介紹。【例4.35】查找表KCB中101號課程的開課學(xué)期。USEPXSCJGOSELECT開課學(xué)期 FROMKCB WHERE課程號='101'查詢結(jié)果為1。【例4.36】查找081101號學(xué)生計算機(jī)基礎(chǔ)課的成績。SELECT成績 FROMCJB,KCB WHERECJB.課程號=KCB.課程號 AND學(xué)號='081101' AND課程名='計算機(jī)基礎(chǔ)'4.2.3FROM子句【例4.37】查找選修了學(xué)號為081102的同學(xué)所選修的全部課程的同學(xué)的學(xué)號。

SELECTDISTINCT學(xué)號 FROMCJBASCJ1 WHERENOTEXISTS ( SELECT* FROMCJBASCJ2 WHERECJ2.學(xué)號='081102'ANDNOTEXISTS ( SELECT* FROMCJBASCJ3 WHERECJ3.學(xué)號=CJ1.學(xué)號ANDCJ3.課程號=CJ2.課程號 ) )4.2.3FROM子句2.rowset_functionrowset_function是一個行集函數(shù),行集函數(shù)通常返回一個表或視圖。bulk_column_alias是替代結(jié)果集內(nèi)列名的可選別名。主要的行集函數(shù)有CONTAINSTABLE、FREETEXTTABLE、OPENDATASOURCE、OPENQUERY、OPENROWSET和OPENXML。(1)CONTAINSTABLE函數(shù)。該函數(shù)與CONTAINS謂詞相對應(yīng),用于對表進(jìn)行全文查詢,并且要求所查詢的表上建立了全文索引。CONTAINSTABLE函數(shù)的語法格式為:CONTAINSTABLE(table,{column|column_list|*},'<contains_search_condition>'[,top_n_by_rank])其中,table是進(jìn)行全文查詢的表,column指定被查詢的列,column_list可以指定多個列,*指對所有列進(jìn)行查詢。contains_search_condition與CONTAINS謂詞中的搜索條件完全相同。(2)FREETEXTTABLE函數(shù)。FREETEXTTABLE函數(shù)與FREETEXT謂詞相對應(yīng),它的使用與CONTAINSTABLE函數(shù)類似,格式為:FREETEXTTABLE(table,{column|column_list|*},'freetext_string'[,top_n_by_rank])該函數(shù)使用與FREETEXT謂詞相同的搜索條件。4.2.3FROM子句(3)OPENDATASOURCE函數(shù)。該函數(shù)使用戶連接到服務(wù)器。格式為:OPENDATASOURCE(provider_name,init_string)其中,provider_name是用于訪問數(shù)據(jù)源OLEDB訪問接口的PROGID的名稱,

init_string是連接字符串,這些字符串將要傳遞給目標(biāo)提供程序的IDataInitialize接口。(4)OPENQUERY函數(shù)。該函數(shù)在給定的鏈接服務(wù)器(一個OLEDB數(shù)據(jù)源)上執(zhí)行指定的直接傳遞查詢,返回查詢的結(jié)果集。(5)OPENROWSET函數(shù)。該函數(shù)與OPENQUERY函數(shù)功能相同,只是語法格式不同。(6)OPENXML函數(shù)。OPENXML通過XML文檔提供行集視圖。

4.2.3FROM子句3.user_defined_functionuser_defined_function是表值函數(shù),所謂表值函數(shù)就是返回一個表的用戶自定義函數(shù),有關(guān)用戶自定義函數(shù)的內(nèi)容將在第5章中介紹。4.derived_table子查詢可以用在FROM子句中,derived_table表示由子查詢中SELECT語句的執(zhí)行而返回的表,但必須使用AS關(guān)鍵字為子查詢產(chǎn)生的中間表定義一個別名?!纠?.38】從XSB表中查找總學(xué)分大于50的男同學(xué)的姓名和學(xué)號。SELECT姓名,學(xué)號,總學(xué)分FROM(SELECT姓名,學(xué)號,性別,總學(xué)分 FROMXSB WHERE總學(xué)分>50 )ASSTUDENTWHERE性別=1;執(zhí)行結(jié)果如下:4.2.3FROM子句【例4.39】在XSB表中查找1990年1月1日以前出生的學(xué)生的姓名和專業(yè),分別使用別名stu_name和speciality表示。SELECTm.stu_name,m.speciality FROM(SELECT*FROMXSBWHERE出生時間<'19900101') ASm(num,stu_name,sex,birthday,speciality,score,mem)

執(zhí)行結(jié)果如下:4.2.3FROM子句5.pivoted_table和unpivoted_table<pivoted_table>的格式如下:<pivoted_table>::=table_sourcePIVOT<pivot_clause>[AS]table_alias其中,<pivot_clause>::=(aggregate_function(value_column)FORpivot_columnIN(<column_list>))【例4.40】查找XSB表中1990年1月1日以前出生的學(xué)生的姓名和總學(xué)分,并列出其屬于計算機(jī)專業(yè)還是通信工程專業(yè)的情況,1表示是,0表示否。SELECT姓名,總學(xué)分,計算機(jī),通信工程 FROMXSB PIVOT ( COUNT(學(xué)號) FOR專業(yè) IN(計算機(jī),通信工程) )ASpvt WHERE出生時間<'1990-01-01'4.2.3FROM子句執(zhí)行結(jié)果如下:<unpivoted_table>格式如下:<unpivoted_table>::=table_sourceUNPIVOT<unpivot_clause>table_alias其中,<unpivot_clause>::=(value_columnFORpivot_columnIN(<column_list>))4.2.3FROM子句【例4.41】將KCB表中的開課學(xué)期和學(xué)分列轉(zhuǎn)換為行輸出。SELECT課程號,課程名,選項,內(nèi)容 FROMKCB UNPIVOT (

內(nèi)容 FOR選項IN (學(xué)分,開課學(xué)期) )unpvt執(zhí)行結(jié)果如下:4.2.4連接1.連接謂詞可以在SELECT語句的WHERE子句中使用比較運(yùn)算符給出連接條件對表進(jìn)行連接,將這種表示形式稱為連接謂詞表示形式。【例4.42】查找PXSCJ數(shù)據(jù)庫每個學(xué)生的情況以及選修的課程情況。USEPXSCJGOSELECTXSB.*,CJB.* FROMXSB,CJB WHEREXSB.學(xué)號=CJB.學(xué)號結(jié)果表將包含XSB表和CJB表的所有列。4.2.4連接【例4.43】自然連接查詢。SELECTXSB.*,CJB.課程號,CJB.成績 FROMXSB,CJB WHEREXSB.學(xué)號=CJB.學(xué)號本例所得的結(jié)果表包含以下字段:學(xué)號、姓名、性別、出生時間、專業(yè)、總學(xué)分、備注、課程號、成績。若選擇的字段名在各個表中是唯一的,則可以省略字段名前的表名。例如,本例的SELECT語句也可寫為:SELECTXSB.*,課程號,成績 FROMXSB,CJB WHEREXSB.學(xué)號=CJB.學(xué)號4.2.4連接【例4.44】查找選修了206號課程且成績在80分以上的學(xué)生姓名及成績。SELECT姓名,成績 FROMXSB,CJB WHEREXSB.學(xué)號=CJB.學(xué)號AND課程號='206'AND成績>=80執(zhí)行結(jié)果如下:4.2.4連接【例4.45】

查找選修了“計算機(jī)基礎(chǔ)”課程且成績在80分以上的學(xué)生學(xué)號、姓名、課程名及成績。SELECTXSB.學(xué)號,姓名,課程名,成績 FROMXSB,KCB,CJB WHEREXSB.學(xué)號=CJB.學(xué)號 ANDKCB.課程號=CJB.課程號 AND課程名='計算機(jī)基礎(chǔ)' AND成績>=80執(zhí)行結(jié)果如下:4.2.4連接2.以JOIN關(guān)鍵字指定的連接T-SQL擴(kuò)展了以JOIN關(guān)鍵字指定連接的表示方式,使表的連接運(yùn)算能力有了增強(qiáng)。FROM子句的<joined_table>表示將多個表連接起來。格式如下。<joined_table>::={

<table_source><join_type><table_source>ON<search_condition>

|<table_source>CROSSJOIN<table_source>|left_table_source{CROSS|OUTER}APPLYright_table_source

|[()<joined_table>[]]}4.2.4連接說明如下。<table_source>:準(zhǔn)備要連接的表。<join_type>表示連接類型。<join_type>的格式為<join_type>::=

[{INNER|{{LEFT|RIGHT|FULL}[OUTER]}}[<join_hint>]]

JOIN其中,INNER表示內(nèi)連接,OUTER表示外連接,<join_hint>是連接提示。ON:用于指定連接條件,<search_condition>為連接的條件。APPLY運(yùn)算符:使用APPLY運(yùn)算符可以為實現(xiàn)查詢操作的外部表表達(dá)式返回的每個行調(diào)用表值函數(shù)。left_table_source為外部表值表達(dá)式,right_table_source為表值函數(shù)。通過對right_table_source求值來獲得left_table_source每一行的計算結(jié)果,生成的行被組合起來作為最終輸出。APPLY運(yùn)算符生成的列的列表是left_table_source中的列集,后跟right_table_source返回的列的列表。CROSSAPPLY僅返回外部表中通過表值函數(shù)生成結(jié)果集的行。OUTERAPPLY既返回生成結(jié)果集的行,也返回不生成結(jié)果集的行。CROSSJOIN:表示交叉連接。4.2.4連接(1)內(nèi)連接。指定了INNER關(guān)鍵字的連接是內(nèi)連接,內(nèi)連接按照ON所指定的連接條件合并兩個表,返回滿足條件的行。【例4.46】

查找PXSCJ數(shù)據(jù)庫每個學(xué)生的情況以及選修的課程情況。SELECT* FROMXSBINNERJOINCJB ONXSB.學(xué)號=CJB.學(xué)號執(zhí)行的結(jié)果將包含XSB表和CJB表的所有字段(不去除重復(fù)字段——學(xué)號)。內(nèi)連接是系統(tǒng)默認(rèn)的,可以省略INNER關(guān)鍵字。使用內(nèi)連接后仍可使用WHERE子句指定條件?!纠?.47】

用FROM子句的JOIN關(guān)鍵字表達(dá)下列查詢:查找選修了206號課程且成績在80分以上的學(xué)生姓名及成績。SELECT姓名,成績 FROMXSBJOINCJB ONXSB.學(xué)號=CJB.學(xué)號

WHERE課程號='206'AND成績>=80執(zhí)行結(jié)果如下:4.2.4連接【例4.48】

用FROM子句的JOIN關(guān)鍵字表達(dá)下列查詢:查找選修了“計算機(jī)基礎(chǔ)”課程且成績在80分以上的學(xué)生學(xué)號、姓名、課程名及成績。SELECT XSB.學(xué)號,姓名,課程名,成績 FROMXSBJOINCJBJOINKCB ONCJB.課程號=KCB.課程號

ONXSB.學(xué)號=CJB.學(xué)號

WHERE課程名=‘計算機(jī)基礎(chǔ)’AND成績>=80若要在一個表中查找具有相同列值的行,則可以使用自連接。使用自連接時需為表指定兩個別名,且對所有列的引用均要用別名限定?!纠?.49】

查找不同課程成績相同的學(xué)生的學(xué)號、課程號和成績。SELECTa.學(xué)號,a.課程號,b.課程號,a.成績 FROMCJBaJOINCJBb ONa.成績=b.成績ANDa.學(xué)號=b.學(xué)號ANDa.課程號!=b.課程號執(zhí)行結(jié)果如下:4.2.4連接(2)外連接。指定了OUTER關(guān)鍵字的為外連接,外連接的結(jié)果表不但包含滿足連接條件的行,還包括相應(yīng)表中的所有行。外連接包括以下三種。左外連接(LEFTOUTERJOIN):結(jié)果表中除了包括滿足連接條件的行外,還包括左表的所有行;右外連接(RIGHTOUTERJOIN):結(jié)果表中除了包括滿足連接條件的行外,還包括右表的所有行;完全外連接(FULLOUTERJOIN):結(jié)果表中除了包括滿足連接條件的行外,還包括兩個表的所有行。其中的OUTER關(guān)鍵字均可省略。4.2.4連接【例4.50】

查找所有學(xué)生情況,以及他們選修的課程號,若學(xué)生未選修任何課,也要包括其情況。SELECTXSB.*,課程號 FROMXSBLEFTOUTERJOINCJB ONXSB.學(xué)號=CJB.學(xué)號本例執(zhí)行時,若有學(xué)生未選任何課程,則結(jié)果表中相應(yīng)行的課程號字段值為NULL?!纠?.51】

查找被選修了的課程的選修情況和所有開設(shè)的課程名。SELECTCJB.*,課程名 FROMCJBRIGHTJOINKCB ONCJB.課程號=KCB.課程號4.2.4連接(3)交叉連接。交叉連接實際上是將兩個表進(jìn)行笛卡爾積運(yùn)算,結(jié)果表是由第一個表的每一行與第二個表的每一行拼接后形成的表,因此結(jié)果表的行數(shù)等于兩個表的行數(shù)之積。【例4.52】

列出學(xué)生所有可能的選課情況。SELECT學(xué)號,姓名,課程號,課程名 FROMXSBCROSSJOINKCB交叉連接也可以使用WHERE子句進(jìn)行條件限定。4.2.5GROUPBY子句1.非ISO標(biāo)準(zhǔn)的GROUPBY子句語法格式如下。[GROUPBY[ALL]group_by_expression[,…n][WITH{CUBE|ROLLUP}]]說明如下。group_by_expression:用于分組的表達(dá)式,其中通常包含字段名。指定ALL將顯示所有組。使用GROUPBY子句后,SELECT子句中的列表中只能包含在GROUPBY中指出的列或在聚合函數(shù)中指定的列。WITH:指定CUBE或ROLLUP操作符,CUBE或ROLLUP與聚合函數(shù)一起使用,在查詢結(jié)果中增加附加記錄。4.2.5GROUPBY子句【例4.53】

將PXSCJ數(shù)據(jù)庫中各專業(yè)輸出。SELECT專業(yè) FROMXSB GROUPBY專業(yè)執(zhí)行結(jié)果如下:4.2.5GROUPBY子句【例4.54】

求各專業(yè)的學(xué)生數(shù)。SELECT專業(yè),COUNT(*)AS'學(xué)生數(shù)' FROMXSB GROUPBY專業(yè)執(zhí)行結(jié)果如下:4.2.5GROUPBY子句【例4.55】

求被選修的各門課程的平均成績和選修該課程的人數(shù)。SELECT課程號,AVG(成績)AS'平均成績',COUNT(學(xué)號)AS'選修人數(shù)' FROMCJB GROUPBY課程號執(zhí)行結(jié)果如下:4.2.5GROUPBY子句【例4.56】

在PXSCJ數(shù)據(jù)庫上產(chǎn)生一個結(jié)果集,包括每個專業(yè)的男生、女生人數(shù)、總?cè)藬?shù)及學(xué)生總?cè)藬?shù)。SELECT專業(yè),性別,COUNT(*)AS'人數(shù)' FROMXSB GROUPBY專業(yè),性別

WITHROLLUP執(zhí)行結(jié)果如下:4.2.5GROUPBY子句可以將上述語句與不帶ROLLUP操作符的GROUPBY子句的執(zhí)行情況做一個比較:SELECT專業(yè),性別,COUNT(*)AS'人數(shù)' FROMXSB GROUPBY專業(yè),性別執(zhí)行結(jié)果如下:4.2.5GROUPBY子句【例4.57】

在PXSCJ數(shù)據(jù)庫上產(chǎn)生一個結(jié)果集,包括每個專業(yè)的男生、女生人數(shù)、總?cè)藬?shù),以及男生總數(shù)、女生總數(shù)、學(xué)生總?cè)藬?shù)。SELECT專業(yè),性別,COUNT(*)AS'人數(shù)' FROMXSB GROUPBY專業(yè),性別

WITHCUBE執(zhí)行結(jié)果如下:4.2.5GROUPBY子句使用帶有CUBE或ROLLUP的GROUPBY子句時,SELECT子句的列表還可以是聚合函數(shù)GROUPING。若需要標(biāo)志結(jié)果表中哪些行是由CUBE或ROLLUP添加的而哪些行不是,則可使用GROUPING函數(shù)作為輸出列?!纠?.58】

統(tǒng)計各專業(yè)男生、女生人數(shù)及學(xué)生總?cè)藬?shù),標(biāo)志匯總行。SELECT專業(yè),性別,COUNT(*)AS'人數(shù)', GROUPING(專業(yè))AS'spec',GROUPING(性別)AS'sx' FROMXSB GROUPBY專業(yè),性別

WITHCUBE執(zhí)行結(jié)果如下:4.2.5GROUPBY子句2.ISO標(biāo)準(zhǔn)的GROUPBY子句語

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論