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