版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章視圖與索引7.1視圖簡(jiǎn)介7.2視圖的創(chuàng)建7.3視圖的修改和刪除7.4視圖的利用7.5索引簡(jiǎn)介7.6索引的創(chuàng)建和使用7.7實(shí)戰(zhàn)訓(xùn)練小結(jié)思考題
對(duì)于數(shù)據(jù)表來(lái)說(shuō),SQLServer2000的視圖與索引也是不可缺少的伴侶。視圖使數(shù)據(jù)表的操作更加方便,索引使數(shù)據(jù)表的查詢更加快速。本章任務(wù):?學(xué)會(huì)創(chuàng)建和使用視圖,利用視圖更新數(shù)據(jù),學(xué)會(huì)創(chuàng)建索引。7.1視圖簡(jiǎn)介7.1.1視圖的概念視圖是一種數(shù)據(jù)庫(kù)對(duì)象,是從一個(gè)或者多個(gè)數(shù)據(jù)表或視圖中導(dǎo)出的虛表。視圖所對(duì)應(yīng)的數(shù)據(jù)并不真正地存儲(chǔ)在視圖中,而是存儲(chǔ)在所引用的數(shù)據(jù)表中。視圖的結(jié)構(gòu)和數(shù)據(jù)是對(duì)數(shù)據(jù)表進(jìn)行查詢的結(jié)果。視圖被定義后便存儲(chǔ)在數(shù)據(jù)庫(kù)中。和真實(shí)的表一樣,視圖在顯示時(shí)也包括幾個(gè)被定義的數(shù)據(jù)列和多個(gè)數(shù)據(jù)行,但通過(guò)視圖看到的數(shù)據(jù)只是存放在數(shù)據(jù)表中的數(shù)據(jù)。對(duì)視圖中數(shù)據(jù)的操作像對(duì)表那樣,可以進(jìn)行查詢、修改和刪除,但需要滿足一定的條件。當(dāng)對(duì)通過(guò)視圖看到的數(shù)據(jù)進(jìn)行修改時(shí),相應(yīng)的數(shù)據(jù)表的數(shù)據(jù)也會(huì)發(fā)生變化;同時(shí),如果數(shù)據(jù)表的數(shù)據(jù)發(fā)生變化,則在相關(guān)的視圖中會(huì)立刻體現(xiàn)出來(lái)。
根據(jù)創(chuàng)建視圖時(shí)給定的條件,視圖可以是一個(gè)數(shù)據(jù)表的一部分,也可以是多個(gè)數(shù)據(jù)表的聯(lián)合,它存儲(chǔ)了要執(zhí)行檢索的查詢語(yǔ)句的定義,以便在引用該視圖時(shí)使用。在SQLServer2000中,視圖里最多可以定義一個(gè)或者多個(gè)數(shù)據(jù)表的1024個(gè)字段,能定義的記錄數(shù)只受表中記錄數(shù)的限制。視圖可以用來(lái)訪問(wèn)整個(gè)表、表的一部分或者多個(gè)表的聯(lián)接,這取決于視圖中數(shù)據(jù)表的定義。數(shù)據(jù)表的定義可以是數(shù)據(jù)表中字段的子集或者記錄的子集、兩個(gè)或者多個(gè)數(shù)據(jù)表的聯(lián)合或者聯(lián)接、數(shù)據(jù)表的統(tǒng)計(jì)匯總、視圖的視圖以及視圖和數(shù)據(jù)表的混合。7.1.2視圖的優(yōu)點(diǎn)在SQLServer2000中,可以根據(jù)用戶的實(shí)際需要?jiǎng)?chuàng)建視圖。使用視圖的主要優(yōu)點(diǎn)如下:
(1)視圖可以屏蔽數(shù)據(jù)的復(fù)雜性,簡(jiǎn)化用戶對(duì)數(shù)據(jù)庫(kù)的操作。使用視圖時(shí),用戶不必了解數(shù)據(jù)表的結(jié)構(gòu),就可以方便地使用和管理數(shù)據(jù)。因?yàn)樵诙x視圖時(shí),可以把經(jīng)常使用的聯(lián)接、投影和查詢語(yǔ)句定義為視圖,所以在每一次執(zhí)行相同的查詢時(shí),不必重新編寫(xiě)這些復(fù)雜的查詢語(yǔ)句,只要一條簡(jiǎn)單的查詢視圖語(yǔ)句就可以實(shí)現(xiàn)相同的功能??梢?jiàn),視圖向用戶隱藏了表與表之間復(fù)雜的聯(lián)接操作,簡(jiǎn)化了對(duì)用戶操作數(shù)據(jù)的要求。(2)視圖是為用戶定制的,視圖可以只反映用戶感興趣的某些特定數(shù)據(jù),完成他們的特定任務(wù),而無(wú)關(guān)的數(shù)據(jù)則不在視圖中顯示出來(lái)。視圖可以讓不同的用戶以不同的方式看到不同或者相同的數(shù)據(jù)集。當(dāng)數(shù)據(jù)表隨某個(gè)用戶應(yīng)用的變化而增減字段時(shí),數(shù)據(jù)表結(jié)構(gòu)需要變化,但與這些增減字段無(wú)關(guān)的用戶視圖卻可以保持穩(wěn)定。
(3)可以使用視圖重新組織數(shù)據(jù),視圖中的字段名稱也可根據(jù)需要重新定義。在某些情況下,由于表中數(shù)據(jù)量太大,因此需要對(duì)表中的數(shù)據(jù)進(jìn)行水平或者垂直分割,如果直接分割數(shù)據(jù)表,則可能會(huì)引起應(yīng)用程序的執(zhí)行錯(cuò)誤。可以使用視圖對(duì)數(shù)據(jù)表中的數(shù)據(jù)進(jìn)行分塊顯示,從而使原有的應(yīng)用程序仍可以通過(guò)視圖來(lái)重載數(shù)據(jù)。(4)視圖提供了一個(gè)簡(jiǎn)單而有效的安全機(jī)制,可以定制不同用戶對(duì)數(shù)據(jù)的訪問(wèn)權(quán)限。通過(guò)視圖,用戶只能查看和修改他們所能看到的數(shù)據(jù),其他數(shù)據(jù)庫(kù)或者表既不可見(jiàn)也不可訪問(wèn)。如果某一用戶想要訪問(wèn)視圖的結(jié)果集,則必須獲得其訪問(wèn)權(quán)限。視圖所引用表的訪問(wèn)權(quán)限與視圖權(quán)限的設(shè)置互不影響。7.2視?圖?的?創(chuàng)?建在SQLServer2000中,創(chuàng)建視圖有三種方法:用企業(yè)管理器創(chuàng)建視圖、用Transact-SQL語(yǔ)句中的CREATEVIEW命令創(chuàng)建視圖,用企業(yè)管理器的創(chuàng)建視圖向?qū)?chuàng)建視圖。創(chuàng)建視圖的要求如下:
(1)視圖的名稱必須滿足SQLServer2000中規(guī)定的標(biāo)識(shí)符的命名規(guī)則,且對(duì)每個(gè)用戶必須是唯一的。此外,該名稱不得與該用戶擁有的數(shù)據(jù)表名稱相同。
(2)只能在當(dāng)前數(shù)據(jù)庫(kù)中創(chuàng)建視圖。
(3)一個(gè)視圖中最多只能引用1024個(gè)列,視圖中記錄的數(shù)目限制只由其數(shù)據(jù)表中的記錄數(shù)決定。(4)如果視圖中某一列是函數(shù)、數(shù)學(xué)表達(dá)式、常量,或者來(lái)自多個(gè)表的列名相同,則必須為列定義名稱。
(5)如果視圖引用的數(shù)據(jù)表或者視圖被刪除,則該視圖不能再被使用,直到創(chuàng)建新的數(shù)據(jù)表或者視圖為止。
(6)不能在視圖上創(chuàng)建索引,不能在規(guī)則和默認(rèn)的定義中引用視圖。
(7)當(dāng)通過(guò)視圖查詢數(shù)據(jù)時(shí),SQLServer要進(jìn)行檢查,以確保語(yǔ)句中涉及的所有數(shù)據(jù)庫(kù)對(duì)象存在,每個(gè)數(shù)據(jù)庫(kù)對(duì)象在語(yǔ)句的上下文中有效,而且數(shù)據(jù)修改語(yǔ)句不能違反數(shù)據(jù)完整性規(guī)則。7.2.1使用企業(yè)管理器創(chuàng)建視圖使用企業(yè)管理器創(chuàng)建視圖的具體操作步驟如下:
(1)打開(kāi)“企業(yè)管理器”窗口,打開(kāi)“新建視圖”對(duì)話框。其操作方法有兩種:方法一:在企業(yè)管理器左窗格的樹(shù)型選項(xiàng)卡中選擇指定的SQLServer組,展開(kāi)指定的服務(wù)器,打開(kāi)要?jiǎng)?chuàng)建視圖的數(shù)據(jù)庫(kù)文件夾,選中指定的數(shù)據(jù)庫(kù),右擊該數(shù)據(jù)庫(kù)圖標(biāo),從彈出的快捷菜單中依次選擇“新建”→“視圖”選項(xiàng),如圖7-1所示,打開(kāi)“新建視圖”對(duì)話框。方法二:在數(shù)據(jù)庫(kù)文件夾中,用鼠標(biāo)右擊下一層的“視圖”選項(xiàng),在彈出的快捷菜單中選擇“新建視圖”選項(xiàng),如圖7-2所示。圖7-1新建視圖方法一圖7-2新建視圖方法二(2)在出現(xiàn)的新建視圖操作界面可以鍵入建立視圖的SQL語(yǔ)句,如圖7-3所示。在圖7-3中,右擊窗口上部的空白部分,從彈出的快捷菜單中選擇“添加表”選項(xiàng),或者單擊工具欄中的按鈕,出現(xiàn)如圖7-4所示的“添加表”對(duì)話框,在該對(duì)話框中可以選擇需添加的數(shù)據(jù)表。
(3)在“添加表”對(duì)話框中有3個(gè)選項(xiàng)卡,可以分別選中它們來(lái)選擇表、視圖和函數(shù)。在“表”選項(xiàng)卡的列表框中列出了所有可用的表,選擇相應(yīng)的表作為創(chuàng)建視圖的數(shù)據(jù)表,單擊“添加”按鈕,就可以添加進(jìn)去,也可以雙擊某個(gè)表名來(lái)添加表。使用同樣的方法可以切換到“視圖”或“函數(shù)”選項(xiàng)卡,從中選擇需要的視圖或函數(shù),并依次創(chuàng)建新的視圖。圖7-3新建視圖操作界面圖7-4“添加表”對(duì)話框(4)這里利用Ctrl鍵和鼠標(biāo)配合,同時(shí)選中前面建立的3個(gè)表(即學(xué)生表、成績(jī)表和班級(jí)表),并單擊“添加”按鈕,即可將這3個(gè)表添加到“創(chuàng)建視圖”對(duì)話框中。然后通過(guò)單擊字段左邊的復(fù)選框選擇需要的字段。這里選擇學(xué)生表中的學(xué)號(hào)和姓名字段、班級(jí)表中的班級(jí)名稱字段以及成績(jī)表中的總評(píng)成績(jī)字段,如圖7-5所示。其他選項(xiàng)的說(shuō)明如下:●選中“輸出”復(fù)選框,可以在輸出結(jié)果中顯示該字段?!裨凇皽?zhǔn)則”復(fù)選框中輸入限制條件,可以限制輸出的記錄。在定義視圖的查詢語(yǔ)句中該限制條件對(duì)應(yīng)WHERE子句。圖7-5選擇視圖字段操作界面(5)可以點(diǎn)中某一表(或視圖)中的字段,按住不放,拖到另一表(或視圖)中,建立表間聯(lián)接;也可以用鼠標(biāo)右擊兩個(gè)表(或視圖)之間的連線,刪除聯(lián)接。圖7-5中學(xué)生表與成績(jī)表沒(méi)有連線時(shí)是crossjoin,將兩表的“學(xué)號(hào)”字段連線后,即變成內(nèi)聯(lián)接。如果要用外聯(lián)接,則可以先建內(nèi)聯(lián)接,然后在表間連線上右擊并選中屬性,在該屬性框中選中一個(gè)或多個(gè)表,以決定左(右)外聯(lián)接或全外聯(lián)接。
(6)右擊“字段定義”對(duì)話框,從彈出的快捷菜單中選擇“屬牲”選項(xiàng),出現(xiàn)“屬性”對(duì)話框,如圖7-6所示。在該對(duì)話框中,“DISTINCT值”可以選擇不輸出重復(fù)的記錄,“加密瀏覽”可以實(shí)現(xiàn)對(duì)視圖定義加密,選中“頂端”復(fù)選框可以限制視圖最多輸出的記錄條數(shù)。圖7-6“屬性”對(duì)話框(7)要運(yùn)行并輸出該視圖結(jié)果,可以在視圖設(shè)計(jì)窗口中單擊工具欄中的“!”按鈕,或者右擊窗口空白區(qū)域,在彈出的快捷菜單中選擇“運(yùn)行”選項(xiàng),則可根據(jù)設(shè)置的查詢語(yǔ)句,在本窗口最下面的數(shù)據(jù)結(jié)果區(qū)顯示出生成的視圖內(nèi)容。
(8)如果想保存視圖的定義,則可單擊工具欄中的“保存”按鈕,或者在窗口上部顯示數(shù)據(jù)表的窗格內(nèi)單擊鼠標(biāo)右鍵,從彈出的快捷菜單中選擇“保存”選項(xiàng)保存視圖。這里輸入“v_學(xué)生成績(jī)”作為視圖名,單擊“確定”按鈕,即可完成本例中視圖的創(chuàng)建。
(9)如果不想保存視圖的定義,則可直接復(fù)制全部代碼。這種方法用于多表聯(lián)接的代碼設(shè)計(jì),這樣的設(shè)計(jì)快速、簡(jiǎn)便,不易出錯(cuò)。7.2.2使用Transact-SQL語(yǔ)句創(chuàng)建視圖利用企業(yè)管理器創(chuàng)建視圖是很方便的,除此以外,還可以使用Transact-SQL語(yǔ)句中的CREATEVIEW命令創(chuàng)建視圖,其語(yǔ)法形式如下:
CREATEVIEW[<database_name>.][<owner>.]view_name[(column[,...n])][WITH<view_attribute>[,...n]]ASselect_statement[WITHCHECKOPTION]<view_attribute>::={ENCRYPTION|SCHEMABINDING|VIEW_METADATA}其中,各參數(shù)的說(shuō)明如下:●?database_name:用于指定創(chuàng)建視圖的數(shù)據(jù)庫(kù)名稱。database_name必須是現(xiàn)有數(shù)據(jù)庫(kù)的名稱。如果不指定數(shù)據(jù)庫(kù),則database_name默認(rèn)為當(dāng)前數(shù)據(jù)庫(kù)。●?owner:用于指定創(chuàng)建視圖所有者的用戶名,owner必須是database_name所指定的數(shù)據(jù)庫(kù)中的現(xiàn)有用戶名。owner默認(rèn)為database_name所指定的數(shù)據(jù)庫(kù)中與當(dāng)前聯(lián)接相關(guān)聯(lián)的用戶名。●?view_name:用于指定視圖的名稱。●?column:用于指定視圖中的字段名稱?!?WITHENCRYPTION:表示SQLServer加密包含CREATEVIEW語(yǔ)句文本在內(nèi)的系統(tǒng)表列。WITHENCRYPTION主要用于將存儲(chǔ)在系統(tǒng)表syscomments中的語(yǔ)句加密?!?select_statement:用于創(chuàng)建視圖的SELECT命令,利用SELECT命令可以從多個(gè)表或者視圖中選擇列,構(gòu)成新視圖的列,也可以使用UNION關(guān)鍵字聯(lián)合多個(gè)SELECT語(yǔ)句。但是,在SELECT語(yǔ)句中,不能使用ORDERBY、COMPUTE、COMPUTEBY語(yǔ)句和INTO關(guān)鍵字以及臨時(shí)表?!?WITHCHECKOPTION:用于強(qiáng)制視圖上執(zhí)行的所有數(shù)據(jù)修改語(yǔ)句都必須符合由select_statement設(shè)置的準(zhǔn)則。通過(guò)視圖修改數(shù)據(jù)行時(shí),WITHCHECKOPTION確保提交修改后,仍可通過(guò)視圖看到修改后的數(shù)據(jù)?!?SCHEMABINDING:表示在select_statement語(yǔ)句中如果包含表、視圖或者引用用戶自定義函數(shù),則表名、視圖名或者函數(shù)名前必須包含所有者的前綴?!?VIEW_METADATA:表示如果某一查詢中引用該視圖且要求返回瀏覽模式的元數(shù)據(jù),那么SQLServer將向DBLIB和OLEDBAPIS返回視圖的元數(shù)據(jù)信息。
【例7-1】使用Transact-SQL語(yǔ)句創(chuàng)建一個(gè)新視圖,命名其為學(xué)生成績(jī)。要求數(shù)據(jù)表的來(lái)源為:學(xué)生表、成績(jī)表和課程表;選擇的字段為:學(xué)生表中的學(xué)號(hào)和姓名字段、課程表中的課程名稱字段及成績(jī)表中的總評(píng)成績(jī)字段;查詢的數(shù)據(jù)為052090班學(xué)生的考試成績(jī)。
程序清單如下:
USEcollegeGOCREATEVIEW學(xué)生成績(jī)
ASSELECT學(xué)生表.學(xué)號(hào),學(xué)生表.姓名,
課程表.課程名稱,
成績(jī)表.總評(píng)成績(jī)
FROM
學(xué)生表,課程表,成績(jī)表
WHERE學(xué)生表.學(xué)號(hào)=成績(jī)表.學(xué)號(hào)
AND課程表.課程號(hào)=成績(jī)表.課程號(hào)
ANDLEFT(學(xué)生表.學(xué)號(hào),6)='052090'
在查詢分析器中執(zhí)行上面的程序,將會(huì)生成視圖學(xué)生成績(jī)。為了查看視圖中的數(shù)據(jù),在查詢分析器中輸入下面的SQL語(yǔ)句:
select*from學(xué)生成績(jī)程序的執(zhí)行結(jié)果如下:學(xué)號(hào)姓名 課程名稱 總評(píng)成績(jī)
05209001 張三 C語(yǔ)言 8005209001 張三 高等數(shù)學(xué) 8105209001 張三 鄧小平理論 7305209002 李四 C語(yǔ)言 7505209002 李四 高等數(shù)學(xué) 8105209002 李四 鄧小平理論 8505209003 唐寶家 C語(yǔ)言 7705209003 唐寶家 高等數(shù)學(xué) 8005209003 唐寶家 鄧小平理論 9005209004 顧葉 C語(yǔ)言 7705209004 顧葉 高等數(shù)學(xué) 7905209004 顧葉 鄧小平理論 8205209006 王安 C語(yǔ)言 6505209006 王安 高等數(shù)學(xué) 6905209006 王安 鄧小平理論 8405209007 李靜 C語(yǔ)言 7305209007 李靜 高等數(shù)學(xué) 7605209007 李靜 鄧小平理論 7205209008 李朋 高等數(shù)學(xué) 54(所影響的行數(shù)為19行)
【例7-2】使用Transact-SQL語(yǔ)句創(chuàng)建新視圖“不及格學(xué)生表”。對(duì)數(shù)據(jù)表和字段的選擇同上,但要求只顯示各班不及格的學(xué)生學(xué)號(hào)、姓名、課程名及成績(jī),并加密視圖的定義。程序清單如下:
USEcollegeGOCREATEVIEW不及格學(xué)生表
WITHENCRYPTIONASSELECT學(xué)生表.學(xué)號(hào),學(xué)生表.姓名,
課程表.課程名稱,
成績(jī)表.總評(píng)成績(jī)
FROM
學(xué)生表,課程表,成績(jī)表
WHERE學(xué)生表.學(xué)號(hào)=成績(jī)表.學(xué)號(hào)AND課程表.課程號(hào)=成績(jī)表.課程號(hào)
AND總評(píng)成績(jī)<60
在查詢分析器中執(zhí)行上面的程序,將會(huì)生成視圖“不及格學(xué)生表”。在查詢分析器中輸入下面的SQL語(yǔ)句:
SELECT*FROM不及格學(xué)生表程序的執(zhí)行結(jié)果如下:學(xué)號(hào)姓名課程名稱總評(píng)成績(jī)
05209008李朋高等數(shù)學(xué)54(所影響的行數(shù)為1行)
如果在定義視圖時(shí)對(duì)不及格學(xué)生表視圖進(jìn)行了加密,那么在企業(yè)管理器中右擊該視圖的名稱,并在彈出的快捷菜單中選擇“設(shè)計(jì)視圖”選項(xiàng)查看視圖的定義信息時(shí),系統(tǒng)將會(huì)彈出錯(cuò)誤提示信息,如圖7-7所示。圖7-7查看加密視圖時(shí)的錯(cuò)誤提示信息【例7-3】使用Transact-SQL語(yǔ)句創(chuàng)建新視圖“總分”和“平均分”。要求計(jì)算各門(mén)課程的總分及平均分。程序清單如下:
USEcollegeGOCREATEVIEW總分和平均分
ASSELECT課程表.課程名稱AS課程名稱,SUM(考試成績(jī))AS總分,AVG(考試成績(jī))AS平均分
FROM
學(xué)生表,課程表,成績(jī)表
WHERE學(xué)生表.學(xué)號(hào)=成績(jī)表.學(xué)號(hào)AND課程表.課程號(hào)=成績(jī)表.課程號(hào)
GROUPBY
課程表.課程名稱在查詢分析器中執(zhí)行上面的程序,將生成新視圖“總分”和“平均分”。輸入以下程序代碼查看視圖中的數(shù)據(jù)記錄:
SELECT*FROM總分和平均分程序的執(zhí)行結(jié)果如下:課程名稱 總分 平均分
C語(yǔ)言 542 77
鄧小平理論 533 76
高等數(shù)學(xué) 613 76(所影響的行數(shù)為3行)7.2.3使用向?qū)?chuàng)建視圖除了可以使用前面介紹的兩種方法創(chuàng)建視圖以外,使用視圖向?qū)б部梢院苋菀椎貏?chuàng)建視圖,其具體操作步驟如下:
(1)在企業(yè)管理器中打開(kāi)視圖向?qū)?。打開(kāi)視圖向?qū)У姆椒ㄓ幸韵聝煞N:方法一:在企業(yè)管理器中選中某個(gè)數(shù)據(jù)庫(kù),這里選中college數(shù)據(jù)庫(kù),單擊“工具”菜單,選擇其中的“向?qū)А边x項(xiàng),如圖7-8所示。在出現(xiàn)的“選擇向?qū)А睂?duì)話框中單擊“數(shù)據(jù)庫(kù)”選項(xiàng)左邊的加號(hào),在下一級(jí)選項(xiàng)中會(huì)看到“創(chuàng)建視圖向?qū)А边x項(xiàng),如圖7-9所示。方法二:在企業(yè)管理器中選擇工具欄中的圖標(biāo),可直接打開(kāi)如圖7-9所示的“選擇向?qū)А睂?duì)話框。圖7-8選擇“工具”菜單中的“向?qū)А边x項(xiàng)圖7-9“選擇向?qū)А睂?duì)話框(2)在“選擇向?qū)А睂?duì)話框中雙擊“創(chuàng)建視圖向?qū)А边x項(xiàng),或者先選中“創(chuàng)建視圖向?qū)А边x項(xiàng),再單擊“確定”按鈕,將會(huì)出現(xiàn)“歡迎使用創(chuàng)建視圖向?qū)А睂?duì)話框,如圖7-10所示。
(3)單擊“下一步”按鈕,出現(xiàn)“選擇數(shù)據(jù)庫(kù)”對(duì)話框,其下拉列表框中列出了選定服務(wù)器的所有可用數(shù)據(jù)庫(kù),如圖7-11所示。
(4)這里選擇數(shù)據(jù)庫(kù)college,然后單擊“下一步”按鈕,將出現(xiàn)選擇視圖對(duì)應(yīng)的數(shù)據(jù)表的對(duì)話框,如圖7-12所示。在該對(duì)話框中,列出了所選數(shù)據(jù)庫(kù)college中的所有表,這些表右邊的復(fù)選框標(biāo)志表明該表是否已經(jīng)被選擇。這里將窗口中列出的學(xué)生表、成績(jī)表和課程表3個(gè)表全部選中。圖7-10“歡迎使用創(chuàng)建視圖向?qū)А睂?duì)話框圖7-11“選擇數(shù)據(jù)庫(kù)”對(duì)話框圖7-12“選擇對(duì)象”對(duì)話框(5)選擇表后,單擊“下一步”按鈕,將會(huì)出現(xiàn)選擇創(chuàng)建視圖所使用的數(shù)據(jù)表中的字段對(duì)話框,如圖7-13所示。在該對(duì)話框中,每個(gè)字段右端有一個(gè)復(fù)選框,可以選中該復(fù)選框,使該字段包含在創(chuàng)建的視圖中。這里選擇學(xué)生表中的學(xué)號(hào)和姓名字段、課程表中的課程名稱字段及成績(jī)表中的成績(jī)字段。
(6)選擇需要的字段后,單擊“下一步”按鈕,會(huì)出現(xiàn)“定義限制”對(duì)話框,如圖7-14所示。可以在其文本框中輸入查詢語(yǔ)句的限制條件,即SELECT語(yǔ)句中的WHERE子句的內(nèi)容,用來(lái)限制視圖中包含的記錄信息。默認(rèn)時(shí),視圖將顯示數(shù)據(jù)表中所選字段的所有信息。這里在文本框中輸入如下限制條件:
WHERE學(xué)生表.學(xué)號(hào)=成績(jī)表.學(xué)號(hào)
AND課程表.課程號(hào)=成績(jī)表.課程號(hào)圖7-13“選擇列”對(duì)話框圖7-14“定義限制”對(duì)話框(7)單擊“下一步”按鈕,出現(xiàn)“命名視圖”對(duì)話框,系統(tǒng)會(huì)給出一個(gè)默認(rèn)的視圖名稱,用戶也可以自己輸入新的視圖名稱,這里輸入“v_學(xué)生成績(jī)_052090”,如圖7-15所示。
(8)單擊“下一步”按鈕,出現(xiàn)一個(gè)確認(rèn)對(duì)話框,如圖7-16所示。系統(tǒng)根據(jù)前面所做的設(shè)置,在該對(duì)話框的文本框中自動(dòng)給出了完成相應(yīng)功能的Transact-SQL語(yǔ)句。在本實(shí)例中,相應(yīng)的Transact-SQL語(yǔ)句如下:
USE[college]GOCREATEVIEW[v_學(xué)生成績(jī)_052090]ASSELECT[dbo].[成績(jī)表].[總評(píng)成績(jī)],[dbo].[課程表].[課程名稱],[dbo].[學(xué)生表].[學(xué)號(hào)],[dbo].[學(xué)生表]..[姓名]FROM[dbo].[成績(jī)表],[dbo].[課程表],[dbo].[學(xué)生表]WHERE學(xué)生表.學(xué)號(hào)=成績(jī)表.學(xué)號(hào)
AND課程表.課程號(hào)=成績(jī)表.課程號(hào)如果需要修改前面的設(shè)置,則可以單擊“上一步”按鈕。除了上述方法外,也可以直接在文本框中修改顯示的SQL語(yǔ)句,單擊“完成”按鈕即可創(chuàng)建一個(gè)新視圖。圖7-15“命名視圖”對(duì)話框圖7-16“向?qū)б淹瓿伞睂?duì)話框7.3視圖的修改和刪除可以使用企業(yè)管理器或Transact-SQL語(yǔ)句修改視圖的定義,也可以對(duì)現(xiàn)有的視圖重新命名。刪除視圖再重建視圖,不影響視圖所依賴的表數(shù)據(jù)。7.3.1修改視圖
1.使用企業(yè)管理器修改視圖在企業(yè)管理器中,右擊要修改的視圖名稱,從彈出的快捷菜單中選擇“設(shè)計(jì)視圖”選項(xiàng),將會(huì)出現(xiàn)視圖的設(shè)計(jì)窗口。該窗口與創(chuàng)建視圖時(shí)的窗口相同,可以按照創(chuàng)建視圖的方法修改視圖的定義。2.使用Transact-SQL語(yǔ)句修改視圖可以使用Transact-SQL語(yǔ)言中的ALTERVIEW語(yǔ)句修改視圖,但首先必須擁有使用視圖的權(quán)限,然后才能使用ALTERVIEW語(yǔ)句。該語(yǔ)句的語(yǔ)法形式如下:
ALTERVIEWview_name((column[,...n])][WITHENCRYPTION]ASselect_statement[WITHCHECKOPTION]
其中,各參數(shù)的說(shuō)明如下:●?view_name:用于指定要修改的視圖?!?column:用于指定視圖中包含的一個(gè)或者多個(gè)字段的名稱,用逗號(hào)分開(kāi),它們將成為給定視圖的一部分?!?select_statement:用于指定定義視圖的SELECT語(yǔ)句?!?WITHENCRYPTION:用于加密syscomments表中包含ALTERVIEW語(yǔ)句文本的條目。使用WITHENCRYPTION可防止將視圖作為SQLServer復(fù)制的一部分發(fā)布?!?WITHCHECKOPTION:用于強(qiáng)制視圖上執(zhí)行的所有數(shù)據(jù)修改語(yǔ)句都必須符合由定義視圖的select_statement設(shè)置的準(zhǔn)則。注意:如果原來(lái)的視圖定義是用WITHENCRYPTION或WITHCHECKOPTION創(chuàng)建的,那么只有當(dāng)ALTERVIEW中也包含這些選項(xiàng)時(shí),這些選項(xiàng)才有效。
【例7-4】修改視圖“不及格學(xué)生表”,在該視圖中增加一個(gè)新的條件,要求只顯示高等數(shù)學(xué)不及格的學(xué)生信息。程序清單如下:
USEcollegeGOALTERVIEW不及格學(xué)生表
AsSELECT學(xué)生表.學(xué)號(hào),
學(xué)生表.姓名,課程表.課程名稱,成績(jī)表.總評(píng)成績(jī)
FROM學(xué)生表,課程表,成績(jī)表
WHERE學(xué)生表.學(xué)號(hào)=成績(jī)表.學(xué)號(hào)
AND課程表.課程號(hào)=成績(jī)表.課程號(hào)
AND課程表.課程名稱='高等數(shù)學(xué)'--本行為新增加代碼
AND總評(píng)成績(jī)<60
在查詢分析器中執(zhí)行上面的程序,將會(huì)修改已創(chuàng)建的視圖“不及格學(xué)生表”。為了查看修改后的視圖包含的數(shù)據(jù)記錄,在查詢分析器中輸入下面的程序語(yǔ)句:
SELECT*FROM不及格學(xué)生表程序的執(zhí)行結(jié)果如下:學(xué)號(hào) 姓名 課程名稱 總評(píng)成績(jī)
05209008 李朋 高等數(shù)學(xué) 54(所影響的行數(shù)為1行)
由以上程序的執(zhí)行結(jié)果可以看出,修改后的視圖包含的數(shù)據(jù)記錄只為高等數(shù)學(xué)考試不及格的學(xué)生學(xué)號(hào)、姓名及考試成績(jī)。7.3.2刪除視圖對(duì)于不再使用的視圖,可以使用企業(yè)管理器或者Transact-SQL語(yǔ)句中的DROPVIEW命令將其刪除。
1.使用企業(yè)管理器刪除視圖使用企業(yè)管理器刪除視圖的具體操作步驟如下:
(1)打開(kāi)“企業(yè)管理器”窗口,選擇要?jiǎng)h除的視圖,右擊該視圖的名稱,從彈出的快捷菜單中選擇“刪除”選項(xiàng),出現(xiàn)“除去對(duì)象”對(duì)話框。這里展開(kāi)college數(shù)據(jù)庫(kù),并選中“視圖”選項(xiàng),在視圖顯示窗口中選擇視圖“v_學(xué)生成績(jī)_052090”進(jìn)行刪除,出現(xiàn)“除去對(duì)象”對(duì)話框,如圖7-17所示。圖7-17“除去對(duì)象”對(duì)話框(2)在“除去對(duì)象”對(duì)話框中單擊“顯示相關(guān)性”按鈕,將顯示和視圖有關(guān)的表格和視圖。單擊“全部除去”按鈕,即可刪除該視圖。
2.使用Transact-SQL語(yǔ)句刪除視圖可以使用Transact-SQL語(yǔ)句中的DROPVIEW命令刪除視圖,其語(yǔ)法形式如下:
DROPVIEW{view_name}[,...n]
若要使用該命令同時(shí)刪除多個(gè)視圖,只需在要?jiǎng)h除的各視圖名稱之間用逗號(hào)隔開(kāi)即可。【例7-5】刪除視圖“v_學(xué)生成績(jī)_052090”和視圖“不及格學(xué)生表”。程序清單如下:
DROPVIEWv_學(xué)生成績(jī)_052090,不及格學(xué)生表在查詢分析器中執(zhí)行上面的語(yǔ)句,即可同時(shí)刪除視圖“v_學(xué)生成績(jī)_052090”和“不及格學(xué)生表”。打開(kāi)企業(yè)管理器的視圖窗口,將會(huì)發(fā)現(xiàn)上述兩個(gè)視圖已從數(shù)據(jù)庫(kù)中刪除了。注意:在確認(rèn)刪除之前,應(yīng)該查看視圖的相關(guān)性窗口,查看是否有數(shù)據(jù)庫(kù)對(duì)象依賴于將被刪除的視圖。另外,數(shù)據(jù)是保存在數(shù)據(jù)表中的,刪除視圖對(duì)數(shù)據(jù)沒(méi)有影響。7.4視?圖?的?利?用?通過(guò)視圖可以方便地檢索到任何需要的數(shù)據(jù)信息。但是視圖的作用并不僅僅局限于檢索記錄,還可以利用視圖對(duì)創(chuàng)建視圖的內(nèi)部表進(jìn)行數(shù)據(jù)修改,比如插入新的記錄、更新記錄以及刪除記錄等。使用視圖修改數(shù)據(jù)時(shí),需要注意以下幾點(diǎn):
(1)修改視圖中的數(shù)據(jù)時(shí),不能同時(shí)修改兩個(gè)或者多個(gè)數(shù)據(jù)表??梢詫?duì)基于兩個(gè)或多個(gè)數(shù)據(jù)表或者視圖的視圖進(jìn)行修改,但是每次修改都只能影響一個(gè)數(shù)據(jù)表。
(2)不能修改那些通過(guò)計(jì)算得到的字段,例如包含計(jì)算值或者合計(jì)函數(shù)的字段。(3)如果在創(chuàng)建視圖時(shí)指定了WITHCHECKOPTION選項(xiàng),那么使用視圖修改數(shù)據(jù)庫(kù)信息時(shí),必須保證修改后的數(shù)據(jù)滿足視圖定義的范圍。
(4)執(zhí)行UPDATE、DELETE命令時(shí),所刪除與更新的數(shù)據(jù)必須包含在視圖的結(jié)果集中。
(5)如果視圖引用多個(gè)表,則無(wú)法用DELETE命令刪除數(shù)據(jù)。若使用UPDATE命令,則應(yīng)與INSERT操作一樣,被更新的列必須屬于同一個(gè)表。下面通過(guò)具體的例子來(lái)講述如何通過(guò)視圖來(lái)插入、更新和刪除數(shù)據(jù)表中的數(shù)據(jù)。7.4.1利用視圖插入新的數(shù)據(jù)使用視圖可以插入新的數(shù)據(jù)記錄,但應(yīng)該注意的是,新插入的數(shù)據(jù)實(shí)際上存放在與視圖相關(guān)的數(shù)據(jù)表中。
1.使用企業(yè)管理器在視圖中插入記錄具體方法是:在企業(yè)管理器中打開(kāi)要插入記錄的數(shù)據(jù)表對(duì)應(yīng)的視圖,在返回的數(shù)據(jù)記錄的最下面一行中直接插入新記錄即可。
2.使用Transact-SQL語(yǔ)句通過(guò)視圖插入記錄
【例7-6】創(chuàng)建一個(gè)基于班級(jí)表的新視圖“v_班級(jí)表_網(wǎng)絡(luò)”,要求包含網(wǎng)絡(luò)專(zhuān)業(yè)的所有班級(jí)。
程序清單如下:
USEcollegeGOCREATEVIEWv_班級(jí)表_網(wǎng)絡(luò)
ASSELECT班級(jí)編號(hào),班級(jí)名稱,專(zhuān)業(yè)
FROM班級(jí)表
WHERE專(zhuān)業(yè)like'網(wǎng)絡(luò)'
在查詢分析器中執(zhí)行上面的程序,將會(huì)生成新的視圖“v_學(xué)生表_052090”,此視圖包含的數(shù)據(jù)記錄如下:班級(jí)編號(hào) 班級(jí)名稱 專(zhuān)業(yè)
052001 05網(wǎng)絡(luò)1班 網(wǎng)絡(luò)
052010 05網(wǎng)絡(luò)2班 網(wǎng)絡(luò)
(所影響的行數(shù)為2行)
在查詢分析器中執(zhí)行以下語(yǔ)句:
Insertintov_班級(jí)表_網(wǎng)絡(luò)(班級(jí)編號(hào),班級(jí)名稱,專(zhuān)業(yè))Values('052011','06網(wǎng)絡(luò)1班','網(wǎng)絡(luò)')
上述語(yǔ)句執(zhí)行成功后,向班級(jí)表中添加一條新的數(shù)據(jù)記錄。在企業(yè)管理器中打開(kāi)視圖“v_班級(jí)表_網(wǎng)絡(luò)”,將會(huì)顯示插入數(shù)據(jù)后的信息,如圖7-18所示。此外,也可以使用SELECT語(yǔ)句在視圖和表中查到該條記錄。例如,在查詢分析器中輸入以下查詢語(yǔ)句,然后從視圖中查詢數(shù)據(jù)。
SELECT班級(jí)編號(hào),班級(jí)名稱,專(zhuān)業(yè)
FROMv_班級(jí)表_網(wǎng)絡(luò)顯示結(jié)果如圖7-19所示。圖7-18企業(yè)管理器中的視圖顯示結(jié)果圖7-19在查詢分析器中的顯示結(jié)果
同時(shí),也可以直接從班級(jí)表中查詢記錄,查詢語(yǔ)句如下:
SELECT班級(jí)編號(hào),班級(jí)名稱,專(zhuān)業(yè)
FROM班級(jí)表
WHERE專(zhuān)業(yè)1ike'網(wǎng)絡(luò)'
執(zhí)行上面的程序,顯示的結(jié)果與使用視圖顯示的結(jié)果相同。
注意:如果在創(chuàng)建視圖時(shí)定義了限制條件或者數(shù)據(jù)表的列允許空值或有默認(rèn)值,而插入的記錄不滿足該條件,則此時(shí)仍然可以向表中插入記錄,只是用視圖檢索時(shí)不會(huì)顯示出新插入的記錄。如果不想讓這種情況發(fā)生,則可以使用WITHCHECKOPTION選項(xiàng)限制插入不符合視圖規(guī)則的視圖。這樣在插入記錄時(shí),如果記錄不符合限制條件,則不能插入。【例7-7】首先創(chuàng)建一個(gè)包含限制條件的視圖“軟件男生信息”,限制條件為顯示05軟件班的性別為“男”的學(xué)生信息,然后插入一條不滿足限制條件的記錄,再用SELECT語(yǔ)句檢索視圖和表。.
程序清單如下:
USEcollegeGOCREATEVIEW軟件男生信息
ASSELECT*FROM學(xué)生表
WHERE班級(jí)編號(hào)like'052005'AND性別='男'GOInsertinto軟件男生信息values(‘05209009’,‘王利’,‘女’,‘1986-11-5’,‘052005’,‘65562193’,‘國(guó)和二村34號(hào)604室','31011019870315154x')GOSELECT*FROM軟件男生信息
GOSELECT*FROM學(xué)生表
WHERE班級(jí)編號(hào)1ike'052005'GO
當(dāng)插入了性別為“女”的學(xué)生王利后,查詢學(xué)生表,顯示結(jié)果如圖7-20所示。但由于此條記錄不滿足創(chuàng)建視圖“軟件男生信息”的條件,因此當(dāng)查詢視圖“軟件男生信息”中的記錄時(shí),此條記錄不會(huì)顯示出來(lái),如圖7-21所示。圖7-20表的輸出結(jié)果窗口圖7-21視圖輸出結(jié)果窗口【例7-8】在例7-7的基礎(chǔ)上添加WITHCHECKOPTION選項(xiàng)。程序清單如下:
USEcollegeGOCREATEVIEW軟件男生信息_onlyASSELECT*FROM學(xué)生表
WHERE班級(jí)編號(hào)like'052005'AND性別='男'WITHCHECKOPTIONGOInsertinto軟件男生信息_Onlyvalues(‘052090010’,‘李茹’,‘女’,‘1986-1-15’,‘052005’,‘65050213’,‘上農(nóng)新村4號(hào)204室','31011019860115104x')GOSELECT*FROM軟件男生信息_OnlyGO
運(yùn)行該程序?qū)@示如下出錯(cuò)信息:服務(wù)器:消息550,級(jí)別16,狀態(tài)1,行1
插入失敗的原因是:目標(biāo)視圖或者目標(biāo)視圖所跨越的某一視圖指定了WITHCHECKOPTION,而該操作的一個(gè)或多個(gè)結(jié)果行又不符合CHECKOPTION約束條件。由此可見(jiàn),利用視圖插入數(shù)據(jù)可以限制某些錯(cuò)誤數(shù)據(jù)進(jìn)入數(shù)據(jù)表。7.4.2利用視圖更新數(shù)據(jù)利用視圖可以更新數(shù)據(jù)記錄,但應(yīng)該注意,更新的只是數(shù)據(jù)庫(kù)的數(shù)據(jù)表中的數(shù)據(jù)記錄。
1.使用企業(yè)管理器在視圖中更新記錄具體方法是:在企業(yè)管理器中打開(kāi)要更新記錄的數(shù)據(jù)表對(duì)應(yīng)的視圖,在返回的數(shù)據(jù)記錄窗口中直接修改。
2.使用Transact-SQL語(yǔ)句通過(guò)視圖更新記錄
【例7-9】創(chuàng)建一個(gè)基于學(xué)生表的視圖“v_學(xué)生表_052005”,條件是顯示05軟件班的學(xué)生學(xué)號(hào)、姓名和性別,然后通過(guò)該視圖修改學(xué)生表中的記錄。
程序清單如下:
USEcollegeGOCREATEVIEWv_學(xué)生表_052005(學(xué)號(hào),姓名,性別)ASSELECT學(xué)號(hào),姓名,性別
FROM學(xué)生表
WHERE班級(jí)編號(hào)like'052005'GOupdatev_學(xué)生表_052005set姓名='王利'WHERE性別='男'
如果上面的程序執(zhí)行成功,則系統(tǒng)會(huì)返回以下信息:
(所影響的行數(shù)為1行)
在上面的程序中,首先創(chuàng)建了新的視圖“v_學(xué)生表_052005”,然后將性別為“男”的學(xué)生姓名成功修改為“王利”。在企業(yè)管理器中打開(kāi)該視圖,顯示結(jié)果如圖7-22所示。圖7-22通過(guò)視圖更新數(shù)據(jù)后的輸出結(jié)果窗口7.4.3利用視圖刪除數(shù)據(jù)利用視圖可以刪除數(shù)據(jù)記錄,但應(yīng)該注意的是,刪除的只是數(shù)據(jù)庫(kù)的數(shù)據(jù)表中的數(shù)據(jù)記錄。
1.利用企業(yè)管理器在視圖中刪除記錄具體方法是:在企業(yè)管理器中打開(kāi)要?jiǎng)h除記錄的數(shù)據(jù)表對(duì)應(yīng)的視圖,在返回的數(shù)據(jù)記錄窗口中直接刪除。
2.利用Transact-SQL語(yǔ)句通過(guò)視圖刪除記錄利用視圖刪除記錄時(shí)可以直接利用Transact-SQL語(yǔ)言的DELETE命令刪除視圖中的記錄。但應(yīng)注意,必須用指定的視圖中定義過(guò)的字段刪除記錄。【例7-10】利用視圖“v_學(xué)生表_052005”先插入一條記錄,然后刪除此條記錄。程序清單如下:
USEcollegeGOInsertinto軟件男生信息
Values(‘05209031’,‘劉法’,‘男’,‘1987-04-15’,‘052005’,‘55621451’,‘周家嘴路556弄33號(hào)304室',)GODELETEFROMv_學(xué)生表_052005WHERE學(xué)號(hào)='05209031'
在查詢分析器中執(zhí)行上面的程序,程序會(huì)先插入一條學(xué)號(hào)為“05209031”的新記錄,然后通過(guò)DELETE語(yǔ)句從視圖中刪除這條記錄,即刪除數(shù)據(jù)表中的相應(yīng)記錄。7.4.4利用視圖簡(jiǎn)化數(shù)據(jù)查詢
1.減少字段名的輸入如果我們經(jīng)常要顯示一個(gè)數(shù)據(jù)表中的部分列,則可以使用:
select字段1,字段2,字段3,…,字段nfrom表但是,每次輸入很多字段名會(huì)很不方便,很容易出錯(cuò),特別是字段很多時(shí)更加麻煩,為了節(jié)省時(shí)間簡(jiǎn)化操作,可以把select語(yǔ)句一次正確地輸入到視圖語(yǔ)句中,以后只要使用下列簡(jiǎn)單語(yǔ)句即可。
select*from視圖
2.控制數(shù)據(jù)的顯示范圍在大量的數(shù)據(jù)中,如果用戶要顯示具有某種特征的數(shù)據(jù),則可以使用視圖來(lái)簡(jiǎn)化查詢。比如,在學(xué)生成績(jī)表中,要看哪些學(xué)生需要補(bǔ)考,要查不及格的比率等,就需要建一個(gè)“不及格成績(jī)”的視圖,在這個(gè)視圖中顯示的全是不及格的成績(jī)記錄。如果考試及格或補(bǔ)考及格,則這些記錄就不會(huì)在視圖中顯示。7.4.5利用視圖簡(jiǎn)化編程當(dāng)我們編寫(xiě)多表聯(lián)接查詢的Transact-SQL語(yǔ)句時(shí),由于表多、字段多,因此常常寫(xiě)錯(cuò)字段名或者雖然寫(xiě)對(duì)字段名但放錯(cuò)了表名,造成多行語(yǔ)句的調(diào)試出錯(cuò)。如果我們借用企業(yè)管理器中創(chuàng)建視圖的工具,那么就會(huì)發(fā)現(xiàn)可以避免麻煩,從而可以很方便地編寫(xiě)程序。具體的方法如下:
(1)從企業(yè)管理器打開(kāi)創(chuàng)建視圖的界面,如圖7-23所示。
(2)點(diǎn)擊工具欄上的“添加表”按鈕,選中要用的表或視圖,再按“添加”按鈕,如圖7-24所示。選中多個(gè)表或視圖后,關(guān)閉“添加表”對(duì)話框,如圖7-25所示。圖7-23創(chuàng)建視圖的界面圖7-24“添加類(lèi)”對(duì)話框圖7-25選擇了多個(gè)表或視圖的界面(3)如果是有主鍵外鍵關(guān)系的表,就已經(jīng)有了中間的聯(lián)接,從代碼框來(lái)看,就有了“INNERJOIN”和“ON”表達(dá)式;如果兩個(gè)表中間沒(méi)有聯(lián)接,代碼框顯示“CROSSJOIN”,則需要用鼠標(biāo)點(diǎn)中一個(gè)表的某個(gè)字段拖到另一表的某個(gè)字段,建立聯(lián)系的兩個(gè)字段必須類(lèi)型相同,內(nèi)容相同,這樣就建立了“INNERJOIN”和“ON”表達(dá)式。如果是外聯(lián)接,則需要將鼠標(biāo)右擊兩表之間的連線,顯示屬性頁(yè)后,選擇左外聯(lián)接、右外聯(lián)接或全外聯(lián)接。
(4)再到兩個(gè)表中按順序點(diǎn)中各字段,就得到了代碼框的全部代碼,如圖7-26所示。
(5)不用保存視圖就可復(fù)制代碼,這樣就完成了多表聯(lián)接查詢的編程。這樣,我們編寫(xiě)和調(diào)試多表聯(lián)接的Transact-SQL語(yǔ)句時(shí),可以避免使用鍵盤(pán)輸入,只要點(diǎn)擊鼠標(biāo)就能一次成功。圖7-26產(chǎn)生聯(lián)接的全部程序代碼7.4.6利用視圖保證數(shù)據(jù)安全
1.設(shè)置“只讀”視圖在創(chuàng)建視圖時(shí),只給一般用戶設(shè)置SELECT權(quán)限,不設(shè)置增、刪、改的權(quán)限(具體設(shè)置在以后的數(shù)據(jù)庫(kù)安全章節(jié)中再詳細(xì)介紹)。這樣,一般用戶就只能從視圖讀數(shù)據(jù),而不能寫(xiě)數(shù)據(jù)了。
2.使用加密并修改字段名在創(chuàng)建視圖時(shí),使用WITHENCRYPTION選項(xiàng),并且使用與數(shù)據(jù)表中不同的字段名,用戶就無(wú)法知道視圖來(lái)源于什么表,字段名分別是什么。這樣,可以使用數(shù)據(jù),但找不到數(shù)據(jù)表。3.取數(shù)據(jù)表的子集通過(guò)取數(shù)據(jù)表的子集來(lái)創(chuàng)建視圖,可以把需要保密的數(shù)據(jù)字段和數(shù)據(jù)行隱藏起來(lái)。加上禁止一般用戶使用數(shù)據(jù)表,而只允許使用視圖,這樣可以使一般用戶局限于了解不重要的字段信息和數(shù)據(jù)行。取數(shù)據(jù)表的子集的方法是:在SELECT后面去除要保密的字段,在WHERE后面加上限制條件。比如,在訂單表中限制訂購(gòu)數(shù)量小于500,這樣訂購(gòu)數(shù)量上萬(wàn)的訂單數(shù)據(jù)行在視圖中就找不到了。7.5索引簡(jiǎn)介7.5.1索引的概念數(shù)據(jù)庫(kù)中的索引是一個(gè)列表,這個(gè)列表中包含了某個(gè)表一列或者若干列值的集合,以及這些值的記錄在數(shù)據(jù)表中存儲(chǔ)的物理地址。數(shù)據(jù)庫(kù)的索引與書(shū)籍的目錄類(lèi)似。如果想在一本書(shū)中快速查找所需的信息,則可以利用書(shū)籍的目錄快速定位,而無(wú)需閱讀整本書(shū)。類(lèi)似地,在數(shù)據(jù)庫(kù)中,如果想在某個(gè)表中快速查找滿足條件的記錄,則可以創(chuàng)建索引。索引使數(shù)據(jù)庫(kù)程序無(wú)需對(duì)整個(gè)表進(jìn)行掃描,就可以在其中找到所需數(shù)據(jù)。
當(dāng)SQLServer進(jìn)行數(shù)據(jù)查詢時(shí),查詢優(yōu)化器會(huì)自動(dòng)計(jì)算現(xiàn)有的幾種執(zhí)行查詢方案,看哪種方案的開(kāi)銷(xiāo)最小,速度最快,SQLServer就會(huì)按照該方案查詢。如果沒(méi)有建立索引,則在數(shù)據(jù)庫(kù)表中查詢符合某種條件的記錄時(shí),系統(tǒng)會(huì)從第一條記錄開(kāi)始,對(duì)表中的所有記錄進(jìn)行逐條掃描。如果有索引存在,則可以通過(guò)索引快速地找到查詢的結(jié)果。掃描整個(gè)表格從存儲(chǔ)表格的起始地址開(kāi)始,依次比較記錄,直至找到位置。通過(guò)索引查找時(shí),因?yàn)樗饕怯行蚺帕械模钥梢酝ㄟ^(guò)高效的有序查找算法(如折半查找等)找到索引項(xiàng),再根據(jù)索引項(xiàng)中記錄的物理地址找到查詢結(jié)果的存儲(chǔ)位置。7.5.2索引的優(yōu)點(diǎn)使用索引可以大大提高系統(tǒng)的性能,其具體表現(xiàn)如下:
(1)可以大大加快數(shù)據(jù)檢索速度。
(2)通過(guò)創(chuàng)建唯一索引,可以保證數(shù)據(jù)記錄的唯一性。
(3)在使用ORDERBY和GROUPBY子句檢索數(shù)據(jù)時(shí),可以顯著減少查詢中分組和排序的時(shí)間。
(4)使用索引可以在檢索數(shù)據(jù)的過(guò)程中使用優(yōu)化隱藏器,從而提高了系統(tǒng)的性能。
(5)可以加速表與表之間的聯(lián)接,這一點(diǎn)在實(shí)現(xiàn)數(shù)據(jù)的參照完整性方面有特別的意義。7.5.3索引的分類(lèi)
1.聚集索引
聚集索引對(duì)表的物理數(shù)據(jù)頁(yè)中的數(shù)據(jù)按列進(jìn)行排序,然后再重新存儲(chǔ)到磁盤(pán)上,即聚集索引是數(shù)據(jù)的物理排序。一個(gè)表只能有一個(gè)聚集索引。
2.非聚集索引非聚集索引具有與表的數(shù)據(jù)完全分離的結(jié)構(gòu),使用非聚集索引不用將物理數(shù)據(jù)頁(yè)中的數(shù)據(jù)按列排序。非聚集索引中存儲(chǔ)了組成非聚集索引的關(guān)鍵字的值和行定位器。3.聚集索引和非聚集索引的性能比較
(1)每個(gè)表只能有一個(gè)聚集索引,因?yàn)橐粋€(gè)表中的記錄只能以一種物理順序存放。但是,一個(gè)表可以有不止一個(gè)非聚集索引。
(2)從建立了聚集索引的表中取出數(shù)據(jù)要比建立了非聚聚集索引的表快。
(3)非聚集索引需要大量的硬盤(pán)空間和內(nèi)存。
(4)非聚集索引可以提高從表中取數(shù)據(jù)的速度,也會(huì)降低向表中插入和更新數(shù)據(jù)的速度。7.5.4索引的應(yīng)用條件不是在任何查詢中都需要建立索引。索引帶來(lái)的查找效率提高是有代價(jià)的,因?yàn)樗饕惨加么鎯?chǔ)空間,而且為了維護(hù)索引的有效性,在向表中插入新的數(shù)據(jù)或者更新數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)還要執(zhí)行額外的操作來(lái)維護(hù)索引。所以,過(guò)多的索引不一定能提高數(shù)據(jù)庫(kù)性能,必須科學(xué)地設(shè)計(jì)索引,才能帶來(lái)數(shù)據(jù)庫(kù)性能的提高。建立索引的一般原則如下:
(1)對(duì)數(shù)據(jù)記錄多的表要建索引,而數(shù)據(jù)記錄少的表不需要建索引。
(2)對(duì)經(jīng)常用來(lái)檢索的字段要建立索引。
(3)對(duì)數(shù)據(jù)表中的主鍵要建立索引。
(4)對(duì)數(shù)據(jù)表中的外鍵要建立索引。
(5)對(duì)經(jīng)常用于聯(lián)接的字段要建立索引。7.6索引的創(chuàng)建和使用7.6.1系統(tǒng)自動(dòng)創(chuàng)建索引在SQLServer2000中,索引可以由系統(tǒng)自動(dòng)創(chuàng)建,也可以由用戶手工創(chuàng)建。系統(tǒng)在創(chuàng)建表中對(duì)象時(shí)可以附帶地創(chuàng)建新索引,例如新建表時(shí),可以創(chuàng)建主鍵或唯一性約束,同時(shí)就創(chuàng)建了索引。在查詢分析器中,可以使用系統(tǒng)存儲(chǔ)過(guò)程sp_helpindex來(lái)查看索引。對(duì)數(shù)據(jù)表中的某個(gè)字段設(shè)置主鍵約束時(shí),系統(tǒng)會(huì)在該字段上自動(dòng)創(chuàng)建唯一索引,該索引可以是聚集的,也可以是非聚集的。系統(tǒng)自動(dòng)創(chuàng)建的索引名也會(huì)因?yàn)閯?chuàng)建主鍵的場(chǎng)所和方法不同而有所不同。
如果在企業(yè)管理器中設(shè)置主鍵,則系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)唯一的非聚集索引,索引名為“PK_表名”。如果在查詢分析器中使用Transact-SQL語(yǔ)句添加主鍵約束,則也會(huì)創(chuàng)建一個(gè)唯一索引,但索引名為“PK_表名_XXXXXXXX”,其中X是系統(tǒng)自動(dòng)生成的數(shù)字或英文字母。這個(gè)索引可以是聚集的,也可以是非聚集的,取決于在PRIMARYKEY后面使用的關(guān)鍵字。如果使用NONCLUSTERED關(guān)鍵字,則會(huì)生成非聚集的唯一索引;如果使用CLUSTERED關(guān)鍵字,則會(huì)生成聚集的唯一索引。不使用關(guān)鍵字時(shí),如果此表存在聚集索引,則生成非聚集的唯一索引,否則生成聚集的唯一索引。在查詢分析器中執(zhí)行上面的程序會(huì)創(chuàng)建新的數(shù)據(jù)表,系統(tǒng)同時(shí)自動(dòng)創(chuàng)建了唯一聚集索引。
除了系統(tǒng)自動(dòng)生成的索引外,用戶也可以根據(jù)實(shí)際需要使用以下幾種方法創(chuàng)建索引。
(1)利用企業(yè)管理器直接創(chuàng)建索引。
(2)利用Transact-SQL語(yǔ)句中的CREATEINDEX命令創(chuàng)建索引。
(3)利用企業(yè)管理器中的索引向?qū)?chuàng)建索引。
(4)利用企業(yè)管理器中的索引優(yōu)化向?qū)?chuàng)建索引。注意:只有表或視圖的所有者才能為表創(chuàng)建索引,并且可以隨時(shí)創(chuàng)建索引,無(wú)論表中是否有數(shù)據(jù)。此外,還可以通過(guò)指定限定的數(shù)據(jù)庫(kù)名稱為另一個(gè)數(shù)據(jù)庫(kù)中的表或視圖來(lái)創(chuàng)建索引。7.6.2通過(guò)企業(yè)管理器創(chuàng)建索引使用企業(yè)管理器直接創(chuàng)建索引的具體操作步驟如下:
(1)在企業(yè)管理器中展開(kāi)指定的服務(wù)器和數(shù)據(jù)庫(kù),選擇要?jiǎng)?chuàng)建索引的表,選中數(shù)據(jù)庫(kù)服務(wù)器下的college數(shù)據(jù)庫(kù),并右擊其中的某一個(gè)數(shù)據(jù)表,從彈出的快捷菜單中依次選擇“所有任務(wù)”→“管理索引”選項(xiàng),如圖7-27所示。
(2)在出現(xiàn)的“管理索引”對(duì)話框中,可以選擇要處理的數(shù)據(jù)庫(kù)和表,顯示在“現(xiàn)有索引”區(qū)域中的是現(xiàn)存的索引名稱、是否聚集以及對(duì)應(yīng)的字段信息。另外,在該對(duì)話框中還可以執(zhí)行編輯索引屬性以及刪除索引的操作,如圖7-28所示。圖7-27選擇“管理索引”選項(xiàng)圖7-28“管理索引”對(duì)話框(3)選擇college數(shù)據(jù)庫(kù)中的成績(jī)表數(shù)據(jù)表,然后單擊“新建”按鈕,出現(xiàn)“新建索引”對(duì)話框,如圖7-29所示。
(4)在“索引名稱”文本框中輸入新建索引的名稱,在下面的復(fù)選框中選擇用于創(chuàng)建索引的字段。在該對(duì)話框中可以設(shè)定索引的屬性,例如是否聚集、是否唯一;還可以建立復(fù)合索引,指定填充度屬性。這里寫(xiě)入索引名稱為“成績(jī)索引”,選中“總評(píng)成績(jī)”字段前面的復(fù)選框,并選中“排序次序”列中對(duì)應(yīng)“總評(píng)成績(jī)”字段的復(fù)選框,使成績(jī)按降序進(jìn)行排序。
(5)選擇完成后單擊“確定”按鈕,即可生成新的索引。單擊“取消”按鈕,則取消本次新建索引的操作。創(chuàng)建索引后的窗口如圖7-30所示。圖7-29“新建索引”對(duì)話框圖7-30創(chuàng)建索引后的窗口7.6.3通過(guò)查詢分析器創(chuàng)建索引利用Transact-SQL語(yǔ)句中的CREATEINDEX命令可以創(chuàng)建索引,既可以創(chuàng)建一個(gè)可改變表的物理順序的聚集索引,也可以創(chuàng)建提高查詢性能的非聚集索引。其語(yǔ)法形式如下:
CREATE[UNIQUE][CLUSTERED|NONCLUSTERED]INDEXindex_nameON{table|view)(column[ASC|DESC][,...n])[WITH[PAD_INDEX][[,]FILLFACTOR=fillfacfor][[,]IGNORE_DUP_KEY][[,]DROP_EXISTING][[,]STATISTICS_NORECOMPUTE][[,]SORT_IN_TEMPDB]][ONfilegroup]
其中,各參數(shù)的說(shuō)明如下:●?UNIQUE:用于指定為表或視圖創(chuàng)建唯一索引,即不允許存在索引值相同的兩行。當(dāng)列包含重復(fù)值時(shí),不能創(chuàng)建唯一索引。如要使用此選項(xiàng),則應(yīng)確定索引所包含的列均不允許為NULL值,否則在使用時(shí)會(huì)經(jīng)常出錯(cuò)?!?CLUSTERED:用于指定創(chuàng)建的索引為聚集索引。如果此選項(xiàng)默認(rèn),則創(chuàng)建的索引為非聚集索引。●?NONCLUSTERED:用于指定創(chuàng)建的索引為非聚集索引。其索引數(shù)據(jù)頁(yè)包含了指向數(shù)據(jù)庫(kù)中實(shí)際的表數(shù)據(jù)頁(yè)的指針?!?index_name:用于指定所創(chuàng)建的索引名稱。索引名稱在一個(gè)表或視圖中必須唯一,但在數(shù)據(jù)庫(kù)中不必唯一。索引名必須遵循SQLServer2000中標(biāo)識(shí)符的命名規(guī)則?!?table:用于指定創(chuàng)建索引的表名稱。必要時(shí)可以選擇指定的數(shù)據(jù)庫(kù)名稱和所有者名稱?!?view:用于指定創(chuàng)建索引的視圖名稱。必須使用SCHEMABINDING選項(xiàng)定義視圖,才能在視圖上創(chuàng)建索引?!?ASC|DESC:用于指定某個(gè)具體索引列的升序或降序排序方向。默認(rèn)值為升序(ASC)?!?column:用于指定被索引的列。指定兩個(gè)或者多個(gè)列名組成一個(gè)索引時(shí),可以為指定列的組合值創(chuàng)建組合索引,在table后的圓括號(hào)中列出組合索引中要包括的列(按排序優(yōu)先級(jí)排列),這種索引稱為復(fù)合索引。一個(gè)索引中最多可以指定16個(gè)列,但列的數(shù)據(jù)類(lèi)型的長(zhǎng)度之和不能超過(guò)900個(gè)字節(jié)?!?PAD_INDEX:用于指定索引中間級(jí)每個(gè)頁(yè)(節(jié)點(diǎn))上保持開(kāi)放的空間。無(wú)論FILLFACTOR的值有多小,中間級(jí)索引頁(yè)上的行數(shù)永遠(yuǎn)都不會(huì)小于兩行。PAD_INDEX選項(xiàng)只有在指定了FILLFACTOR時(shí)才有用,因?yàn)镻AD_INDEX使用由FILLFACTOR所指定的百分比。默認(rèn)情況下,給定中間級(jí)頁(yè)上的鍵集,SQLServer將確保每個(gè)索引頁(yè)上的可用空間至少可以容納一個(gè)索引允許的最大行。如果FILLFACTOR指定的百分比不夠大,則無(wú)法容納一行,SQLServer將在內(nèi)部使用允許的最小值替代該百分比?!?FILLFACTOR=fillfactor:在創(chuàng)建索引時(shí)用于指定每個(gè)索引頁(yè)的數(shù)據(jù)占索引頁(yè)大小的百分比,fillfactor的值為1~100,它同時(shí)指出了索引頁(yè)保留的自由空間占索引頁(yè)大小的百分比。對(duì)于那些頻繁進(jìn)行大量數(shù)據(jù)插入或者刪除的表,在建立索引時(shí)應(yīng)該為將來(lái)生成的索引數(shù)據(jù)預(yù)留較大的空間,即將fillfactor設(shè)得較小,否則,索引頁(yè)會(huì)因數(shù)據(jù)的插入而很快填滿,并產(chǎn)生分頁(yè),而分頁(yè)會(huì)大大增加系統(tǒng)的開(kāi)銷(xiāo)。如果設(shè)得過(guò)小,則又會(huì)浪費(fèi)大量的磁盤(pán)空間,降低查詢性能。因此,對(duì)于此類(lèi)表,通常設(shè)一個(gè)大約為10的fillfactor。對(duì)數(shù)據(jù)不更改、高并發(fā)、只讀的表,fillfactor可以設(shè)到95以上,甚至100。如果沒(méi)有指定此選項(xiàng),則SQLServer默認(rèn)值為0。0是個(gè)特殊值,與fillfactor中的其他小值的意義不同,其葉節(jié)點(diǎn)被完全填滿,而在索引頁(yè)中還有一些空間??梢杂么鎯?chǔ)過(guò)程sp_configue改變默認(rèn)的fillfactor值?!?IGNORE_DUP_KEY:當(dāng)向包含于一個(gè)唯一的聚集索引中的列中插入重復(fù)數(shù)據(jù)時(shí),用于控制SQLServer所作的反應(yīng)。如果為索引指定了IGNORE_DUP_KEY選項(xiàng),并且執(zhí)行了創(chuàng)建重復(fù)鍵的INSERT語(yǔ)句,則SQLServer將發(fā)出警告消息,并跳過(guò)此行數(shù)據(jù)的插入,繼續(xù)執(zhí)行下面的插入數(shù)據(jù)的操作。如果沒(méi)有為索引指定IGNORE_DUP_KEY,則SQLServer會(huì)發(fā)出一條警告消息,并回滾整個(gè)INSERT語(yǔ)句?!?DROP_EXISTING:用于指定應(yīng)刪除并重新創(chuàng)建已命名的先前存在的聚集索引或者非聚集索引。刪除聚集索引會(huì)導(dǎo)致所有的非聚集索引被重建,因?yàn)樾枰眯兄羔榿?lái)替換聚集索引鍵。如果再重建聚集索引,那么非聚集索引又會(huì)重建一次,以便用聚集索引鍵來(lái)替換行指針。使用DROP_EXISTING選項(xiàng)可以使非聚集索引只重建一次?!?STATISTICS_NORECOMPUTE:用于指定過(guò)期的索引統(tǒng)計(jì)不自動(dòng)重新計(jì)算。若要恢復(fù)自動(dòng)更新統(tǒng)計(jì),則可以手動(dòng)執(zhí)行沒(méi)有NORECOMPUTE子句的UPDATESTATISTICS命令?!?SORT_IN_TEMPDB:用于指定創(chuàng)建索引時(shí)的中間排序結(jié)果存儲(chǔ)在tempdb數(shù)據(jù)庫(kù)中。如果tempdb數(shù)據(jù)庫(kù)與用戶數(shù)據(jù)庫(kù)位于不同的磁盤(pán)設(shè)備上,則使用此選項(xiàng)可以減少創(chuàng)建索引所需的時(shí)間,但會(huì)增加創(chuàng)建索引時(shí)使用的磁盤(pán)空間?!?ONfilegroup:用于指定存放索引的文件組。該文件組必須已經(jīng)通過(guò)執(zhí)行CREATEDATABASE或ALTERDATABASE創(chuàng)建?!纠?-11】使用CREATEINDEX語(yǔ)句為“學(xué)生表”創(chuàng)建一個(gè)非聚集索引,索引字段為“姓名”,索引名為“i_學(xué)生姓名”。程序清單如下:
USEcollegeGOCREATEINDEXi_學(xué)生姓名
ON學(xué)生表(姓名)【例7-12】新建一個(gè)數(shù)據(jù)表,名稱為“電腦設(shè)備”,為此表創(chuàng)建一個(gè)唯一的聚集索引,索字段為“設(shè)備編號(hào)”,索引名為“i_電腦設(shè)備”。程序清單如下:
USEcollegeGOCREATETABLE電腦設(shè)備(編號(hào)int,設(shè)備名稱char(10),使用時(shí)間smalldatetime)GOCREATEUNIQUECLUSTEREDINDEXi_電腦設(shè)備ON電腦設(shè)備(編號(hào))WITHPAD_INDEX,FILLFACTOR=40,IGNORE_DUP_KEY,STATISTICS_NORECOMPUTE【例7-13】使用性別字段和出生年月字段,為學(xué)生表創(chuàng)建一個(gè)復(fù)合索引。程序清單如下:
USEcollegeGOCREATEINDEXI_學(xué)生表
on學(xué)生表(性別,出生年月)WITHPAD_INDEX,
FILLFACTOR=
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)定制辦公臺(tái)式機(jī)采購(gòu)合同
- 承包合同轉(zhuǎn)讓協(xié)議的變更
- 白酒二批經(jīng)銷(xiāo)商合同協(xié)議范本
- 居間及法律服務(wù)合同糾紛
- 街邊店鋪轉(zhuǎn)讓合同模板
- 環(huán)保廢鋼采購(gòu)協(xié)議
- 項(xiàng)目設(shè)計(jì)招標(biāo)文件模板設(shè)計(jì)心得分享
- 網(wǎng)站故障排查服務(wù)合同
- 電梯設(shè)備運(yùn)營(yíng)服務(wù)合同
- 質(zhì)物借款責(zé)任
- FOCUS-PDCA改善案例-提高術(shù)前手術(shù)部位皮膚準(zhǔn)備合格率醫(yī)院品質(zhì)管理成果匯報(bào)
- 山東省濟(jì)南市2023-2024學(xué)年高一上學(xué)期1月期末考試 地理 含答案
- 龍門(mén)吊二手買(mǎi)賣(mài)合同(2024版)
- 2025年廣東省高等學(xué)校招生中等職業(yè)學(xué)校畢業(yè)生統(tǒng)一考試 英語(yǔ)押題卷(五)(含答案)
- 2024年高考真題完全解讀課件:2024年高考物理真題完全解讀(遼寧、吉林、黑龍江卷)
- 電大機(jī)考-2270資源與運(yùn)營(yíng)管理(題庫(kù)帶答案)
- 國(guó)開(kāi)(浙江)2024年秋《中國(guó)建筑史(本)》形考作業(yè)1-4答案
- 2024年海南省高考?xì)v史試卷(含答案解析)
- 口腔常見(jiàn)疾病課件
- 大學(xué)生思想道德與法治課件
- 專(zhuān)題07:回憶性散文閱讀(考點(diǎn)串講)
評(píng)論
0/150
提交評(píng)論