




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
演示文稿數(shù)據(jù)庫(kù)的查詢和視圖目前一頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)(優(yōu)選)數(shù)據(jù)庫(kù)的查詢和視圖目前二頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1數(shù)據(jù)庫(kù)的查詢下面介紹SELECT語(yǔ)句,它是T-SQL的核心。語(yǔ)法主體格式如下:SELECT<輸出列> /*指定查詢結(jié)果輸出列*/ [INTO新表] /*指定查詢結(jié)果存入新表*/ [FROM{<表源>}[,...]] /*指定查詢?cè)矗罕砘蛞晥D*/ [WHERE<條件>] /*指定查詢條件*/ [GROUPBY<分組條件>] /*指定查詢結(jié)果分組條件*/ [HAVING<分組統(tǒng)計(jì)條件>] /*指定查詢結(jié)果分組統(tǒng)計(jì)條件*/ [ORDERBY<排序順序>] /*指定查詢結(jié)果排序順序*/目前三頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列1.選擇所有列使用“*”表示選擇一個(gè)表或視圖中的所有列?!纠?.1】查詢pxscj數(shù)據(jù)庫(kù)中xsb表的所有記錄。T-SQL命令如下:USEpxscjSELECT*FROMxsb目前四頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列執(zhí)行結(jié)果如圖4.1所示。目前五頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列2.選擇一個(gè)表中指定的列可選擇一個(gè)表中的部分列,各列名之間要以逗號(hào)分隔?!纠?.2】查詢xsb表中計(jì)算機(jī)專業(yè)學(xué)生的學(xué)號(hào)、姓名和總學(xué)分。T-SQL命令如下:SELECT學(xué)號(hào),姓名,總學(xué)分 FROMxsb WHERE專業(yè)='計(jì)算機(jī)'目前六頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列3.定義列別名當(dāng)希望查詢結(jié)果中的列使用自己選擇的列標(biāo)題時(shí),可以AS更改列標(biāo)題名,該列標(biāo)題稱為該列的別名。【例4.3】
查詢xsb表中計(jì)算機(jī)系同學(xué)的學(xué)號(hào)、姓名和總學(xué)分,查詢結(jié)果中各列的標(biāo)題分別指定為number、name和mark。T-SQL命令如下:SELECT學(xué)號(hào)ASnumber,姓名ASname,總學(xué)分ASmark FROMxsb WHERE專業(yè)='計(jì)算機(jī)'執(zhí)行結(jié)果如圖4.2所示。目前七頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列也可以使用“列別名=表達(dá)式”更改列標(biāo)題。例如:SELECTnumber=學(xué)號(hào),name=姓名,mark=總學(xué)分 FROMxsb WHERE專業(yè)='計(jì)算機(jī)'當(dāng)自定義的列標(biāo)題中含有空格時(shí),必須使用引號(hào)將標(biāo)題括起來(lái)。例如:SELECT'Studentnumber'=學(xué)號(hào),姓名AS'Studentname',mark=總學(xué)分 FROMxsb WHERE專業(yè)='計(jì)算機(jī)'目前八頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列4.替換查詢結(jié)果中的數(shù)據(jù)在對(duì)表進(jìn)行查詢時(shí),有時(shí)希望對(duì)所查詢的某些列得到的數(shù)據(jù)進(jìn)行變換。要替換查詢結(jié)果中的數(shù)據(jù),則可使用CASE表達(dá)式,格式為:CASE WHEN條件1THEN表達(dá)式1 WHEN條件2THEN表達(dá)式2…… ELSE表達(dá)式END目前九頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列【例4.4】
查詢xsb表中計(jì)算機(jī)系各同學(xué)的學(xué)號(hào)、姓名和總學(xué)分,對(duì)其總學(xué)分按以下規(guī)則進(jìn)行替換,列標(biāo)題更改為“等級(jí)”。若總學(xué)分為空值,則替換為“尚未選課”;若總學(xué)分小于50,則替換為“不及格”;若總學(xué)分在50與52之間,則替換為“合格”;若總學(xué)分大于52,則替換為“優(yōu)秀”。T-SQL命令如下:SELECT學(xué)號(hào),姓名,等級(jí)= CASE WHEN總學(xué)分ISNULLTHEN'尚未選課' WHEN總學(xué)分<50THEN'不及格' WHEN總學(xué)分>=50and總學(xué)分<=52THEN'合格' ELSE'優(yōu)秀' END FROMxsb WHERE專業(yè)='計(jì)算機(jī)'目前十頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列執(zhí)行結(jié)果如圖4.3所示。目前十一頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列5.計(jì)算列值使用SELECT對(duì)列進(jìn)行查詢時(shí),在結(jié)果中除了輸出列值,也可以輸出表達(dá)式值。格式為:SELECT表達(dá)式[,表達(dá)式]【例4.5】查詢通信工程專業(yè)學(xué)生的年齡。T-SQL命令如下,執(zhí)行結(jié)果如圖4.4所示。SELECT學(xué)號(hào),姓名,出生時(shí)間,year(getdate())-year(出生時(shí)間)AS年齡
FROMxsb WHERE專業(yè)='通信工程'計(jì)算列值使用算術(shù)運(yùn)算符:+(加)、(減)、*(乘)、/(除)和%(取余),其中,算術(shù)運(yùn)算符(+、、*、/)可以用于任何數(shù)字類型的列,包括int、smallint、tinyint、decimal、numeric、float、real、money和smallmoney;%可以用于上述除money和smallmoney以外的數(shù)字類型。目前十二頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列圖4.4執(zhí)行結(jié)果目前十三頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列6.消除結(jié)果集中的重復(fù)行對(duì)表只選擇其某些列時(shí),可能會(huì)出現(xiàn)重復(fù)行??梢允褂肈ISTINCT關(guān)鍵字消除結(jié)果集中的重復(fù)行,格式為:SELECTDISTINCT|ALL列名[,列名…]【例4.6】
對(duì)pxscj數(shù)據(jù)庫(kù)的xsb表只選擇專業(yè),消除結(jié)果集中的重復(fù)行。代碼如下,執(zhí)行結(jié)果如圖4.5所示。SELECTDISTINCT專業(yè)FROMxsb與DISTINCT相反,當(dāng)使用關(guān)鍵字ALL(默認(rèn)值)時(shí),將保留結(jié)果集的所有行。目前十四頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列7.限制結(jié)果集返回行數(shù)如果查詢結(jié)果集的行數(shù)非常多,那么可以使用TOP選項(xiàng)限制其返回的行數(shù)。格式為:[TOP表達(dá)式[PERCENT][WITHTIES]]其中,“表達(dá)式”可以是指定數(shù)目或百分比數(shù)目的行。若帶PERCENT關(guān)鍵字,則以表達(dá)式值作為返回結(jié)果集百分?jǐn)?shù)。【例4.7】對(duì)pxscj數(shù)據(jù)庫(kù)的xsb表選擇姓名、專業(yè)和總學(xué)分,返回結(jié)果集的前6行。T-SQL命令如下:SELECTTOP6姓名,專業(yè),總學(xué)分 FROMxsb目前十五頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列8.聚合函數(shù)聚合函數(shù)常常用于對(duì)一組值進(jìn)行計(jì)算,然后返回單個(gè)值。通常與GROUPBY子句一起使用。如果一個(gè)SELECT語(yǔ)句中有一個(gè)GROUPBY子句,則這個(gè)聚合函數(shù)對(duì)所有列起作用;如果沒(méi)有,則SELECT語(yǔ)句只產(chǎn)生一行作為結(jié)果。SQLServer所提供的聚合函數(shù)列于表4.1中。函
數(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è)附加的列GROUPING_ID為聚合列列表中的每一行創(chuàng)建一個(gè)值以標(biāo)識(shí)聚合級(jí)別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ì)方差目前十六頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列(1)SUM和AVG。SUM和AVG分別用于求表達(dá)式中所有值項(xiàng)的總和與平均值,格式為:SUM/AVG([ALL|DISTINCT]表達(dá)式)其中,“表達(dá)式”可以是常量、列、函數(shù)或表達(dá)式,其數(shù)據(jù)類型只能是int、smallint、tinyint、bigint、decimal、numeric、float、real、money和smallmoney?!纠?.8】求所有課程的總學(xué)分和選修101課程的學(xué)生的平均成績(jī)。T-SQL命令如下,執(zhí)行結(jié)果如圖4.6所示。SELECTSUM(學(xué)分)AS'總學(xué)分' FROMkcbSELECTAVG(成績(jī))AS'計(jì)算機(jī)基礎(chǔ)平均成績(jī)' FROMcjb WHERE課程號(hào)='101'目前十七頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列圖4.6執(zhí)行結(jié)果
目前十八頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列(2)MAX和MIN。MAX和MIN分別用于求表達(dá)式中所有值項(xiàng)的最大值與最小值,語(yǔ)法格式為:MAX/MIN([ALL|DISTINCT]表達(dá)式)其中,“表達(dá)式”可以是常量、列、函數(shù)或表達(dá)式,其數(shù)據(jù)類型可以是數(shù)字、字符和時(shí)間日期類型?!纠?.9】求選修101課程的學(xué)生的最高分和最低分。T-SQL命令如下,執(zhí)行結(jié)果如圖4.7所示。SELECTMAX(成績(jī))AS'計(jì)算機(jī)基礎(chǔ)最高分',MIN(成績(jī))AS'計(jì)算機(jī)基礎(chǔ)最低分' FROMcjb WHERE課程號(hào)='101'目前十九頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.1選擇查詢結(jié)果輸出列(3)COUNT。COUNT用于統(tǒng)計(jì)組中滿足條件的行數(shù)或總行數(shù),格式為:COUNT({[ALL|DISTINCT]表達(dá)式}|*)其中,“表達(dá)式”的數(shù)據(jù)類型是除text、image或ntext之外的任何類型?!纠?.10】求學(xué)生的總數(shù)、專業(yè)個(gè)數(shù)和總學(xué)分在50分以上的人數(shù)。T-SQL命令如下,執(zhí)行結(jié)果如圖4.8所示。SELECTCOUNT(*)AS'學(xué)生總數(shù)',COUNT(DISTINCT專業(yè))AS'專業(yè)個(gè)數(shù)' FROMxsb;GOSELECTCOUNT(總學(xué)分)AS'總學(xué)分>50分人數(shù)' FROMxsb WHERE總學(xué)分>50;GO目前二十頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句1.表達(dá)式比較比較運(yùn)算符用于比較兩個(gè)表達(dá)式值,共有9個(gè),分別是=(等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、<>(不等于)、!=(不等于)、!<(不小于)、!>(不大于)。比較運(yùn)算的格式為:表達(dá)式1{比較運(yùn)算符}表達(dá)式2其中,“表達(dá)式”是除text、ntext和image以外類型的表達(dá)式。【例4.11】查詢xsb表中通信工程專業(yè)總學(xué)分大于等于42的同學(xué)的情況。T-SQL命令如下:SELECT* FROMxsb WHERE專業(yè)='通信工程'AND總學(xué)分>=42目前二十一頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句2.模式匹配LIKE謂詞用于指出字符串是否與指定的字符串相匹配,返回邏輯值TRUE或FALSE。格式為:表達(dá)式[NOT]LIKE模式串[ESCAPE轉(zhuǎn)義符]說(shuō)明:(1)表達(dá)式:一般為字符串表達(dá)式,在查詢語(yǔ)句中可以是列名。(2)模式串:可以使用通配符,表4.2列出了LIKE謂詞可以使用的通配符及其說(shuō)明。(3)轉(zhuǎn)義符:應(yīng)為有效的SQLServer字符,沒(méi)有默認(rèn)值,且必須為單個(gè)字符。當(dāng)模式串中含有與通配符相同的字符時(shí),應(yīng)通過(guò)該字符前的轉(zhuǎn)義符指明其為模式串中的一個(gè)匹配字符。使用ESCAPE可指定轉(zhuǎn)義符。(4)NOTLIKE:使用NOTLIKE與LIKE的作用相反。通配符說(shuō)明%代表倒數(shù)_(下畫(huà)線)代表單個(gè)字符[]指定范圍(如[a-f]、[0-9])或集合(如[abcdef])中的任何單個(gè)字符[^]指定不屬于范圍(如
[^a-f]、[^0-9])或集合(如[^abcdef])的任何單個(gè)字符目前二十二頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句【例4.12】查詢xsb表中姓“王”且單名的學(xué)生情況。T-SQL命令如下,執(zhí)行結(jié)果如圖4.9所示。SELECT* FROMxsb WHERE姓名LIKE'王_'目前二十三頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句【例4.13】查詢xsb表中學(xué)號(hào)倒數(shù)第5個(gè)數(shù)字為9,且倒數(shù)第1個(gè)數(shù)在1~5之間的學(xué)生學(xué)號(hào)、姓名及專業(yè)。T-SQL命令如下,執(zhí)行結(jié)果如圖4.10所示。SELECT學(xué)號(hào),姓名,專業(yè) FROMxsb WHERE學(xué)號(hào)LIKE'%9___[1-5]'目前二十四頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句【例4.13】查詢xsb表姓名中倒數(shù)第2個(gè)字為’玉’的學(xué)生學(xué)號(hào)、姓名及專業(yè)。T-SQL命令如下,執(zhí)行結(jié)果如圖4.10所示。SELECT學(xué)號(hào),姓名,專業(yè) FROMxsb WHERE學(xué)號(hào)LIKE‘%玉_’目前二十五頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句3.范圍比較(1)當(dāng)要查詢的條件是某個(gè)值的范圍時(shí),可以使用BETWEEN關(guān)鍵字。BETWEEN關(guān)鍵字指出查詢范圍,格式為:表達(dá)式[NOT]BETWEEN表達(dá)式1AND表達(dá)式2當(dāng)不使用NOT時(shí),若“表達(dá)式”的值在“表達(dá)式1”與“表達(dá)式2”之間(包括這兩個(gè)值),則返回TRUE,否則返回FALSE;當(dāng)使用NOT時(shí),返回值剛好相反?!纠?.14】查詢xsb表中不在1995年出生的學(xué)生情況。T-SQL命令如下,執(zhí)行結(jié)果如圖4.11所示。SELECT學(xué)號(hào),姓名,專業(yè),出生時(shí)間 FROMxsb WHERE出生時(shí)間NOTBETWEEN'1995-1-1'and'1995-12-31'也可使用下列命令:SELECT學(xué)號(hào),姓名,專業(yè),出生時(shí)間 FROMxsb WHEREWHEREyear(出生時(shí)間)!=1995目前二十六頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句圖4.11執(zhí)行結(jié)果目前二十七頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句(2)使用IN關(guān)鍵字可以指定一個(gè)值表,值表中列出所有可能的值,當(dāng)與值表中的任一個(gè)匹配時(shí),即返回TRUE,否則返回FALSE。格式為:表達(dá)式IN(表達(dá)式[,…])【例4.15】
查詢xsb表中專業(yè)為“軟件工程”或“通信工程”學(xué)生情況。T-SQL命令如下:SELECT* FROMxsb WHERE專業(yè)IN('軟件工程','通信工程')下列T-SQL命令等價(jià):SELECT* FROMxsb WHERE專業(yè)='計(jì)算機(jī)'OR專業(yè)='通信工程'目前二十八頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句4.空值比較當(dāng)需要判定一個(gè)表達(dá)式的值是否為空值時(shí),使用ISNULL關(guān)鍵字,格式為:表達(dá)式IS[NOT]NULL當(dāng)不使用NOT時(shí),若表達(dá)式的值為空值,則返回TRUE,否則返回FALSE;當(dāng)使用NOT時(shí),結(jié)果剛好相反?!纠?.16】查詢總學(xué)分尚不定的學(xué)生情況。SELECT* FROMxsb WHERE備注ISNULL目前二十九頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句5.子查詢1)IN子查詢IN子查詢用于進(jìn)行一個(gè)給定值是否在子查詢結(jié)果集中的判斷,格式為:表達(dá)式[NOT]IN(子查詢)當(dāng)表達(dá)式與子查詢的結(jié)果表中的某個(gè)值相等時(shí),IN謂詞返回TRUE,否則返回FALSE;若使用了NOT,則返回的值剛好相反。【例4.17】查詢選修了課程號(hào)為206的課程的學(xué)生情況。T-SQL命令如下:SELECT* FROMxsb WHERE學(xué)號(hào)IN(SELECT學(xué)號(hào)FROMcjbWHERE課程號(hào)='206')本例中,先執(zhí)行子查詢:SELECT學(xué)號(hào)FROMcjbWHERE課程名='206'目前三十頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句【例4.18】查詢未選修離散數(shù)學(xué)的學(xué)生學(xué)號(hào)和姓名。T-SQL命令如下:SELECT學(xué)號(hào),姓名 FROMxsb WHERE學(xué)號(hào)NOTIN (SELECT學(xué)號(hào)
FROMcjbWHERE課程號(hào)
IN(SELECT課程號(hào)
FROMkcbWHERE課程名='離散數(shù)學(xué)'))目前三十一頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句2)比較子查詢這種子查詢可以認(rèn)為是IN子查詢的擴(kuò)展,它使表達(dá)式的值與子查詢的結(jié)果進(jìn)行比較運(yùn)算,格式為:表達(dá)式{比較運(yùn)算符}{ALL|SOME|ANY}(子查詢)其中,ALL、SOME和ANY說(shuō)明對(duì)比較運(yùn)算的限制?!纠?.19】查詢選修了離散數(shù)學(xué)的學(xué)生學(xué)號(hào)和姓名。T-SQL命令如下:SELECT學(xué)號(hào) FROMcjb WHERE課程號(hào)= ( SELECT課程號(hào) FROMkcb WHERE課程名='離散數(shù)學(xué)' );目前三十二頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句【例4.20】查詢比所有計(jì)算機(jī)系的學(xué)生年齡都大的學(xué)生。T-SQL命令如下:SELECT* FROMxsb WHERE 出生時(shí)間<ALL ( SELECT出生時(shí)間 FROMxsb WHERE專業(yè)='計(jì)算機(jī)' )【例4.21】查詢206課程號(hào)成績(jī)不低于101課程號(hào)最低成績(jī)的學(xué)生學(xué)號(hào)。T-SQL命令如下:SELECT學(xué)號(hào)
FROMcjb WHERE 課程號(hào)='206'AND成績(jī)!<ANY ( SELECT成績(jī) FROMcjb WHERE課程號(hào)='101' )目前三十三頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句3)EXISTS子查詢EXISTS謂詞用于測(cè)試子查詢的結(jié)果是否為空表,若子查詢的結(jié)果集不為空,則EXISTS返回TRUE,否則返回FALSE。EXISTS還可與NOT結(jié)合使用,即NOTEXISTS,其返回值與EXISTS剛好相反。格式為:[NOT]EXISTS(子查詢)【例4.22】查詢選修206課程的學(xué)生姓名。T-SQL命令如下:SELECT姓名 FROMxsb WHERE EXISTS ( SELECT* FROMcjb WHERE學(xué)號(hào)=xsb.學(xué)號(hào)AND課程號(hào)='206' )目前三十四頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句【例4.23】查詢選修了全部課程的同學(xué)的姓名。SELECT姓名 FROMxsb WHERENOTEXISTS ( SELECT* FROMkcb WHERENOTEXISTS ( SELECT* FROMcjb WHERE學(xué)號(hào)=xsb.學(xué)號(hào)AND課程號(hào)=kcb.課程號(hào) ) )目前三十五頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.2選擇查詢條件:WHERE子句另外,子查詢還可以用在SELECT語(yǔ)句的其他子句中,如FROM子句。SELECT關(guān)鍵字后面也可以定義子查詢?!纠?.24】從xsb表中查詢所有女學(xué)生的姓名、學(xué)號(hào)及其與“191301”號(hào)學(xué)生的年齡差距。T-SQL命令如下,執(zhí)行結(jié)果如圖4.12所示。SELECT學(xué)號(hào),姓名,YEAR(出生時(shí)間)- YEAR((SELECT出生時(shí)間 FROMxsb WHERE學(xué)號(hào)='191301' ) )AS年齡差距 FROMxsb WHERE性別=0目前三十六頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.3指定查詢對(duì)象:FROM子句1.表或視圖名SELECT語(yǔ)句可查詢的表或視圖,表和視圖可以是一個(gè)或多個(gè),有關(guān)視圖的內(nèi)容將在下一節(jié)中介紹?!纠?.25】查詢“191301”號(hào)學(xué)生的計(jì)算機(jī)基礎(chǔ)課的成績(jī)。T-SQL命令如下:SELECT成績(jī) FROMcjb,kcb WHEREcjb.課程號(hào)=kcb.課程號(hào) AND學(xué)號(hào)='191301' AND課程名='計(jì)算機(jī)基礎(chǔ)'目前三十七頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.3指定查詢對(duì)象:FROM子句【例4.26】查詢選修了與學(xué)號(hào)為191302的同學(xué)所選修的全部課程的同學(xué)的學(xué)號(hào)。分析:本例即要查找這樣的學(xué)號(hào)y,對(duì)所有的課程號(hào)x,若191302號(hào)同學(xué)選修了該課,那么y也選修了該課。T-SQL命令如下:SELECTDISTINCT學(xué)號(hào) FROMcjbASCJ1 WHERENOTEXISTS ( SELECT* FROMcjbASCJ2 WHERECJ2.學(xué)號(hào)='191302'ANDNOTEXISTS ( SELECT* FROMcjbASCJ3 WHERECJ3.學(xué)號(hào)=CJ1.學(xué)號(hào)ANDCJ3.課程號(hào)=CJ2.課程號(hào) ) )目前三十八頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.3指定查詢對(duì)象:FROM子句2.導(dǎo)出表導(dǎo)出表表示由子查詢中SELECT語(yǔ)句的執(zhí)行而返回的表,但必須使用AS關(guān)鍵字為子查詢產(chǎn)生的中間表定義一個(gè)別名。【例4.27】從xsb表中查詢總學(xué)分大于50的男同學(xué)的姓名和學(xué)號(hào)。T-SQL命令如下:SELECT姓名,學(xué)號(hào),總學(xué)分FROM(SELECT姓名,學(xué)號(hào),性別,總學(xué)分FROMxsb WHERE總學(xué)分>=50 )ASstudentWHERE性別=1執(zhí)行結(jié)果如圖4.13所示。目前三十九頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.3指定查詢對(duì)象:FROM子句【例4.28】在xsb表中查詢?cè)?995年1月1日以前出生的學(xué)生的姓名和專業(yè)。T-SQL命令如下,執(zhí)行結(jié)果如圖4.14所示。SELECT,student.speciality FROM(SELECT*FROMxsbWHERE出生時(shí)間<'19950101') ASstudent(num,name,sex,birthday,speciality,score,mem)目前四十頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.4連接1.連接謂詞在SELECT語(yǔ)句的WHERE子句中使用比較運(yùn)算符給出連接條件對(duì)表進(jìn)行連接,稱為連接謂詞表示形式?!纠?.29】查詢pxscj數(shù)據(jù)庫(kù)每個(gè)學(xué)生的情況以及選修的課程情況。USEpxscjGOSELECTxsb.*,cjb.* FROMxsb,cjb WHERExsb.學(xué)號(hào)=cjb.學(xué)號(hào)目前四十一頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.4連接(1)自然連接。它在目標(biāo)列中去除相同的字段名?!纠?.30】自然連接查詢。T-SQL命令如下:SELECTxsb.*,cjb.課程號(hào),cjb.成績(jī) FROMxsb,cjb WHERExsb.學(xué)號(hào)=cjb.學(xué)號(hào)本例所得的結(jié)果表包含xsb的使用字段、課程號(hào)、成績(jī)。若選擇的字段名在各個(gè)表中是唯一的,則可以省略字段名前的表名。如本例的SELECT語(yǔ)句也可寫(xiě)為:SELECTxsb.*,課程號(hào),成績(jī) FROMxsb,cjb WHERExsb.學(xué)號(hào)=cjb.學(xué)號(hào)目前四十二頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.4連接【例4.31】
查詢選修了206課程且成績(jī)?cè)?0分以上的學(xué)生姓名及成績(jī)。T-SQL命令如下,執(zhí)行結(jié)果如圖4.15所示。SELECT姓名,成績(jī) FROMxsb,cjb WHERExsb.學(xué)號(hào)=cjb.學(xué)號(hào)AND課程號(hào)='206'AND成績(jī)>=80目前四十三頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.4連接(2)多表連接。有時(shí),用戶所需要的字段來(lái)自兩個(gè)以上的表,那么就要對(duì)兩個(gè)以上的表進(jìn)行連接,稱之為多表連接。【例4.32】
查詢選修了“計(jì)算機(jī)基礎(chǔ)”課程且成績(jī)?cè)?0分以上的學(xué)生學(xué)號(hào)、姓名、課程名及成績(jī)。T-SQL命令如下,執(zhí)行結(jié)果如圖4.16所示。SELECTxsb.學(xué)號(hào),姓名,課程名,成績(jī) FROMxsb,kcb,cjb WHERExsb.學(xué)號(hào)=cjb.學(xué)號(hào) ANDkcb.課程號(hào)=cjb.課程號(hào) AND課程名='計(jì)算機(jī)基礎(chǔ)' AND成績(jī)>=80目前四十四頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.4連接2.以JOIN關(guān)鍵字指定的連接T-SQL擴(kuò)展了以JOIN關(guān)鍵字指定連接的表示方式,使表的連接運(yùn)算能力有所增強(qiáng)。FROM子句的<連接表>表示將多個(gè)表連接起來(lái)。格式如下:<連接表>::={ <表源><類型><表源>ON<查詢條件> |<表源>CROSSJOIN<表源> |左表源{CROSS|OUTER}APPLY右表源 |[()<連接表>[]]}目前四十五頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.4連接說(shuō)明:(1)<表源>:準(zhǔn)備要連接的表。(2)<類型>:表示連接類型。格式為:<類型>::= [{INNER|{{LEFT|RIGHT|FULL}[OUTER]}}[<連接提示>]]
JOIN其中,INNER表示內(nèi)連接,OUTER表示外連接。(3)ON:用于指定連接條件,<查詢條件>為連接的條件。(4)APPLY運(yùn)算符:使用APPLY運(yùn)算符可以為實(shí)現(xiàn)查詢操作的外部表表達(dá)式返回的每個(gè)行調(diào)用表值函數(shù)。(5)CROSSJOIN:表示交叉連接。目前四十六頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.4連接因此,以JOIN關(guān)鍵字指定的連接有三種類型:內(nèi)連接、外連接、交叉連接。①內(nèi)連接。指定了INNER關(guān)鍵字的連接是內(nèi)連接,內(nèi)連接按照ON所指定的連接條件合并兩個(gè)表,返回滿足條件的行?!纠?.33】
查詢每個(gè)學(xué)生的情況以及選修的課程情況。T-SQL命令如下:SELECT* FROMxsbINNERJOINcjb ONxsb.學(xué)號(hào)=cjb.學(xué)號(hào)執(zhí)行的結(jié)果將包含xsb表和cjb表的所有字段(不去除重復(fù)字段——學(xué)號(hào))?!纠?.34】查詢選修了206課程且成績(jī)?cè)?0分以上的學(xué)生姓名及成績(jī)。T-SQL命令如下:SELECT姓名,成績(jī) FROMxsbJOINcjb ONxsb.學(xué)號(hào)=cjb.學(xué)號(hào)
WHERE課程號(hào)='206'AND成績(jī)>=80目前四十七頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.4連接【例4.35】查詢選修了“計(jì)算機(jī)基礎(chǔ)”課程且成績(jī)?cè)?0分以上的學(xué)生學(xué)號(hào)、姓名、課程名及成績(jī)。T-SQL命令如下:SELECTxsb.學(xué)號(hào),姓名,課程名,成績(jī) FROMxsbJOINcjbJOINkcb ONcjb.課程號(hào)=kcb.課程號(hào)
ONxsb.學(xué)號(hào)=cjb.學(xué)號(hào)
WHERE課程名='計(jì)算機(jī)基礎(chǔ)'AND成績(jī)>=80作為一種特例,可以將一個(gè)表與它自身進(jìn)行連接,稱為自連接。【例4.36】
查詢不同課程成績(jī)相同的學(xué)生的學(xué)號(hào)、課程號(hào)和成績(jī)。T-SQL命令如下:SELECTa.學(xué)號(hào),a.課程號(hào),b.課程號(hào),a.成績(jī) FROMcjbaJOINcjbb ONa.成績(jī)=b.成績(jī)ANDa.學(xué)號(hào)=b.學(xué)號(hào)ANDa.課程號(hào)!=b.課程號(hào)執(zhí)行結(jié)果如圖4.17所示。目前四十八頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.4連接②外連接。指定了OUTER關(guān)鍵字的為外連接,外連接的結(jié)果表不但包含滿足連接條件的行,還包括相應(yīng)表中的所有行。外連接包括以下三種:LEFTOUTERJOIN(左外連接):結(jié)果表中除了包括滿足連接條件的行外,還包括左表的所有行。RIGHTOUTERJOIN(右外連接):結(jié)果表中除了包括滿足連接條件的行外,還包括右表的所有行。FULLOUTERJOIN(完全外連接):結(jié)果表中除了包括滿足連接條件的行外,還包括兩個(gè)表的所有行。目前四十九頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.4連接【例4.37】
查詢所有學(xué)生情況,以及他們選修的課程號(hào)。T-SQL命令如下,執(zhí)行結(jié)果如圖4.18所示。SELECTxsb.*,課程號(hào) FROMxsbLEFTOUTERJOINcjb ONxsb.學(xué)號(hào)=cjb.學(xué)號(hào)目前五十頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.4連接【例4.38】
查詢被選修了的課程的選修情況和所有開(kāi)設(shè)的課程名。SELECTcjb.*,課程名 FROMcjbRIGHTJOINkcb ONcjb.課程號(hào)=kcb.課程號(hào)目前五十一頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.4連接③交叉連接。交叉連接實(shí)際上是將兩個(gè)表進(jìn)行笛卡兒積運(yùn)算,結(jié)果表是由第一個(gè)表的每一行與第二個(gè)表的每一行拼接后形成的表,因此結(jié)果表的行數(shù)等于兩個(gè)表的行數(shù)之積?!纠?.39】列出學(xué)生所有可能的選課情況。T-SQL命令如下,執(zhí)行結(jié)果如圖4.19所示。SELECT學(xué)號(hào),姓名,課程號(hào),課程名 FROMxsbCROSSJOINkcb目前五十二頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.5指定查詢結(jié)果分組方法:GROUPBY子句這里介紹ISO標(biāo)準(zhǔn)的GROUPBY子句。語(yǔ)法格式如下:GROUPBY{ <列表達(dá)式> |ROLLUP(<復(fù)合元素列表>) |CUBE(<復(fù)合元素列表>) |GROUPINGSETS(<分組集合項(xiàng)列表>)}目前五十三頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.5指定查詢結(jié)果分組方法:GROUPBY子句【例4.40】
在pxscj數(shù)據(jù)庫(kù)xsb表中分別用GROUPBYROLLUP、GROUPBYCUBE和GROUPBYGROUPINGSETS對(duì)(專業(yè),性別)產(chǎn)生一個(gè)結(jié)果集。(1)采用GROUPBYROLLUP。SELECT專業(yè),性別,COUNT(*)AS'人數(shù)' FROMxsb GROUPBYROLLUP(專業(yè),性別)(2)采用GROUPBYCUBE。SELECT專業(yè),性別,COUNT(*)AS'人數(shù)' FROMxsb GROUPBYCUBE(專業(yè),性別)目前五十四頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.5指定查詢結(jié)果分組方法:GROUPBY子句(3)采用GROUPBYGROUPINGSETS。執(zhí)行結(jié)果如圖4.20所示。SELECT專業(yè),性別,COUNT(*)AS'人數(shù)' FROMxsb GROUPBYGROUPINGSETS(專業(yè),性別)
(a)(b)(c)
圖4.20執(zhí)行結(jié)果
目前五十五頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.6指定查詢結(jié)果分組后篩選條件:HAVING子句使用GROUPBY子句和聚合函數(shù)對(duì)數(shù)據(jù)進(jìn)行分組后,還可以使用HAVING子句對(duì)分組數(shù)據(jù)做進(jìn)一步的篩選。格式為:[HAVING<查詢條件>]其中,<查詢條件>與WHERE子句的查詢條件類似,不過(guò)HAVING子句中可以使用聚合函數(shù),而WHERE子句中不可以?!纠?.41】
查詢平均成績(jī)?cè)?5分以上的學(xué)生的學(xué)號(hào)和平均成績(jī)。T-SQL命令如下,執(zhí)行結(jié)果如圖4.21所示。SELECT學(xué)號(hào),AVG(成績(jī))AS'平均成績(jī)' FROMcjb GROUPBY學(xué)號(hào) HAVINGAVG(成績(jī))>=85目前五十六頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.6指定查詢結(jié)果分組后篩選條件:HAVING子句【例4.42】
查詢選修課程超過(guò)2門且成績(jī)都在80分以上的學(xué)生的學(xué)號(hào)。T-SQL命令如下:SELECT學(xué)號(hào)
FROMcjb WHERE成績(jī)>=80 GROUPBY學(xué)號(hào)
HAVINGCOUNT(*)>2目前五十七頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.6指定查詢結(jié)果分組后篩選條件:HAVING子句【例4.43】
查詢通信工程專業(yè)平均成績(jī)?cè)?5分以上的學(xué)生的學(xué)號(hào)和平均成績(jī)。T-SQL命令如下,執(zhí)行結(jié)果如圖4.22所示。SELECT學(xué)號(hào),AVG(成績(jī))AS'平均成績(jī)' FROMcjb WHERE學(xué)號(hào)IN ( SELECT學(xué)號(hào) FROMxsb WHERE專業(yè)='通信工程' ) GROUPBY學(xué)號(hào)
HAVINGAVG(成績(jī))>=85目前五十八頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.7指定查詢結(jié)果排序順序:ORDERBY子句在應(yīng)用中經(jīng)常要對(duì)查詢的結(jié)果排序輸出,如將學(xué)生成績(jī)由高到低排序。在SELECT語(yǔ)句中,使用ORDERBY子句對(duì)查詢結(jié)果進(jìn)行排序。格式為:[ORDERBY{ 排序表達(dá)式 [COLLATE排序名] [ASC|DESC]}]目前五十九頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.7指定查詢結(jié)果排序順序:ORDERBY子句【例4.44】
將通信工程專業(yè)的學(xué)生按出生時(shí)間先后順序排序。T-SQL命令如下,執(zhí)行結(jié)果如圖4.23所示。SELECT* FROMxsb WHERE專業(yè)='通信工程' ORDERBY出生時(shí)間目前六十頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.7指定查詢結(jié)果排序順序:ORDERBY子句【例4.45】
將計(jì)算機(jī)專業(yè)學(xué)生的“計(jì)算機(jī)基礎(chǔ)”課程成績(jī)按降序排列。T-SQL命令如下,執(zhí)行結(jié)果如圖4.24所示。SELECT姓名,課程名,成績(jī) FROMxsb,kcb,cjb WHERExsb.學(xué)號(hào)=cjb.學(xué)號(hào)
ANDcjb.課程號(hào)=kcb.課程號(hào)
AND課程名='計(jì)算機(jī)基礎(chǔ)' AND專業(yè)='計(jì)算機(jī)'目前六十一頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.8SELECT語(yǔ)句的其他語(yǔ)法1.INTO使用INTO子句可以將SELECT查詢所得的結(jié)果保存到一個(gè)新建的表中。INTO子句的格式為:[INTO新表]其中,“新表”是要?jiǎng)?chuàng)建的新表名?!纠?.46】
由xsb表創(chuàng)建“計(jì)算機(jī)學(xué)生”表,包括學(xué)號(hào)和姓名。T-SQL命令如下:SELECT學(xué)號(hào),姓名 INTO計(jì)算機(jī)學(xué)生 FROMxsb WHERE專業(yè)='計(jì)算機(jī)'目前六十二頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.8SELECT語(yǔ)句的其他語(yǔ)法同樣再創(chuàng)建一個(gè)“通信工程學(xué)生”表。完成后,刷新表后的對(duì)象資源管理器如圖4.25所示。目前六十三頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.8SELECT語(yǔ)句的其他語(yǔ)法2.UNION使用UNION子句可以將兩個(gè)或多個(gè)SELECT查詢的結(jié)果合并成一個(gè)結(jié)果集,其格式為:{<查詢規(guī)范>|(<查詢表達(dá)式>)} UNION[ALL]<查詢規(guī)范>|(<查詢表達(dá)式>) [UNION[ALL]<查詢規(guī)范>|(<查詢表達(dá)式>)[…]]其中,<查詢規(guī)范>和<查詢表達(dá)式>都是SELECT查詢語(yǔ)句。使用UNION組合兩個(gè)查詢的結(jié)果集的基本規(guī)則是:(1)所有查詢中的列數(shù)和列的順序必須相同。(2)數(shù)據(jù)類型必須兼容。目前六十四頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.8SELECT語(yǔ)句的其他語(yǔ)法【例4.47】
在“計(jì)算機(jī)學(xué)生”表和“通信工程學(xué)生”表中查詢學(xué)號(hào)為191301和學(xué)號(hào)為221301的兩位同學(xué)的姓名。T-SQL命令如下:SELECT* FROM計(jì)算機(jī)學(xué)生 WHERE學(xué)號(hào)='191301'UNIONALLSELECT* FROM通信工程學(xué)生 WHERE學(xué)號(hào)='221301'執(zhí)行結(jié)果如圖4.26所示。目前六十五頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.8SELECT語(yǔ)句的其他語(yǔ)法3.EXCEPT和INTERSECTEXCEPT和INTERSECT用于比較兩個(gè)查詢的結(jié)果,返回非重復(fù)值。語(yǔ)法格式如下:{<查詢規(guī)范>|(<查詢表達(dá)式>)}{EXCEPT|INTERSECT}{<查詢規(guī)范>|(<查詢表達(dá)式>)}其中,<查詢規(guī)范>和<查詢表達(dá)式>都是SELECT查詢語(yǔ)句?!纠?.48】查詢計(jì)算機(jī)專業(yè)女學(xué)生的信息。T-SQL命令如下:SELECT*FROMxsbWHERE專業(yè)='計(jì)算機(jī)'EXCEPTSELECT*FROMxsbWHERE性別=1執(zhí)行結(jié)果如圖4.27所示。目前六十六頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.8SELECT語(yǔ)句的其他語(yǔ)法【例4.49】
查詢總學(xué)分大于42的男學(xué)生信息。T-SQL命令如下:SELECT*FROMxsbWHERE總學(xué)分>42INTERSECTSELECT*FROMxsbWHERE性別=1目前六十七頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.8SELECT語(yǔ)句的其他語(yǔ)法4.CTE在SELECT語(yǔ)句的最前面可以使用一條WITH子句來(lái)指定臨時(shí)結(jié)果集,語(yǔ)法格式如下:[WITH<公用表表達(dá)式>[,...]]SELECT......其中:<公用表表達(dá)式>::=
表達(dá)式名
[(列名[,...])] AS
(CTE查詢定義)目前六十八頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.1.8SELECT語(yǔ)句的其他語(yǔ)法【例4.50】
使用CTE從cjb表中查詢選了101課程的學(xué)生學(xué)號(hào)、成績(jī),并定義新的列名為number、point。再使用SELECT語(yǔ)句從CTE和xsb中查詢姓名為“王林”的學(xué)生學(xué)號(hào)和成績(jī)情況。T-SQL命令如下,執(zhí)行結(jié)果如圖4.28所示。USEpxscjGOWITHcte_stu(number,point)AS(SELECT學(xué)號(hào),成績(jī)FROMcjbWHERE課程號(hào)='101')SELECTnumber,point FROMcte_stu,xsb WHERExsb.姓名='王林' ANDxsb.學(xué)號(hào)=cte_stu.number目前六十九頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.2視
圖4.2.1視圖概念視圖一經(jīng)定義以后,就可以像表一樣被查詢、修改、刪除和更新。使用視圖有下列優(yōu)點(diǎn):(1)為用戶集中數(shù)據(jù),簡(jiǎn)化用戶的數(shù)據(jù)查詢和處理。有時(shí),用戶所需要的數(shù)據(jù)分散在多個(gè)表中,定義視圖可將它們集中在一起,從而方便用戶進(jìn)行數(shù)據(jù)查詢和處理。(2)屏蔽數(shù)據(jù)庫(kù)的復(fù)雜性。用戶不必了解復(fù)雜的數(shù)據(jù)庫(kù)中的表結(jié)構(gòu),并且數(shù)據(jù)庫(kù)表的更改也不影響用戶對(duì)數(shù)據(jù)庫(kù)的使用。(3)簡(jiǎn)化用戶權(quán)限的管理。只需授予用戶使用視圖的權(quán)限,而不必指定用戶只能使用表的特定列,也增加了安全性。(4)便于數(shù)據(jù)共享。各用戶不必都定義和存儲(chǔ)自己所需的數(shù)據(jù),而可共享數(shù)據(jù)庫(kù)的數(shù)據(jù),這樣,同樣的數(shù)據(jù)只需存儲(chǔ)一次。(5)可以重新組織數(shù)據(jù)以便輸出到其他應(yīng)用程序中。目前七十頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.2.2創(chuàng)建視圖1.通過(guò)界面創(chuàng)建視圖下面以在一個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建視圖為例說(shuō)明在“SSMS”中創(chuàng)建視圖的過(guò)程。【例4.51】
在pxscj數(shù)據(jù)庫(kù)學(xué)生表(xsb)中創(chuàng)建名為cxs視圖,視圖中僅僅包含計(jì)算機(jī)專業(yè)學(xué)生。1)創(chuàng)建名cxs視圖步驟如下:(1)在“對(duì)象資源管理器”中展開(kāi)“數(shù)據(jù)庫(kù)”→“pxscj”,選擇其中的“視圖”項(xiàng),右擊鼠標(biāo),在彈出的快捷菜單上選擇“新建視圖”菜單項(xiàng)。(2)在隨后出現(xiàn)的“添加表”對(duì)話框中,添加視圖所需要關(guān)聯(lián)的對(duì)象。這里在“表”選項(xiàng)卡中選擇“xsb”表,單擊“添加”按鈕,單擊“關(guān)閉”按鈕。目前七十一頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.2.2創(chuàng)建視圖(3)在窗口下部“輸出”欄中去除創(chuàng)建的視圖中不所需的字段,在“排序類型”欄中指定列的排序方式,在“篩選器”欄中指定創(chuàng)建視圖的規(guī)則。本例在“專業(yè)”字段的“篩選器”欄中填寫(xiě)“計(jì)算機(jī)”,如圖4.29所示。(4)完成后,單擊面板上的“保存”按鈕,在“保存視圖”對(duì)話框中輸入視圖名“cxs”,并單擊“確定”按鈕,便完成了視圖的創(chuàng)建。目前七十二頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.2.2創(chuàng)建視圖2)顯示cxs視圖刷新pxscj數(shù)據(jù)庫(kù)下的視圖,展開(kāi)“數(shù)據(jù)庫(kù)”→“pxscj”→“視圖”,選擇“dbo.cxs”,右擊鼠標(biāo),在彈出的快捷菜單中選擇“設(shè)計(jì)”菜單項(xiàng),可以查看并修改視圖結(jié)構(gòu),選擇“編輯前200行”菜單項(xiàng),將可查看視圖數(shù)據(jù),如圖4.30所示。目前七十三頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.2.2創(chuàng)建視圖3)視圖的好處創(chuàng)建視圖可以向最終用戶隱藏復(fù)雜的表連接,簡(jiǎn)化了用戶的SQL程序設(shè)計(jì)。通過(guò)在創(chuàng)建視圖時(shí)指定限制條件和指定列來(lái)限制用戶對(duì)基本表的訪問(wèn)。例如,若限定某用戶只能查詢視圖cxs,實(shí)際上就是限制了它只能訪問(wèn)xsb表的專業(yè)字段值為“計(jì)算機(jī)”的行。目前七十四頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.2.2創(chuàng)建視圖2.通過(guò)命令創(chuàng)建視圖T-SQL中用于創(chuàng)建視圖的語(yǔ)句是CREATEVIEW語(yǔ)句,其格式為:CREATEVIEW視圖名[WITH<視圖屬性>[,...]] ASSELECT語(yǔ)句[;][WITHCHECKOPTION]1)語(yǔ)句主體主體結(jié)構(gòu)說(shuō)明如下。(1)架構(gòu)名:數(shù)據(jù)庫(kù)架構(gòu)名。(2)列名:視圖中包含的列,可以有多個(gè)列名。若使用與源表或視圖相同的列名,則不必給出列名。(3)WITH<視圖屬性>:指出視圖的屬性。(4)SELECT語(yǔ)句:用來(lái)創(chuàng)建視圖的語(yǔ)句,源表可以是基本表,也可以是視圖。(5)WITHCHECKOPTION:指出在視圖上所進(jìn)行的修改都要符合SELECT語(yǔ)句所指定的限制條件,這樣可以確保數(shù)據(jù)修改后,仍可通過(guò)視圖看到修改的數(shù)據(jù)。目前七十五頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.2.2創(chuàng)建視圖2)<視圖屬性>定義<視圖屬性>定義的具體格式如下:<視圖屬性>::={ [ENCRYPTION] [SCHEMABINDING] [VIEW_METADATA]}(1)ENCRYPTION:在系統(tǒng)表syscomments中存儲(chǔ)CREATEVIEW語(yǔ)句時(shí)進(jìn)行加密。(2)SCHEMABINDING:將視圖與其所依賴的表或視圖結(jié)構(gòu)相關(guān)聯(lián)。(3)VIEW_METADATA:當(dāng)引用視圖的瀏覽模式的元數(shù)據(jù)時(shí),向DBLIB、ODBC或OLEDBAPI返回有關(guān)視圖的元數(shù)據(jù)信息,而不返回基表的元數(shù)據(jù)信息。目前七十六頁(yè)\總數(shù)八十五頁(yè)\編于十六點(diǎn)4.2.2創(chuàng)建視圖【例4.52】
創(chuàng)建ccj視圖,包括計(jì)算機(jī)專業(yè)各學(xué)生的學(xué)號(hào)、其選修的課程號(hào)及成績(jī)。要保證對(duì)該視圖的修改都符合專業(yè)為計(jì)算機(jī)的這個(gè)條件。T-SQL命令如下:CREATEVIEWccjWITHENCRYPTION AS SELECTxsb.學(xué)號(hào),課程號(hào),成績(jī) FROMxsb,cjb WHERExsb.
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 飲水安全協(xié)議合同
- 各種合同協(xié)議書(shū)模板下載
- 砍樹(shù)付款協(xié)議合同
- 課程退費(fèi)協(xié)議合同
- 噴漆外發(fā)加工合同協(xié)議書(shū)
- 合同加附屬協(xié)議
- 共合協(xié)議合同
- 水窖合同協(xié)議
- 快艇維修協(xié)議合同
- 后勤維修協(xié)議合同
- 電商平臺(tái)服務(wù)協(xié)議、交易規(guī)則
- 2025年服務(wù)器行業(yè)市場(chǎng)規(guī)模及主要企業(yè)市占率分析報(bào)告(智研咨詢發(fā)布)
- 2025年中國(guó)甲魚(yú)行業(yè)市場(chǎng)全景評(píng)估及發(fā)展戰(zhàn)略規(guī)劃報(bào)告
- 2025年中國(guó)汽車道路救援行業(yè)發(fā)展?jié)摿Ψ治黾巴顿Y方向研究報(bào)告
- 學(xué)校食堂安全風(fēng)險(xiǎn)管控清單
- 2025屆遼寧省名校聯(lián)盟高三一模地理試題(原卷版+解析版)
- 國(guó)家之間的合作發(fā)展-以“一帶一路”為例 課件 2024-2025學(xué)年高二下學(xué)期 地理 魯教版(2019)選擇性必修2
- Premiere視頻編輯案例教程(PremierePro2021)課件 第 6 章 字幕與字幕特效
- ESC急慢性心力衰竭診斷和治療指南
- 周日值班制度
- 2025保安證考試模擬試卷及答案
評(píng)論
0/150
提交評(píng)論