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

下載本文檔

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

文檔簡介

第4章

數(shù)據(jù)庫查詢和視圖4.2數(shù)據(jù)庫查詢4.3視圖4.2數(shù)據(jù)庫查詢4.2.1選擇列1.選擇所有列使用“*”表示選擇一個表或視圖中的所有列?!纠?.1】

查詢PXSCJ數(shù)據(jù)庫中XSB表的所有數(shù)據(jù)。USEPXSCJGOSELECT*FROMXSBGO4.2.1選擇列2.選擇一個表中指定的列使用SELECT語句選擇一個表中的某些列,各列名之間要以逗號分隔?!纠?.2】查詢PXSCJ數(shù)據(jù)庫的XSB表中各個同學(xué)的姓名、專業(yè)和總學(xué)分。USEPXSCJGOSELECT姓名,專業(yè),總學(xué)分FROMXSBGO4.2.1選擇列【例4.3】

查詢XSB表中計算機專業(yè)同學(xué)的學(xué)號、姓名和總學(xué)分,查詢XSB表中所有列。SELECT學(xué)號,姓名,總學(xué)分 FROMXSB WHERE專業(yè)

='計算機'GOSELECT* FROMXSB執(zhí)行后在結(jié)果窗口中將分別列出兩個查詢語句的結(jié)果,如圖所示。4.2.1選擇列3.定義列別名【例4.4】

查詢XSB表中計算機系同學(xué)的學(xué)號、姓名和總學(xué)分,結(jié)果中各列的標(biāo)題分別指定為number、name和mark。代碼如下,執(zhí)行結(jié)果如圖所示。USEPXSCJGOSELECT學(xué)號

ASnumber,姓名

ASname,總學(xué)分

ASmark FROMXSB WHERE專業(yè)='計算機'4.2.1選擇列更改查詢結(jié)果中的列標(biāo)題也可以使用column_alias=expression的形式。例如,SELECTnumber=學(xué)號,name=姓名,mark=總學(xué)分 FROMXSB WHERE專業(yè)='計算機'該語句的執(zhí)行結(jié)果與上例的結(jié)果完全相同。當(dāng)自定義的列標(biāo)題中含有空格時,必須使用引號將標(biāo)題括起來。例如,SELECT'Studentnumber'=學(xué)號,姓名

AS'Studentname',mark=總學(xué)分 FROMXSB WHERE專業(yè)='計算機'4.2.1選擇列4.替換查詢結(jié)果中的數(shù)據(jù)要替換查詢結(jié)果中的數(shù)據(jù),則要使用查詢中的CASE表達式,格式為CASE WHEN條件1THEN表達式1 WHEN條件2THEN表達式2…… ELSE表達式END4.2.1選擇列【例4.5】

查詢XSB表中計算機系各同學(xué)的學(xué)號、姓名和總學(xué)分,對其總學(xué)分按以下規(guī)則進行替換:若總學(xué)分為空值,則替換為“尚未選課”;若總學(xué)分小于50,則替換為“不及格”;若總學(xué)分在50與52之間,則替換為“合格”;若總學(xué)分大于52,則替換為“優(yōu)秀”。列標(biāo)題更改為“等級”。代碼如下,執(zhí)行結(jié)果如圖所示。USEPXSCJGOSELECT學(xué)號,姓名,等級= CASE WHEN總學(xué)分

ISNULLTHEN'尚未選課' WHEN總學(xué)分

<50THEN'不及格' WHEN總學(xué)分

>=50and總學(xué)分<=52THEN'合格' ELSE'優(yōu)秀' END FROMXSB WHERE專業(yè)='計算機'GO4.2.1選擇列5.計算列值【例4.6-1】按120分計算成績并顯示學(xué)號為081101的學(xué)生的成績情況。代碼如下,執(zhí)行結(jié)果如圖所示。USEPXSCJGOSELECT學(xué)號,課程號,成績120=成績*1.20 FROMCJB WHERE學(xué)號='081101'【例4.6-2】顯示全體學(xué)生的學(xué)號和年齡。SELECT學(xué)號,YEAR(GETDATE())-YEAR(出生時間)AS年齡FROMXSB4.2.1選擇列6.消除結(jié)果集中的重復(fù)行關(guān)鍵字DISTINCT的含義是,對結(jié)果集中的重復(fù)行只選擇一個,保證行的唯一性?!纠?.7】

對PXSCJ數(shù)據(jù)庫的XSB表只選擇專業(yè)和總學(xué)分,消除結(jié)果集中的重復(fù)行。代碼如下,執(zhí)行結(jié)果如圖所示。USEPXSCJGOSELECTDISTINCT專業(yè),總學(xué)分 FROMXSB4.2.1選擇列7.限制結(jié)果集返回行數(shù)如果SELECT語句返回的結(jié)果集的行數(shù)非常多,那么可以使用TOP選項限制其返回的行數(shù)。【例4.8-1】

對PXSCJ數(shù)據(jù)庫的XSB表選擇姓名、專業(yè)和總學(xué)分,返回結(jié)果集的前6行。SELECTTOP6姓名,專業(yè),總學(xué)分 FROMXSB【例4.8-2】

對PXSCJ數(shù)據(jù)庫的XSB表選擇姓名、專業(yè)和總學(xué)分,返回結(jié)果集的前百分之五十。SELECTTOP50PERCENT姓名,專業(yè),總學(xué)分 FROMXSB4.2.1選擇列8.聚合函數(shù)(1)SUM和AVGSUM和AVG分別用于求表達式中所有值項的總和與平均值【例4.9】

求選修101課程的學(xué)生的平均成績。SELECTAVG(成績)AS'課程101平均成績' FROMCJB WHERE課程號

='101'【例4.10】

求學(xué)號為081101的同學(xué)所學(xué)課程的總成績。SELECTSUM(成績)AS'課程總成績' FROMCJB WHERE學(xué)號

='081101';4.2.1選擇列(2)MAX和MINMAX和MIN分別用于求表達式中所有值項的最大值與最小值,【例4.11】求選修101課程的學(xué)生的最高分和最低分。語句如下,執(zhí)行結(jié)果如圖所示。SELECTMAX(成績)AS'課程101的最高分',MIN(成績)AS'課程101的最低分' FROMCJB WHERE課程號

='101'4.2.1選擇列(3)COUNTCOUNT用于統(tǒng)計組中滿足條件的行數(shù)。(忽略null值)【例4.12】

求學(xué)生的總數(shù)。SELECTCOUNT(*)AS'學(xué)生總數(shù)' FROMXSB【例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;【例4.15】

求選修了課程的學(xué)生總數(shù)。SELECTCOUNT(DISTINCT學(xué)號) FROMCJB4.2.2FROM子句1.表名或視圖名From子句后可以指定一個或多個表名或視圖名作為查詢對象?!纠?.16】查找表KCB中101號課程的開課學(xué)期。SELECT開課學(xué)期 FROMKCB WHERE課程號='101'【例4.17】查找081101號學(xué)生計算機基礎(chǔ)課的成績。SELECT成績 FROMCJB,KCB WHERECJB.課程號=KCB.課程號 AND學(xué)號='081101' AND課程名='計算機基礎(chǔ)'4.2.3WHERE子句1.表達式比較比較運算符用于比較兩個表達式值,共有9個,分別是

=(等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、<>(不等于)、!=(不等于)、!<(不小于)、!>(不大于)?!纠?.20】

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

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

查詢XSB表中通信工程專業(yè)總學(xué)分大于等于42的同學(xué)的情況。USEPXSCJGOSELECT* FROMXSB WHERE專業(yè)='通信工程'AND總學(xué)分

>=424.2.3WHERE子句2.模式匹配LIKE謂詞用于指出一個字符串是否與指定的字符串相匹配,返回邏輯值TRUE或FALSE?!纠?.23】

查詢XSB表中姓“王”且單名的學(xué)生情況。SELECT* FROMXSB WHERE姓名

LIKE'王_'4.2.3WHERE子句【例4.24】

查詢XSB表中學(xué)號倒數(shù)第3個數(shù)字為1,且倒數(shù)第1個數(shù)在1~5之間的學(xué)生學(xué)號、姓名及專業(yè)。SELECT學(xué)號,姓名,專業(yè) FROMXSB WHERE學(xué)號LIKE'%1_[12345]'若倒數(shù)第1個數(shù)不在1~5之間,則SELECT學(xué)號,姓名,專業(yè) FROMXSB WHERE學(xué)號LIKE'%1_[^12345]'如果需要查找一個通配符,則必須使用一個轉(zhuǎn)義字符?!纠?.25】查詢XSB表中學(xué)號包含下劃線的學(xué)生學(xué)號和姓名。SELECT學(xué)號,姓名 FROMXSB WHERE學(xué)號LIKE'%#_%'ESCAPE'#‘思考此題目其他解法。提示:使用[]SELECT學(xué)號,姓名

FROMXSB WHERE學(xué)號LIKE'%[_]%'4.2.3WHERE子句3.范圍比較用于范圍比較的關(guān)鍵字有兩個:BETWEEN和IN。當(dāng)要查詢的條件是某個值的范圍時,可以使用BETWEEN關(guān)鍵字。BETWEEN關(guān)鍵字指出查詢范圍,格式為:expression[NOT]BETWEENexpression1ANDexpression2使用IN關(guān)鍵字可以指定一個值表,值表中列出所有可能的值,當(dāng)與值表中的任一個匹配時,即返回TRUE,否則返回FALSE。使用IN關(guān)鍵字指定值表的格式為:expressionIN(expression[,…n])4.2.3WHERE子句【例4.26】查詢XSB表中不在1989年出生的學(xué)生情況。SELECT學(xué)號,姓名,專業(yè),出生時間 FROMXSB WHERE出生時間

NOTBETWEEN'1989-1-1'and'1989-12-31‘【例4.27】

查詢XSB表中專業(yè)為“計算機”、“通信工程”或“無線電”的學(xué)生情況。SELECT* FROMXSB WHERE專業(yè)

IN('計算機','通信工程','無線電')該語句與下列語句等價:SELECT* FROMXSB WHERE專業(yè)='計算機'or專業(yè)='通信工程'or專業(yè)='無線電'4.2.3WHERE子句4.空值比較當(dāng)需要判定一個表達式的值是否為空值時,使用ISNULL關(guān)鍵字?!纠?.28-1】查詢總學(xué)分尚不定的學(xué)生情況。SELECT* FROMXSB WHERE總學(xué)分

ISNULL【例4.28-2】查詢總學(xué)分確定的學(xué)生情況。SELECT* FROMXSB WHERE總學(xué)分

ISNOTNULL4.2.4GROUPBY子句【例4.29】

將PXSCJ數(shù)據(jù)庫中各專業(yè)輸出。代碼如下,執(zhí)行結(jié)果如圖所示。SELECT專業(yè) FROMXSB GROUPBY專業(yè)【例4.30】

求各專業(yè)的學(xué)生數(shù)。代碼如下,執(zhí)行結(jié)果如圖所示。SELECT專業(yè),COUNT(*)AS'學(xué)生數(shù)' FROMXSB GROUPBY專業(yè)

4.2.4GROUPBY子句【例4.31】

求被選修的各門課程的平均成績和選修該課程的人數(shù)。SELECT課程號,AVG(成績)AS'平均成績',COUNT(學(xué)號)AS'選修人數(shù)' FROMCJB GROUPBY課程號4.2.5HAVING子句例如,查找PXSCJ數(shù)據(jù)庫中平均成績在85分以上的學(xué)生,就是在CJB表上按學(xué)號分組后篩選出符合平均成績大于等于85的學(xué)生。【例4.32】

查找平均成績在85分以上的學(xué)生的學(xué)號和平均成績。執(zhí)行結(jié)果如圖所示。USEPXSCJGOSELECT學(xué)號,AVG(成績)AS'平均成績' FROMCJB GROUPBY學(xué)號 HAVINGAVG(成績)>=854.2.6ORDERBY子句在應(yīng)用中經(jīng)常要對查詢的結(jié)果排序輸出,如將學(xué)生成績由高到低排序。在SELECT語句中,使用ORDERBY子句對查詢結(jié)果進行排序?!纠?.35】

將通信工程專業(yè)的學(xué)生按出生時間先后順序排序。SELECT* FROMXSB WHERE專業(yè)='通信工程' ORDERBY出生時間4.2.6ORDERBY子句【例4.36】

將成績表按學(xué)號升序排列輸出,在學(xué)號相同的情況下按課程號的降序排列。select*fromcjborderby學(xué)號,課程號desc關(guān)于ORDERBY子句,有幾點需要注意:(1)ORDERBY子句與其他子句同時存在時,必須放在后面;(2)對NTEXTTEXTIMAGE類型的字段,不能使用;(3)SQLServer中空值按最低值處理;(4)ORDERBY只影響顯示結(jié)果,不改變物理表中記錄的位置;(5)ASC是ORDERBY默認關(guān)鍵字。4.2.7子查詢1.IN子查詢IN子查詢用于進行一個給定值是否在子查詢結(jié)果集中的判斷?!纠?.39】查找選修了課程號為206的課程的學(xué)生情況。SELECT* FROMXSB WHERE學(xué)號

IN (SELECT學(xué)號 FROMCJB WHERE課程號

='206')4.2.7子查詢2.比較子查詢這種子查詢使表達式的值與子查詢的結(jié)果進行比較運算,格式為expression{<|<=|=|>|>=|!=|<>|!<|!>}{ALL|SOME|ANY}(subquery)其中:ALL當(dāng)且僅當(dāng)s與一元關(guān)系R中的每個值都滿足θ關(guān)系時,sθALLR為真;

θ是上述比較運算符之一。ANY

當(dāng)且僅當(dāng)s與一元關(guān)系R中的至少一個值滿足θ關(guān)系時,sθANYR為真。ALL和ANY運算符都可以通過在整個表達式前面加上NOT來求反,就像其他布爾值的表達式一樣。例如:s<=ALLR與NOTs>ANYR含義相同。4.2.7子查詢【例4.41】查找選修了離散數(shù)學(xué)的學(xué)生學(xué)號。SELECT學(xué)號 FROMCJB WHERE課程號

= ( SELECT課程號 FROMKCB WHERE課程名

='離散數(shù)學(xué)' );4.2.7子查詢【例4.42】

查找比所有計算機系的學(xué)生年齡都大的學(xué)生。SELECT* FROMXSB WHERE 出生時間

<ALL ( SELECT出生時間 FROMXSB WHERE專業(yè)='計算機' )4.2.8連接1.連接謂詞可以在SELECT語句的WHERE子句中使用比較運算符給出連接條件對表進行連接,將這種表示形式稱為連接謂詞表示形式?!纠?.46】查找PXSCJ數(shù)據(jù)庫每個學(xué)生的情況以及選修的課程情況。USEPXSCJGOSELECTXSB.*,CJB.* FROMXSB,CJB WHEREXSB.學(xué)號

=CJB.學(xué)號4.2.8連接【例4.47】自然連接查詢。SELECTXSB.*,CJB.課程號,CJB.成績 FROMXSB,CJB WHEREXSB.學(xué)號=CJB.學(xué)號若選擇的字段名在各個表中是唯一的,則可以省略字段名前的表名。例如,本例的SELECT語句也可寫為:SELECTXSB.*,課程號,成績 FROMXSB,CJB WHEREXSB.學(xué)號

=CJB.學(xué)號4.2.8連接【例4.48】查找選修了206號課程且成績在80分以上的學(xué)生姓名及成績。代碼如下,執(zhí)行結(jié)果如圖所示。SELECT姓名,成績 FROMXSB,CJB WHEREXSB.學(xué)號

=CJB.學(xué)號

AND課程號

='206'AND成績

>=804.2.8連接【例4.49】

查找選修了“計算機基礎(chǔ)”課程且成績在80分以上的學(xué)生學(xué)號、姓名、課程名及成績。代碼如下。SELECTXSB.學(xué)號,姓名,課程名,成績 FROMXSB,KCB,CJB WHEREXSB.學(xué)號

=CJB.學(xué)號 ANDKCB.課程號

=CJB.課程號 AND課程名

='計算機基礎(chǔ)' AND成績

>=80思考:如何用連接方式改寫例4.41?4.2.8連接2.以JOIN關(guān)鍵字指定的連接T-SQL擴展了以JOIN關(guān)鍵字指定連接的表示方式,使表的連接運算能力有了增強。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.8連接(1)內(nèi)連接。指定了INNER關(guān)鍵字的連接是內(nèi)連接,內(nèi)連接按照ON所指定的連接條件合并兩個表,返回滿足條件的行?!纠?.50】

查找PXSCJ數(shù)據(jù)庫每個學(xué)生的情況以及選修的課程情況。SELECT* FROMXSBINNERJOINCJB ONXSB.學(xué)號

=CJB.學(xué)號【例4.51】

用FROM子句的JOIN關(guān)鍵字表達下列查詢:查找選修了206號課程且成績在80分以上的學(xué)生姓名及成績。代碼如下,執(zhí)行結(jié)果如圖。SELECT姓名,成績 FROMXSBJOINCJB ONXSB.學(xué)號

=CJB.學(xué)號

WHERE課程號

='206'AND成績>=804.2.8連接【例4.52】

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

=KCB.課程號

ONXSB.學(xué)號

=CJB.學(xué)號

WHERE課程名='計算機基礎(chǔ)'AND成績>=80另一種寫法:SELECT XSB.學(xué)號,姓名,課程名,成績

FROM(XSBJOINCJBONXSB.學(xué)號=CJB.學(xué)號)joinkcb ONCJB.課程號=KCB.課程號4.2.8連接作為一種特例,可以將一個表與它自身進行連接,稱為自連接。使用自連接時需為表指定別名,對列的引用均要用別名限定?!纠?.53】

查找不同課程成績相同的學(xué)生的學(xué)號、課程號和成績。SELECTa.學(xué)號,a.課程號,b.課程號,a.成績 FROMCJBaJOINCJBb ONa.成績=b.成績

ANDa.學(xué)號=b.學(xué)號

ANDa.課程號!=b.課程號4.2.8連接(2)外連接。指定了OUTER關(guān)鍵字的為外連接,外連接的結(jié)果表不但包含滿足連接條件的行,還包括相應(yīng)表中的所有行。外連接包括以下三種。左外連接(LEFTOUTERJOIN):結(jié)果表中除了包括滿足連接條件的行外,還包括左表的所有行;右外連接(RIGHTOUTERJOIN):結(jié)果表中除了包括滿足連接條件的行外,還包括右表的所有行;完全外連接(FULLOUTERJOIN):結(jié)果表中除了包括滿足連接條件的行外,還包括兩個表的所有行。4.2.8連接【例4.54】

查找所有學(xué)生情況,以及他們選修的課程號,若學(xué)生未選修任何課,也要包括其情況。SELECTXSB.*,課程號 FROMXSBLEFTOUTERJOINCJB ONXSB.學(xué)號

=CJB.學(xué)號【例4.55】

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

列出學(xué)生所有可能的選課情況。SELECT學(xué)號,姓名,課程號,課程名 FROMXSBCROSSJOINKCB4.2.9其他1.INTO使用INTO子句可以將SELECT查詢所得的結(jié)果保存到一個新建的表中。INTO子句的格式為[INTOnew_table]【例4.57】

由XSB表創(chuàng)建“計算機系學(xué)生”表,包括學(xué)號和姓名。SELECT學(xué)號,姓名 INTO計算機系學(xué)生 FROMXSB WHERE專業(yè)='計算機'4.2.9其他2.UNION使用UNION子句可以將兩個或多個SELECT查詢的結(jié)果合并成一個結(jié)果集,其格式為{<queryspecification>|(<queryexpression>)}UNION[ALL]<queryspecification>|(<queryexpression>)[UNION[ALL]<queryspecification>|(<queryexpression>)[…n]]使用UNION組合兩個查詢的結(jié)果集的基本規(guī)則是:

(1)所有查詢中的列數(shù)和列的順序必須相同。(2)數(shù)據(jù)類型必須兼容。

4.2.9其他【例4.58】

查找學(xué)號為081101和學(xué)號為081210的兩位同學(xué)的信息。SELECT* FROMXSB WHERE學(xué)號='081101'UNIONALLSELECT* FROMXSB WHERE學(xué)號='081210'執(zhí)行結(jié)果如圖所示。4.2.9其他3.EXCEPT和

INTERSECTEXCEPT和INTERSECT用于比較兩個查詢的結(jié)果,返回非重復(fù)值。語法格式如下:{<query_specification>|(<query_expression>)}{EXCEPT|INTERSECT}{<query_specification>|(<query_expression>)}4.2.9其他【例4.59】

查找專業(yè)為計算機但性別不為男的學(xué)生信息。USEPXSCJGOSELECT*FROMXSBWHERE專業(yè)='計算機'EXCEPTSELECT*FROMXSBWHERE性別=1執(zhí)行結(jié)果如圖所示。4.2.9其他【例4.60】

查找總學(xué)分大于42且性別為男的學(xué)生信息。SELECT*FROMXSBWHERE總學(xué)分>42INTERSECTSELECT*FROMXSBWHERE性別=14.3視圖4.3.1視圖概念是從一個或幾個基本表導(dǎo)出的虛表數(shù)據(jù)庫中只存放視圖的定義而不存放視圖對應(yīng)的數(shù)據(jù)基本表中的數(shù)據(jù)發(fā)生變化,從視圖中查詢出的數(shù)據(jù)也隨之改變用戶可以在視圖上再定義視圖4.3視圖視圖一經(jīng)定義以后,就可以像表一樣被查詢、修改、刪除和更新。使用視圖有下列優(yōu)點:(1)為用戶集中數(shù)據(jù),簡化用戶的數(shù)據(jù)查詢和處理。有時用戶所需要的數(shù)據(jù)分散在多個表中,定義視圖可將它們集中在一起,從而方便用戶進行數(shù)據(jù)查詢和處理。(2)屏蔽數(shù)據(jù)庫的復(fù)雜性。用戶不必了解復(fù)雜的數(shù)據(jù)庫中的表結(jié)構(gòu),并且數(shù)據(jù)庫表的更改也不影響用戶對數(shù)據(jù)庫的使用。(3)簡化用戶權(quán)限的管理。只需授予用戶使用視圖的權(quán)限,而不必指定用戶只能使用表的特定列,也增加了安全性。(4)便于數(shù)據(jù)共享。各用戶不必都定義和存儲自己所需的數(shù)據(jù),而可共享數(shù)據(jù)庫的數(shù)據(jù),這樣,同樣的數(shù)據(jù)只需存儲一次。4.3.2創(chuàng)建視圖1.在SQLServerManagementStudio中創(chuàng)建視圖其主要步驟如下。第1步:啟動SQLServerManagementStudio,在對象資源管理器中展開“數(shù)據(jù)庫→PXSCJ”,選擇其中的“視圖”項,右擊鼠標(biāo),在彈出的快捷菜單上選擇“新建視圖(N)”菜單項。第2步:在隨后出現(xiàn)的“添加表”對話框中,添加所需要關(guān)聯(lián)的基本表、視圖、函數(shù)、同義詞。這里只使用“表”選項卡,選擇表“XSB”,如圖所示,單擊“添加”按鈕。第3步:基表添加完后,在“視圖”選項卡的“關(guān)系圖”區(qū)域中顯示了基表的全部列信息,如圖所示。4.3.2創(chuàng)建視圖2.使用CREATEVIEW語句創(chuàng)建視圖T-SQL中用于創(chuàng)建視圖的語句是CREATEVIEW語句,例如,用該語句創(chuàng)建視圖CS_XS。USEPXSCJGOCREATEVIEWCS_XS AS SELECT* FROMXSB WHERE專業(yè)='計算機‘4.3.2創(chuàng)建視圖【例4.61】

創(chuàng)建CS_KC視圖,包括計算機專業(yè)各學(xué)生的學(xué)號、其選修的課程號及成績。CREATEVIEWCS_KC AS SELECTXSB.學(xué)號,課程號,成績 FROMXSB,CJB WHEREXSB.學(xué)號

=CJB.學(xué)號

AND專業(yè)

='計算機'

4.3.3查詢視圖【例4.62】

使用視圖CS_KC查找計算機專業(yè)的學(xué)生學(xué)號和選修的課程號。SELECT學(xué)號,課程號 FROMCS_KC【例4.63】

查找平均成績在80分以上的學(xué)生的學(xué)號和平均成績。本例首先創(chuàng)建學(xué)生平均成績視圖XS_KC_AVG,包括學(xué)號(在視圖中列名為num)和平均成績(在視圖中列名為score_avg)。CREATEVIEWXS_KC_AVG(num,score_avg) AS SELECT學(xué)號,AVG(成績) FROMCJB GROUPBY學(xué)號4.3.3查詢視圖再對XS_KC_AVG視圖進行查詢。執(zhí)行結(jié)果如圖所示。SELECT* FROMXS_KC_AVG WHEREscore_avg>=804.3.4更新視圖1.可更新視圖(1)滿足以下條件的視圖。創(chuàng)建視圖的SELECT語句中沒有聚合函數(shù),且沒有GROUPBY、HAVING、UNION子句及DISTINCT關(guān)鍵字。創(chuàng)建視圖的SELECT語句中包含所有非空列。創(chuàng)建視圖的SELECT語句的FROM子句中至少要包含一個基本表。(2)在對視圖進行修改(包括UPDATE、INSERT、DELETE)時只能影響到一個基表,不能同時影響多個基表(如果有多個基表的話)。4.3.4更新視圖2.插入數(shù)據(jù)【例4.64】

向CS_XS視圖中插入以下記錄:('081115','劉明儀',1,'1998-3-2','計算機',50,NULL)INSERTINTOCS_XS VALUES('081115','劉明儀',1,'1998-3-2','計算機',50,NULL)使用

溫馨提示

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

評論

0/150

提交評論