數據庫SQL ServeSQLite教程 課件 第6、7章 視圖與索引、Transact-SQL應用_第1頁
數據庫SQL ServeSQLite教程 課件 第6、7章 視圖與索引、Transact-SQL應用_第2頁
數據庫SQL ServeSQLite教程 課件 第6、7章 視圖與索引、Transact-SQL應用_第3頁
數據庫SQL ServeSQLite教程 課件 第6、7章 視圖與索引、Transact-SQL應用_第4頁
數據庫SQL ServeSQLite教程 課件 第6、7章 視圖與索引、Transact-SQL應用_第5頁
已閱讀5頁,還剩146頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

數據庫SQLServer/SQlite教程授課教師:第6章視圖與索引視圖是關系數據庫系統為用戶提供的從多角度觀察分析數據庫中數據的一種機制,通過視圖可以看到自己感興趣的信息。而索引的建立為用戶快速查找所需信息提供了條件,合理使用索引能極大地提高數據檢索的速度,提高數據庫的性能。第6章

視圖與索引6.1視圖目錄6.2索引6.1視圖視圖(View)是保存在數據庫中從一個或多個表或視圖中導出由查詢語句定義生成的一個虛擬表。與真正的數據表類似,視圖也是由一組命名的列和數據行構成的,其結構和數據是建立在對表或視圖查詢的基礎上。數據庫只存儲視圖的定義,而不存儲對應的數據,這些數據仍然存儲在導出該視圖的數據表中,當基本表中的數據發生變化時,從視圖中查詢出來的數據也隨之改變。6.1.1

視圖的概念和作用1.視圖的概念視圖由視圖名和視圖定義兩部分組成。例如,涉及學生的課程和成績等基本信息的數據表有學生信息表student(s#、sname、age、sex、classid)、課程表course(c#、cname、credit)、成績表sc(s#、c#、score),可以在這些表的基礎上定義一個或多個視圖,比如學生選課情況(s#、sname、c#、cname、credit)、學生學習情況(s#、sname、c#、score)等視圖,這些視圖的數據仍然存儲在student、sc、course等表中。6.1.1

視圖的概念和作用1.視圖的概念通過視圖來訪問數據,而不必直接去訪問對應的數據表,實現數據從分散到集中,簡化處理,便于共享。對視圖的一般操作與對表的操作一樣,可以對其進行查詢、修改、刪除和更新。當對視圖中的數據表進行修改時,其對應數據表的數據也會同步發生變化,同時這種變化也自動地反映到視圖中。6.1.1

視圖的概念和作用2.視圖的使用及注意事項在創建視圖時,應注意以下幾點:(1)只能在當前數據庫中才能創建視圖。在定義視圖時,select子句中不能包含compute或computeby子句。在select子句中使用了top關鍵字,則可以使用orderby子句。(2)視圖的命名必須遵守標識符命名規則,不能與表同名,且對每一個用戶視圖名必須是唯一的。不能把規則、默認值或觸發器與視圖相關聯。6.1.1

視圖的概念和作用2.視圖的使用及注意事項視圖的作用有以下幾點:(1)視圖隱藏了底層的表結構,簡化了數據訪問操作,客戶端不再需要知道底層表的結構及其之間的關系。(2)視圖提供了一個統一訪問數據的接口,即可以允許用戶通過視圖訪問數據的安全機制,而不授予用戶直接訪問底層表的權限。(3)增強了安全性,使用戶只能看到視圖所顯示的數據。6.1.1

視圖的概念和作用3.視圖的作用例6-1

使用表student(s#,sname)、sc(s#,c#,score)、course(c#,cname,credit)創建視圖,顯示學號、姓名、課程代碼、成績、課程名和學分等信息。操作步驟如下:(1)在“對象資源管理器”中展開“數據庫”節點,展開要創建視圖的數據庫,再展開“視圖”節點,顯示當前數據庫的所有視圖。右擊“視圖”節點,在彈出的快捷菜單中選擇“新建視圖”命令。6.1.2

視圖的創建、修改及刪除1.創建視圖1)使用菜單方式創建視圖(2)在彈出的“添加表”對話框中選擇與視圖相關聯的表、視圖或函數,可以按住“Ctrl”鍵選擇相應的多個表。選擇完畢后,單擊“添加”按鈕,然后單擊“關閉”按鈕,如圖6-2所示。6.1.2

視圖的創建、修改及刪除1.創建視圖1)使用菜單方式創建視圖圖6-2添加表對話框(3)在視圖設計器中共有4個區:表區、列區、SQL語句區和查詢結果區。在表區中選擇創建視圖所需要的列,此時SQLServer腳本顯示在SQL區,在列區可以指定別名、排序方式和規則等。除此之外,在視圖設計器的4個區中,可以通過右擊空白區域,在彈出的快捷菜單中選擇有關選項,在彈出的級聯菜單中執行相應的操作。6.1.2

視圖的創建、修改及刪除1.創建視圖1)使用菜單方式創建視圖(4)右擊創建視圖域,在彈出的快捷菜單中選擇“執行SQL”命令,或單擊工具欄中的“執行”按鈕,在最下面的窗口中顯示視圖對應的結果集,如圖6-3所示。6.1.2

視圖的創建、修改及刪除1.創建視圖1)使用菜單方式創建視圖圖6-3“創建視圖”選項卡(5)右擊視圖選項卡,在彈出的快捷菜單中選擇“保存視圖”命令(如圖6-4所示),或單擊工具欄中的“保存”按鈕,在彈出的“選擇名稱”窗口中輸入新的視圖的名稱,單擊“確定”按鈕,完成視圖的創建。6.1.2

視圖的創建、修改及刪除1.創建視圖1)使用菜單方式創建視圖圖6-4“保存視圖”快捷菜單使用createview語句創建視圖,其語法格式如下:createview[schemaname.]view_name[(column[,...n])][with<view_attribute>[,...n]]as<select_statement>[withcheckoption]6.1.2

視圖的創建、修改及刪除1.創建視圖2)使用代碼方式創建視圖參數說明:(1)schemaname是視圖在數據庫中所屬架構的名稱,如果沒有指定,則視圖屬于默認架構dbo。view_name是新建視圖的名稱。column是視圖中的列名,如果沒有指定,則列名由select語句指定。6.1.2

視圖的創建、修改及刪除1.創建視圖2)使用代碼方式創建視圖(2)<view_attribute>={[encryption][,schemabinding][,view_metadata]},其中:encryption表示對視圖進行加密。SQLServer為了保護視圖的定義,使用withencryption子句可以不讓用戶查看視圖的定義文本。schemabinding表示將視圖綁定到底層所應用到的表,在select語句中如果包含表、視圖或函數,則表名、視圖名或函數名前必須有所有者前綴。6.1.2

視圖的創建、修改及刪除1.創建視圖2)使用代碼方式創建視圖指定schemabinding時,不能以影響視圖定義的方式修改表,必須先修改或刪除視圖定義,以刪除要修改的表的依賴關系。view_metadata表示當使用withview_metadata創建視圖時,返回的是視圖的元數據,否則返回的元數據是視圖所引用表的元數據。6.1.2

視圖的創建、修改及刪除1.創建視圖2)使用代碼方式創建視圖(3)as指定視圖要執行的操作。select_statement是定義視圖的select語句。(4)withcheckoption是附加檢查選項,從而保證在對視圖執行數據修改后,通過視圖仍可看到這些數據,否則修改無效。也就是對視圖上的數據的修改都必須符合select語句設置的條件。6.1.2

視圖的創建、修改及刪除1.創建視圖2)使用代碼方式創建視圖例6-2

使用表student(s#,sname)、sc(s#,c#,score)、course(c#,cname,credit)創建視圖,顯示學號、姓名、課程代碼、成績、課程名和學分等信息。代碼如下:createviewssc_viewasselects.s#,sname,sc.c#,score,cname,creditfromstudents,sc,coursecwheres.s#=sc.s#andsc.c#=c.c#6.1.2

視圖的創建、修改及刪除1.創建視圖2)使用代碼方式創建視圖在默認情況下,視圖中的列名和查詢語句中的列名相同,也可以通過createview語句中指定列別名。例6-3

使用表student(s#,sname)、sc(s#,c#,score)、course(c#,cname,credit)創建視圖,并統計學生的平均分、課程門數,并在createview語句中指定列的別名。要求視圖包括學號、姓名、平均分和課程門數。代碼如下:createviewssc_view2(學號,姓名,平均分,課程門數)asselects.s#,sname,avg(score),count(*)fromstudents,sc,coursecwheres.s#=sc.s#andsc.c#=c.c#groupbys.s#,sname6.1.2

視圖的創建、修改及刪除1.創建視圖3)使用別名創建視圖結果如圖6-5所示。6.1.2

視圖的創建、修改及刪除1.創建視圖3)使用別名創建視圖圖6-5使用別名創建視圖并顯示結果視圖的使用隔斷了用戶與表之間的聯系,方便用戶理解。為了防止用戶錯誤地插入或修改,在視圖定義時需要使用到withcheckoption選項。例6-4使用表student(s#,sname,age,sex,classid),創建一個只包含20180102班的視圖。查詢視圖顯示結果如圖6-6所示。6.1.2

視圖的創建、修改及刪除1.創建視圖4)使用withcheckoption子句創建視圖圖6-6使用withcheckoption子句創建視圖并顯示結果代碼如下:createviewstudent_2asselect*fromstudentwhereclassid='20180102'在對視圖student_2的插入記錄操作中插入一條錯誤記錄,如insertstudent_2values('2018010203','呂梅',21,'女','20180101')6.1.2

視圖的創建、修改及刪除1.創建視圖4)使用withcheckoption子句創建視圖操作顯示插入成功(在student表插入了一條記錄)。但是,這樣的插入操作是不正確的。為了防止這種情況的發生,必須在createview語句中添加withcheckoption選項,強制要求通過視圖插入或修改數據時滿足視圖定義中的where條件。上述代碼修改為:createviewstudent_2asselect*fromstudentwhereclassid='20180102'withcheckoption6.1.2

視圖的創建、修改及刪除1.創建視圖4)使用withcheckoption子句創建視圖先刪除視圖student_2,再執行上述代碼。再次在對視圖student_2的插入記錄操作中插入以下記錄:insertstudent_2values('2018010203','呂梅',21,'女','20180101')此次操作后提示“進行的插入或更新失敗”。6.1.2

視圖的創建、修改及刪除1.創建視圖4)使用withcheckoption子句創建視圖(1)使用菜單方式修改視圖。在“對象資源管理器”中展開“數據庫”節點,展開相應的數據庫和視圖節點,右擊視圖,選擇“設計”菜單,進入視圖設計器進行必要的修改,修改完成單擊“保存”按鈕即可。(2)使用代碼方式修改視圖。使用alterview語句可以修改視圖。修改視圖與刪除并重新創建視圖是不同的,修改視圖會保持視圖的權限不變,但刪除并重新創建視圖則意味著視圖的重新定義。6.1.2

視圖的創建、修改及刪除2.修改、刪除視圖1)視圖的修改例6-5

在當前數據庫中,修改在例6-4中創建的視圖student_2,添加withencryption選項。代碼如下:alterviewstudent_2withencryptionasselect*fromstudentwhereclassid='20180102'withcheckoption6.1.2

視圖的創建、修改及刪除2.修改、刪除視圖1)視圖的修改視圖并不是數據庫中必需的數據庫對象,對于不需要的視圖可以使用dropview語句將其刪除,刪除視圖后,其所對應的數據不會受到影響。如果有其他數據庫對象使用了該視圖,仍可以刪除該視圖,只是再使用那些數據庫對象時,將會發生錯誤。(1)使用代碼刪除視圖。例6-6

刪除例6-5中創建的視圖student_2。代碼如下:dropviewstudent_2(2)使用菜單刪除視圖。展開數據庫和視圖節點,在要刪除的視圖上右擊鼠標,在彈出的快捷菜單中選擇“刪除”命令,單擊“確定”按鈕即可刪除視圖。6.1.2

視圖的創建、修改及刪除2.修改、刪除視圖2)視圖的刪除視圖一經創建,就可以當成表來使用。可以在查詢中使用單個視圖,也可以使用視圖和表或者視圖與視圖關聯查詢。例6-7

使用例6-3中創建的視圖ssc_view2,查詢平均分大于等于75分的學生信息。代碼如下:select*fromssc_view2where平均分>=756.1.3

視圖的使用6.2索引SQLServer有兩種數據存儲文件,分別是數據文件和日志文件,其中數據文件是以8KB

(8192Byte)的頁面(Page)作為存儲單元,日志文件是以日志記錄作為存儲單元。以數據文件為例,從頁面類型、數據頁面結構、數據頁緩存、盤區、數據訪問等方面入手,討論其存儲格式與方式。6.2.1

SQLServer的數據存儲SQlServer定義的頁面類型有8種,如表6-1所示。用戶的數據一般存儲在數據頁面中,在一個數據頁面中,要知道數據如何存放,根據什么來定位頁面與頁面上的數據,就要先了解數據頁面的結構。6.2.1

SQLServer的數據存儲頁面類型內容數據包含數據行除text、ntext和image外的所有數據索引索引項文本/圖像text、ntext和image數據全局分配映射表、輔助全局分配映射表有關已分配的擴展區的信息頁的可用空間有關頁上可用空間的信息索引分配映射表有關表或索引所使用的擴展盤的信息大容量更改映射表有關自上次執行backuplog語句后大容量操作所修改的擴展盤區的信息差異更改映射表有關自上次執行backupdatabase語句后更改的擴展盤區的信息表6-1SQLServer頁面類型1.SQlServer定義的頁面類型在數據頁面上,數據行緊接著頁首按順序放置,在頁尾有一個行偏移表。在行偏移表中,頁上的每一行都有一個條目,每個條目記錄那一行的第一個字節與頁首的距離。頁偏移表中的條目序列與頁中行的序列相反。數據頁面的結構如圖6-7所示。數據頁面頁首96個字節保存著頁面的系統信息,如頁的類型、頁的可用空間量、擁有頁的對象的ID及該頁面屬于哪個物理文件。數據區則對應于圖6-7中所有數據行的總區域,存放真正的數據。行偏移數組用于記錄該數據頁面中每個數據區在數據頁面所處的相對位置,便于定位和檢索每個數據區在數據頁面中的位置,數組中每個記錄占兩個字節。6.2.1

SQLServer的數據存儲2.數據頁面結構6.2.1

SQLServer的數據存儲2.數據頁面結構圖6-7SQLServer數據頁SQLServer數據庫的主要用途是存儲和檢索數據,因此密集型磁盤I/O是數據庫引擎的一大特點。由于完成磁盤I/O需要消耗許多資源且耗時較長,因此SQLServer側重于提高I/O效率。緩沖區管理是實現高效I/O的關鍵環節,一個緩沖區就是一個8KB大小的內存頁,其大小與一個數據頁或索引頁相當,因此緩沖區高速緩存被劃分為多個8KB頁。緩沖區管理器負責將數據頁或索引頁從數據庫磁盤文件讀入緩沖區高速緩存中,并將修改后的頁寫回磁盤。6.2.1

SQLServer的數據存儲3.數據頁緩存SQLServer默認的存儲分配單位是盤區。為了避免頻繁地讀寫I/O,在表或其他對象分配存儲空間時,不是直接分配一個8KB的頁面,而是以一個盤區(Extent)為存儲分配單位,一個盤區為8個頁面(8×8KB=64KB)。SQLServer定義了兩種盤區類型:統一盤區和混合盤區。統一盤區只能存放同一對象,該對象擁有這個盤區的所有頁面。混合盤區由多個對象共同擁有該盤區。在為對象分配存儲盤區時,為了提高空間利用率,默認情況下,如果一個對象初始大小小于8個頁面,就盡量放在混合盤區,當該對象大小增加到8個頁面后,SQLServer會為這個對象重新分配一個統一盤區。6.2.1

SQLServer的數據存儲4.盤區系統訪問表中的數據時,可以采用表掃描和索引查找兩種方式。如果對數據頁上的數據進行訪問,一維升序或降序數據序列可以采用兩分檢索的方法迅速找到需要插入或刪除元素的位置。但當采用順序存儲的方式時,插入一個元素,需要將其下面的數據進行后移,反之刪除一個元素,需要將其下面的數據進行前移。為避免大量的數據移動,提高插入或刪除的工作效率,研究者提出了多種解決方案,其中B樹是較好的一種方案。6.2.1

SQLServer的數據存儲5.數據訪問B樹是由一系列節點所構成,它的每一個節點均由2M個數據域和2M+1個指針域構成,每個節點的數據從左向右升序排列。一般情況下,B樹的每個節點中的數據域不一定存滿數據,但基本上每個節點存放的數據個數大于B樹M個,如圖6-8所示。6.2.1

SQLServer的數據存儲5.數據訪問圖6-8B樹示例(節點數據的關系)B樹中父節點與子節點中的數據之間具有以下關系:父節點中每一數據域中存放的數據,均大于該數據域左側指針指向的子節點中的所有數據,也小于該數據域右側指針指向子節點中的所有數據。如圖6-8所示,為建立一棵B樹,需要將一個個的數據插入其中。當查詢到插入位置,發現該節點已填滿數據時,需要進行節點的分割,如圖6-9所示。6.2.1

SQLServer的數據存儲5.數據訪問圖6-9B樹示例(節點分割)用戶對數據庫最頻繁的操作是進行數據查詢。一般地,查詢操作時需要對整個表進行數據搜索,當表中數據很多時,搜索數據需要的時間比較長,這就會造成服務器資源的浪費。為了提高檢索的能力,引入了索引機制。6.2.1

SQLServer的數據存儲5.數據訪問索引(Index)是SQLServer在列上建立的一種數據庫對象。它保存著表中排序的索引列,并記錄索引列在表中的物理存儲位置,從而實現表中數據的邏輯排序。一張表的存儲是由數據頁面和索引頁面組成的。索引就存放在索引頁面上,當進行數據檢索時系統先搜索索引頁面,從中找到所需數據的指針,再通過指針從數據頁面中讀取數據。利用索引可以加快數據檢索的速度,提升系統的性能。6.2.2

索引及其創建與刪除1.索引的概念對于索引類型的劃分有多種,通常根據索引對表中記錄順序的影響分類,可以分為聚集索引和非聚集索引。此外,還有唯一索引與非唯一索引、單列索引與多列索引等分類。下面主要介紹聚集索引和非聚集索引。6.2.2

索引及其創建與刪除2.索引的類型1)2)聚集索引非聚集索引聚集索引(ClusteredIndex)是指表中的數據記錄實際存儲的次序與索引中相對應的鍵值的實際存儲次序完全相同的索引。也就是說,聚集索引將對表中的物理數據頁中的數據按列進行排序,然后再存儲到磁盤上。聚集索引與數據是融為一體的,因此聚集索引查找數據最快。當然,一個表只能有一個聚集索引。比如設置主鍵,系統自動創建一個聚集索引。6.2.2

索引及其創建與刪除2.索引的類型1)聚集索引非聚集索引(NonclusteredIndex)是指表中的數據記錄實際存儲的次序與索引中相對應的鍵值的實際存儲次序不相同的索引。也就是說,表中的數據不是按照索引列排序的,使用索引頁存儲,比聚集索引占用更多的存儲空間,檢索效率也較低。一個表中可以同時有聚集索引和非聚集索引,而且一個表可以有多個非聚集索引,但是一個表中最多不超過250個索引。非聚集索引將行定位器按關鍵字的值用一定的方法排序,這個順序與表的行在數據頁中的排序是不匹配的,在非聚集索引創建之前創建聚集索引,否則會引發索引重建。6.2.2

索引及其創建與刪除2.索引的類型2)非聚集索引索引的創建分為直接方式和間接方式兩種。直接方式就是使用命令或工具直接創建索引;間接方式就是在創建其他對象時附帶創建了索引,例如在設置主鍵約束或唯一性約束時,系統將自動創建索引。這里重點介紹直接創建索引的方法。6.2.2

索引及其創建與刪除3.索引的創建與刪除例6-8

在books表為bookid列創建聚集索引,索引名為Ix_books_bookid。操作步驟如下:(1)在“對象資源管理器”中展開數據庫節點和表節點,右擊“索引”節點,在彈出的快捷菜單中選擇“新建索引”命令,彈出“新建索引”對話框。(2)在“新建索引”對話框中進行設置。單擊“常規”選項,在“索引名稱”框中輸入名稱,在“索引類型”框中選擇“聚集”,單擊“添加”按鈕,在彈出的“從表dbo.books中選擇列”對話框中選中bookid列前面的復選框,單擊“確定”按鈕,返回“新建索引”對話框,如圖6-10所示。(3)單擊“確定”按鈕,完成聚集索引的創建。6.2.2

索引及其創建與刪除3.索引的創建與刪除1)使用菜單方式創建/修改/刪除索引6.2.2

索引及其創建與刪除3.索引的創建與刪除1)使用菜單方式創建/修改/刪除索引圖6-10“新建索引”對話框例6-9

在表sc的s#列已創建聚集索引Ix_sc_s#,要求修改該索引,使索引設置在s#和c#列上,索引名改為Ix_sc_s#c#。操作步驟如下:(1)在“對象資源管理器”中展開“數據庫”節點和“表”節點,再展開sc表節點,展開“索引”節點,右擊“Ix_sc_s#(聚集)”,在彈出的快捷菜單中選擇“屬性”命令,彈出“索引屬性”對話框。6.2.2

索引及其創建與刪除3.索引的創建與刪除1)使用菜單方式創建/修改/刪除索引(2)“索引屬性”對話框中進行相應設置。在“常規”選項中單擊“添加”按鈕,在彈出的“從dbo.sc中選擇列”對話框中同時選中s#列和c#列前面的復選框,如圖6-11所示。單擊“確定”按鈕,返回“索引屬性”對話框。(3)單擊“確定”按鈕,完成聚集索引的修改。注意:該聚集索引是直接創建的,如果是設置主鍵附加的聚集索引,則不能手動刪除索引,在修改主鍵約束的同時重新創建索引。6.2.2

索引及其創建與刪除3.索引的創建與刪除1)使用菜單方式創建/修改/刪除索引6.2.2

索引及其創建與刪除3.索引的創建與刪除1)使用菜單方式創建/修改/刪除索引圖6-11“修改索引-添加列”對話框例6-10

在表studinfo的email列上創建一個唯一的非聚集索引,該列的email值是不重復的,索引名為Ix_studinfo_email,該索引建立在文件組filegroup1上,該索引的中間節點和葉級節點的填滿度均為60%。6.2.2

索引及其創建與刪除3.索引的創建與刪除1)使用菜單方式創建/修改/刪除索引操作步驟如下:(1)在“對象資源管理器”中展開“數據庫”節點和“表”節點,再展開studinfo表節點,右擊“索引”節點,在彈出的快捷菜單中選擇“新建索引”命令,彈出“新建索引”對話框。在“新建索引”對話框中進行設置。(2)單擊“常規”選項,在“索引名稱”框中輸入名稱,在“索引類型”框中選擇“非聚集”,勾選“唯一”復選框,單擊“添加”按鈕,在彈出的“從dbo.studinfo中選擇對話框中選中email列前面的復選框,單擊“確定”按鈕,返回“新建索引”對話框。6.2.2

索引及其創建與刪除3.索引的創建與刪除1)使用菜單方式創建/修改/刪除索引(3)單擊“選項”選項,勾選“設置填充因子”復選框,在后面的列表框中輸入60勾選“填充索引”復選框,如圖6-12所示。(4)單擊“存儲”選項,在“文件組”下拉列表中選擇“filegroup1”。單擊“確定”按鈕,完成唯一的非聚集索引的創建。6.2.2

索引及其創建與刪除3.索引的創建與刪除1)使用菜單方式創建/修改/刪除索引圖6-12“新建索引”對話框例6-11

刪除在表studinfo的email列上創建的非聚集索引,該列的索引名為Ix_studinfo_email。操作步驟如下:(1)在“對象資源管理器”中展開“數據庫”節點和“表”節點,再展開studinfo表節點,然后再展開“索引”節點,右擊Ix_studinfo_email索引節點,在彈出的快捷菜單中選擇“刪除”命令,彈出“刪除索引”對話框。(2)單擊“確定”按鈕,完成索引的刪除。6.2.2

索引及其創建與刪除3.索引的創建與刪除1)使用菜單方式創建/修改/刪除索引(1)索引的創建。使用createindex命令創建索引,語法格式如下:create[unique][clustered|nonclustered]indexindexnameon{tablename|viewname}(column[asc|desc][,...n])[with(<indexoption>[,...n])][onfilegroup]6.2.2

索引及其創建與刪除3.索引的創建與刪除2)使用代碼方式創建/重新生成索引/刪除索引參數說明:①unique是指創建唯一索引,clustered是指創建聚集索引,nonclustered是指創建非聚集索引。indexname是索引名稱引所在的視圖的名稱。注意:只有使用schemabinding定義的視圖才能在視圖上創建索引,并且在視圖上必須創建了唯一聚集索引之后,才能在視圖上創建非聚集索引。column是應用索引的列,可以是一列或多列。asc|desc是指指定索引列的升序或降序方式,默認值為asc。②onfilegroup是指將索引存放在指定的文件組中。6.2.2

索引及其創建與刪除3.索引的創建與刪除2)使用代碼方式創建/重新生成索引/刪除索引③<indexoption>={pad_index={on|off}|fillfactor=fillfactor|sort_in_tempdb={on|off}|ignore_dup_key={on|off}|statistics_norecompute={on|off}|drop_existing={on|off}},其中:indexoption是索引屬性。pad_index用于指定索引填充,默認值為off。fillfactor用于指定填充因子,即索引頁葉級的填滿程度,即數據占索引頁大小的百分比,取值范圍為1~100。6.2.2

索引及其創建與刪除3.索引的創建與刪除2)使用代碼方式創建/重新生成索引/刪除索引sort_in_tempdb用于指定是否在tempdb中存儲臨時排序結果,默認值為off。ignore_dup_key用于指定對唯一聚集索引或唯一非聚集索引執行多行插入操作時出現重復鍵值的錯誤響應,默認值為off。statistics_norecompute用于指定是否重新計算分發統計信息,默認值為off。drop_existing用于指定應刪除并重新生成已索引,默認值為off。6.2.2

索引及其創建與刪除3.索引的創建與刪除2)使用代碼方式創建/重新生成索引/刪除索引例6-12

在books表為isbn列創建一個唯一的非聚集索引,索引名為ix_books_isbn。代碼如下:createuniquenonclusteredindexix_books_isbnonbooks(isbn)例6-13

在customers表中為customerid列創建一個聚集索引,該索引的中間結點和葉級結點的填滿度均為60%,并將該索引創建在文件組filegroup1。代碼如下:createclusteredindexix_customers_customeridoncustomers(customerid)with(fillfactor=60,pad_index=on)onfilegroup16.2.2

索引及其創建與刪除3.索引的創建與刪除2)使用代碼方式創建/重新生成索引/刪除索引例6-14

在sc表中,為s#和c#兩列的組合創建聚集索引,索引名為ix_sc_s#c#,如果已經存在名為ix_sc_s#c#的索引,則在創建索引的同時刪除已經存在的同名索引。代碼如下:createclusteredindexix_sc_s#c#onsc(s#,c#)with(drop_existing=on)6.2.2

索引及其創建與刪除3.索引的創建與刪除2)使用代碼方式創建/重新生成索引/刪除索引(2)重新生成索引。重新生成索引將根據指定的或現有的填充因子設置壓縮頁來刪除碎片、回收磁盤空間,然后對連接頁中的索引行重新排序。重新生成索引將會刪除并重新創建索引。用alterindex命令可重新生成索引或禁用索引,語法格式如下:alterindex{indexname|all}on<object>{rebuild[with(<rebuildindexoption>[,...n])]|disable}6.2.2

索引及其創建與刪除3.索引的創建與刪除2)使用代碼方式創建/重新生成索引/刪除索引參數說明:①indexname是索引的名稱,all是指定與表或視圖相關聯的所有索引,object是指重建索引的表的名稱。②rebuild[with(<rebuildindexoption>[,...n])]是指定將使用相同的列、索引類型、唯一性屬性和排序順序重新生成索引,其中:<rebuildindexoption>={pad_index={on|off}|fillfactor=fillfactor|sort_in_tempdb={on|off}|ignore_dup_key={on|off}|statistics_norecompute={on|off}}③<rebuildindexoption>和<indexoption>的選項的含義相同。disable是將索引標記為已禁用,任何索引均可被禁用。6.2.2

索引及其創建與刪除3.索引的創建與刪除2)使用代碼方式創建/重新生成索引/刪除索引例6-15

將表sc的索引文件Ix_sc_s#重新生成。代碼如下:alterindexIx_sc_s#c#onscrebuild例6-16

將books表的所有索引文件重新生成,索引的葉級節點的填滿度均設為70%,在tempdb中存儲臨時排序結果,但不自動重新計算過時的統計信息。代碼如下:alterindexallonbooksrebuildwith(fillfactor=70,sort_in_tempdb=on,statistics_norecompute=on)6.2.2

索引及其創建與刪除3.索引的創建與刪除2)使用代碼方式創建/重新生成索引/刪除索引(3)刪除索引。當不需要某個索引時,可以用dropindex命令將它從數據庫中刪除。刪除索引可以收回索引所占用的存儲空間。不能用dropindex命令刪除由primarykey約束或unique約束創建的索引。①使用命令方式刪除索引。使用dropindex命令的語法格式如下:dropindex<table_name>.<index_name>參數說明:table_name是索引所在的表的名稱。index_name是要刪除的索引的名稱。6.2.2

索引及其創建與刪除3.索引的創建與刪除2)使用代碼方式創建/重新生成索引/刪除索引例6-17

刪除bookds表中的索引文件Ix_books_isbn。代碼如下:dropindexbooks.Ix_books_isbn②使用菜單方式重新生成或刪除索引。在表中直接創建的索引,可以重新生成或刪除。但是,在刪除聚集索引時,表中的所有非聚集索引都將重建。例6-18

使用菜單方式重新生成或刪除books表中的索引文件Ix_books_isbn。6.2.2

索引及其創建與刪除3.索引的創建與刪除2)使用代碼方式創建/重新生成索引/刪除索引操作步驟如下:(1)在“對象資源管理器”中展開“數據庫”節點和“表”節點,再展開books表節點,然后再展開“索引”節點,在文件名“Ix_books_isbn...”上右擊鼠標,在彈出的快捷菜單中選擇“重新生成”或“刪除”命令,彈出“重新生成索引”或“刪除對象”對話框,如圖6-13所示。(2)單擊“確定”按鈕,完成重新生成索引或刪除索引。6.2.2

索引及其創建與刪除3.索引的創建與刪除2)使用代碼方式創建/重新生成索引/刪除索引6.2.2

索引及其創建與刪除3.索引的創建與刪除2)使用代碼方式創建/重新生成索引/刪除索引圖6-13“重新生成/刪除”快捷菜單習題1.使用菜單方式創建視圖時,單擊“新建視圖”命令,彈出

對話框。2.在數據頁面上,數據行緊接著

按順序放置,在頁尾有一個

偏移表,在數據區則存放真正的

。3.SQLServer默認的存儲分配單位是盤區,又分

,其中

只能存放同一對象,該對象擁有這個盤區的所有頁面。一、填空題1.對視圖的一般操作也有查詢、修改、刪除和更新。2.為了防止用戶不正確地插入或修改,在視圖定義時需要使用到withcheckoption選項。3.在查詢中,可以使用單個視圖,也可以使用視圖和表或者視圖與視圖關聯查詢。4.索引(Index)是SQLServer在數據行上建立的一種數據庫對象。(判斷題剩余習題見教材132頁)習題二、判斷題(

)(

)(

)(

)習題1.關于視圖,正確的說法有(

)。A.視圖由查詢語句定義生成的一個虛擬表。B.與真正的數據表類似,視圖也是由一組命名的列和數據行構成的。C.數據庫只存儲視圖的定義,而不存儲對應的數據。D.當表中的數據發生變化時,從視圖中查詢出來的數據也隨之改變。2.在視圖設計器中顯示的區域有(

)。A.表區

B.列區

C.SQL語句區

D.查詢結果區三、選擇題習題1.使用表student(s#,sname)、sc(s#,c#,score)、course(c#,cname,credit)創建視圖,顯示學號、姓名、課程代碼、成績、課程名和學分等信息。2.使用表student(s#,sname)、sc(s#,c#,score)、course(c#,cname,credit)創建視圖,并統計學生的平均分、課程門數,并在createview語句中指定列的別名。(操作題詳情見教材132頁)四、操作題習題1.使用表student(s#,sname,age,sex,classid),創建一個只包含20180102班的視圖,并添加check選項。2.在books表為isbn列創建一個唯一的非聚集索引,索引名為ix_books_isbn。五、實踐題【謝謝觀看】謝謝觀看數據庫SQLServer/SQlite教程授課教師:第7章Transact-SQL應用Transact-SQL簡稱T-SQL,是標準SQL語言的增強版。它對SQL-92標準進行了幾種擴展以增強其性能,為處理大量數據提供必要的結構化處理能力,并作為應用程序與SQL

Server溝通的主要語言。T-SQL提供標準SQL的數據定義、操作和控制的功能,加上延伸的函數、系統預存程序以及程序設計結構,讓程序設計更有彈性。第7章

Transact-SQL應用7.1T-SQL運算符與表達式目錄7.2T-SQL的變量7.3程序控制語句7.4自定義函數7.1T-SQL運算符與表達式運算符是一種符號,用來指定在一個或多個表達式中執行的操作。SQLServer2008R2的運算符有算術運算符、位運算符、比較運算符、邏輯運算符、字符串連接運算符、賦值運算符等。7.1T-SQL運算符與表達式1.算術運算符2.位運算符3.比較運算符4.邏輯運算符5.字符串連接運算符6.賦值運算符算術運算符在兩個表達式間執行數學運算,這兩個表達式可以是任何數字數據類型。算術運算符有+(加)、-(減)、*(乘)、/(除)和%(求模)5種運算。+(加)和-(減)運算符也可用于對datetime及smalldatetime值進行算術運算。7.1T-SQL運算符與表達式1.算術運算符2.位運算符位運算符用于對兩個表達式進行的位操作,這兩個表達式可為整型或與整型兼容的數據類型。位運算符及其規則如表7-1所示。SQL中的位運算不但可以取出各種值,而且還可以對數據進行排序。7.1T-SQL運算符與表達式運算符運算符名稱運算規則&按位與兩個位均為1時,結果為1,否則為0丨按位或只要一個位為1,結果為1,否則為0^按位異或兩個位值不同時,結果為1,否則為0表7-1位運算符及規則2.位運算符以&為例,&是二進制“與”運算,參加運算的兩個數的二進制按位進行運算,運算的規律是:0&0=0,0&1=0,1&0=0,1&1=1。對于參加運算的數要換算為二進制進行運算,例如,3&2的結果是2,運算過程是:3&2=0111&0010=0010=2。例7-1

聲明兩個局部變量并賦值,求它們的位運算。declare@aint,@bintselect@a=7,@b=4select@a&@bas'a&b',@a|@bas'a|b',@a^@bas'a^b'顯示結果為:4、7、3。7.1T-SQL運算符與表達式比較運算符用于測試兩個表達式的值是否相同,運算結果為“true”或“false”。比較運算符及名稱如表7-2所示。7.1T-SQL運算符與表達式3.比較運算符運算符運算名稱運算符運算名稱=相等<=小于或等于>大于<>、!=不等于<小于!<不小于>=大于或等于!>不大于表7-2比較運算符及名稱邏輯運算符用于對某個條件進行測試,運算結果為“true”或“false”,邏輯運算符及規則如表7-3所示。7.1T-SQL運算符與表達式運算符運算名稱and如果兩個操作數都為“true”,則運算結果為“true”or如果兩個操作數中有一個為“true”,則運算結果為“true”not若一個操作值為“true”,則運算結果為“false”,否則為“true”all如果兩個操作數值都為“true”,則運算結果為“true”any如果在一系列操作數中只要有一個為“true”,則運算結果為“true”between如果兩個操作數在指定的范圍內,則運算結果為“true”exists如果子查詢包含一些行,則運算結果為“true”in如果操作數值等于表達式列表中的一個,則運算結果為“true”like如果操作數與一種模式相匹配,則運算結果為“true”some如果在一系列操作數中有些值為“true”,則運算結果為“true”表7-3邏輯運算符及規則4.邏輯運算符字符串連接運算符通過運算符“+”實現兩個或多個字符串的連接運算。例7-2

執行下面的語句連接多個字符串。運算結果為“abcdefghijk”。select('ab'+'cdefg'+'hijk')as字符串連接7.1T-SQL運算符與表達式5.字符串連接運算符6.賦值運算符在給局部變量賦值的set和select語句中使用的“=”運算符稱為賦值運算符。賦值運算符用于將表達式的值賦予另外一個變量,也可以使用賦值運算符在列標題和為列定義值的表達式之間建立關系。當一個復雜的表達式有多個運算符時,運算符優先級決定執行運算的先后次序,執行的順序會影響所得到的運算結果。在一個表達式中,括號最優先,其次按先高(優先級數字小)后低(優先級數字大)的順序進行運算。運算符的優先級如表7-4所示。7.1T-SQL運算符與表達式6.賦值運算符7.1T-SQL運算符與表達式運算符優先級+(正),-(負)1*(乘),/(除),%(模)2+(加),+(串聯),-(減)3=,>,<,>=,<=,<>,!=,!>,!<(比較運算符)4^(位異或),&(位與),|(位或)5not6and7all,any,between,in,like,or,some8=(賦值)9表7-4運算符的優先級7.2T-SQL的變量變量是執行程序中必不可少的部分,主要用來在程序運行過程中存儲和傳遞數據。變量其實就是內存中的一個存儲區域,存儲在這個區域中的數據就是變量的值,由系統或用戶定義并賦值。T-SQL語句中的變量有兩種:局部變量和全局變量。這兩種變量在使用方法和具體意義上均不相同。7.2

T-SQL的變量局部變量是作用域局限在一定范圍內的變量,是用戶自定義的變量。一般來說,局部變量的使用范圍局限于定義它的批處理內。定義它的批處理中的SQL語句可以引用這個局部變量,直到批處理結束,這個局部變量的生命周期也就結束了。局部變量在程序中通常用來存儲從表中查詢到的數據或在程序執行過程中用于暫存變量。通常將其用于下面3種情況:(1)作為計數器,計算循環執行的次數或控制循環執行的次數。(2)保存數據值以供控制流語句測試。(3)保存由存儲過程返回代碼返回的數據值。7.2.1

局部變量1.概念及其用途在使用一個局部變量之前,必須先聲明該變量。其語法格式如下:declare@變量名變量類型[,...n]參數說明:(1)局部變量名的命名必須遵循SQLServer的標識符命名規則,并且必須以字符“@”開頭。(2)局部變量的類型可以是系統數據類型,也可以是用戶自定義的數據類型。(3)declare語句可以聲明一個或多個局部變量,變量被聲明以后初值都是“null”。7.2.1

局部變量2.聲明及其賦值1)聲明局部變量局部變量被創建之后,系統將其初始值設為“null”。若要改變局部變量的值,可以使用set語句或select語句給局部變量重新賦值。select語句的語法格式如下:select@變量名=表達式[,...]set語句的語法格式如下:set@變量名=表達式7.2.1

局部變量2.聲明及其賦值2)局部變量賦值參數說明:(1)@變量名是準備為其賦值的局部變量。表達式是有效的SQLServer表達式,且其類型應與局部變量的數據類型相匹配。(2)從語法格式中可以看出,select語句和set語句的區別在于使用set語句一次只能給一個變量賦值,而select語句可以一次給多個變量賦值。7.2.1

局部變量2.聲明及其賦值2)局部變量賦值可以使用select或print語句顯示局部變量的值。其語法格式如下:select@變量名[,...n]print@變量名兩者的區別在于,select語句以表格方式顯示一個或多個變量的值,而print語句在消息框中顯示一個變量的值。7.2.1

局部變量3.顯示局部變量的值例7-3

聲明一個長度為12個字符的局部變量s#,并為其賦值。代碼如下:declare@s#varchar(12)select@s#='2018010101'例7-4聲明一個局部變量maxscore,將sc表中學號(s#)為2018010101的最高分賦值給這個變量。代碼如下:declare@maxscorenumeric(6,1)select@maxscore=max(score)fromscwheres#='2018010101'7.2.1

局部變量3.顯示局部變量的值例7-5

顯示例1和例2中定義的局部變量@s#和@maxscore的值。代碼如下:declare@s#varchar(12)select@s#='2018010101'declare@maxscorenumeric(6,1)select@maxscore=max(score)fromscwheres#='2018010101'print@s#print@maxscore7.2.1

局部變量3.顯示局部變量的值選定上述語句,單擊“執行”按鈕,print一次只能顯示一個變量的值。顯示結果如圖7-1所示。7.2.1

局部變量3.顯示局部變量的值圖7-1局部變量的聲明、賦值和顯示全局變量是以“@@”開頭,由系統預先定義并負責維護的變量。也可以把全局變量看成是一種特殊形式的函數。全局變量不可以由用戶隨意建立和修改,其作用范圍也并不局限于某個程序,而是任何程序均可調用。常用的全局變量有30多個,通常用來存儲一些SQLServer的配置值和效能統計數字,用戶可以通過查詢全局變量來檢測系統的參數值或執行查詢命令后的狀態值。在全局變量的使用過程中要注意,全局變量是由SQLServer服務器定義的,用戶只能使用全局變量,且在引用全局變量時,必須以“@@”開頭。另外,局部變量的名稱不能與全局變量的名稱相同,否則就會在應用程序中出錯。7.2.2

全局變量表7-5列出了SQLServer的幾個常用全局變量及其含義,其他全局變量可查閱SQLServer聯機叢書。7.2.2

全局變量全局變量名稱全局變量的意義@@version返回當前安裝的日期、版本和處理器類型@@servername返回運行MicrosoftSQLServer的本地服務器名稱@@spid返回當前用戶進程的進程ID@@identity返回最后插入的標識列的列值@@error返回執行Transact-SQL語句的錯誤代碼@@procid返回當前存儲過程的ID值@@language返回當前使用的語言名表7-5幾個常見的全局變量例7-6執行select@@servername,返回服務器名稱,顯示結果如圖7-2所示。7.2.2

全局變量圖7-2服務器名稱執行select*FromSys.SysServers,返回服務器名稱等信息,顯示結果如圖7-3所示。圖7-3服務器名稱信息例7-7執行Select@@spidas'ID',system_useras'LoginName',useras'UserName',返回用戶ID、登錄名及用戶名信息,如圖7-4所示。7.2.2

全局變量圖7-4用戶ID、登錄名及用戶名信息7.3程序控制語句SQLServer支持結構化的編程方法,結構化編程中程序流程控制的三大結構是順序結構、選擇結構和循環結構。T-SQL提供了實現這3種結構的流程控制語句,使用這些流程控制語句可以控制命令的執行順序,以便更好地組織程序。7.3

程序控制語句begin…end語句相當于其他語言中的復合語句,如C語言中的{}。它用于將多條T-SQL語句封裝為一個整體的語句塊,即將begin…end內的所有T-SQL語句視為一個單元執行。在實際應用中,begin…end語句一般與if…else、while等語句聯用,當判斷條件符合需要執行兩個或多個語句時,就需要使用begin…end語句將這些語句封裝為一個語句塊。begin…end語句塊允許嵌套。7.3.1

begin…end語句其語法格式如下:begin{SQL語句塊|程序塊}end該語句適用于以下情況:while循環需要包含多條語句,case函數的元素需要包含多條語句,if或else子句中需要包含多條語句。7.3.1

begin…end語句例7-8在數據庫studscore_ds1的職工信息表employees中,查詢001號員工是否存在,如果有則刪除該員工,并顯示提示信息。代碼如下:usestudscore_ds1ifexists(select*fromemployeeswhereempid='001')begindeletefromemployeeswhereempid='001'print'001employeeisdeleted!'endelseprint'001employeenotfound!'7.3.1

begin…end語句if…else語句是條件判斷語句,用以實現選擇結構。當if后的條件成立時就執行其后的T-SQL語句,條件不成立時執行else語句后的T-SQL語句。其中,else子句是可選項,如果沒有else子句,當條件不成立時則執行if語句后的其他語句。其語法格式如下:if<條件表達式>{SQL語句塊|程序塊}[else{SQL語句塊|程序塊}]7.3.2

單條件分支語句語法說明:①條件表達式是作為執行和判斷條件的布爾表達式,返回“true”或“false”。如果布爾表達式中含有select語句,則必須用圓括號將select語句括起來。②程序塊是一條T-SQL語句或一個begin…end語句塊。③if…else語句允許嵌套使用,可以在if之后或在else的下面嵌套另一個if語句。嵌套級數的限制取決于可用內存。7.3.2

單條件分支語句例7-9在數據庫studscore_ds1的學生成績sc表中,查詢是否存在考90分及以上的學生信息;有則顯示結果,無則顯示“沒有考90分及以上的學生”。代碼如下:usestudscore_ds1ifexists(select*fromscwherestudscore>=90)beginprint'有考90分及以上的學生'select*fromscwherestudscore>=90endelseprint'沒有考90分及以上的學生'7.3.2

單條件分支語句if…elseif…else語句用于多條件分支執行。其語法格式如下:if<條件表達式>{SQL語句塊|程序塊}elseif<條件表達式>{SQL語句塊|程序塊}…else{SQL語句塊|程序塊}7.3.3

多條件分支語句1.if多條件分支elseif@avgsc>=80set@scorelevel='良好'elseif@avgsc>=70set@scorelevel='中等'elseif@avgsc>=60set@scorelevel='及格'elseset@scorelevel='不及格'print@scorelevel7.3.3

多條件分支語句1.if多條件分支12例7-10

在數據庫studscore_ds1的sc表中,使用if多條件分支語句判斷學生的成績等級,并顯示該學生的等級。代碼如下:usestudscore_ds1declare@avgscnumeric(5,1),@scorelevelvarchar(10)select@avgsc=(selectavg(score)fromscwheres#='2018010101')if@avgsc>=90set@scorelevel='優秀'case語句和if…else語句一樣,用來實現選擇結構,case語句避免了多重嵌套,更加簡潔清晰。T-SQL中的case語句可分為簡單case語句和搜索case語句兩種。

1)簡單case語句2)搜索case語句命令方式修改數據庫7.3.3

多條件分支語句2.case多條件分支其語法格式如下:case<運算式>when<運算式>then<運算式>...when<運算式>then<運算式>[else<運算式>]end7.3.3

多條件分支語句2.case多條件分支1)簡單case語句參數說明:①case后的表達式用于和when后的表達式逐個進行比較,兩者的數據類型必須是相同的,或者是可以進行隱式轉換的。②then后面給出當case后的表達式與when后的表達式相等時,要返回的結果表達式。7.3.3

多條件分支語句2.case多條件分支1)簡單case語句簡單case語句的執行過程是:首先計算case后面表達式的值,然后按指定順序對每個when子句后的表達式進行比較。當遇到與case后表達式值相等的,則執行對應的then后的結果表達式,并退出case結構;若case后的表達式值與所有when后的表達式均不相等,則返回else后的結果表達式;若case后的表達式值與所有when后的表達式均不相等,且“else結果表達式”部分被省略,則返回“null”值。7.3.3

多條件分支語句2.case多條件分支1)簡單case語句when1then'A'when2then'B'when3then'C'when4then'D'when5then'E'else'others'endprint'theansweris'+@answer7.3.3

多條件分支語句12例7-11

產生一個0~1之間的隨機數,然后使用簡單case語句給出變量的值,并顯示結果。代碼如下:declare@aint,@answerchar(10)set@a=cast(rand()*10asint)print@aset@answer=case@a2.case多條件分支1)簡單case語句其語法格式如下:casewhen<條件表達式>then<運算式>...when<條件表達式>then<運算式>[else<運算式>]end參數說明:case后面沒有表達式。when后面的條件表達式是作為執行和判斷條件的布爾表達式。7.3.3

多條件分支語句2.case多條件分支2)搜索case語句搜索case語句的執行過程是:首先測試when條件表達式,若為真,則執行then后面的結果表達式,否則進行下一個條件表達式的測試;若所有when后面的條件表達式都為假,則執行else后面的結果表達式;若所有when后面的條件表達式都為假,且“else結果表達式”部分被省略,則返回“null”。7.3.3

多條件分支語句2.case多條件分支2)搜索case語句例7-12

在表employees中,計算平均工資,然后分析判斷員工工資的總體情況。代碼如下:declare@avgsalaryfloat,@salarylevelnchar(50)select@avgsalary=(selectavg(salary)fromemployees)set@salarylevel=casewhen@avgsalary>=15000then'偏高收入!'when@avgsalary>=8500then'高收入!'when@avgsalary>=3500then'中等收入!'when@avgsalary>=1500then'大于最低標準!'else'無保障收入'endselect@salarylevel7.3.3

多條件分支語句2.case多條件分支2)搜索case語句while語句用于實現循環結構,其功能是在滿足循環條件的情況下,重復執行T-SQL語句或語句塊。當while后面的條件為真時,就重復執行begin…end之間的語句塊。while語句塊中的continue和break是可選項。若有continue語句,則其功能是跳過continue后的語句,執行下一次循環條件測試。若遇到break語句,則其功能是立即終止循環,結束整個while語句的執行,并繼續執行while語句后的其他語句。7.3.4

循環語句其語法格式如下:while條件表達式begin程序塊[break]程序塊[continue]程序塊end參數說明:條件表達式是作為執行和判斷的布爾表達式,返回“true”或“false”。如果布爾表達式中含有select語句,則必須用圓括號將select語句括T-SQL語句或一個begin…end語句塊。7.3.4

循環語句printconvert(char(3),@i)--convert()轉換函數,轉換為字符set@n=@n+1endset@i=@i+1endprint'1-100能被7整除的數共計'+convert(char(3),@n)+'個'12例7-13

進行T-SQL編程,輸出1~100之間能被7整除的數,并且最后輸出總個數。代碼如下:declare@iint,@nintselect@i=1,@n=0print'1-100能被7整除的數:'while@i<=100beginif(@i%7)=0begin7.3.4

循環語句例7-14

使用while循環語句,計算s=1!+2!+3!+4!+5!。代碼如下:declare@iint,@jint,@sintset@i=1set@j=1set@s=0while@i<=5beginset@j=@j*@iset@s=@s+@jset@i=@i+1endprint's=1!+2!+3!+4!+5!='+convert(char(5),@s)7.3.4

循環語句例7-15

使用while循環語句,計算出1~10之間偶數的平方和,并輸出結果。代碼如下:declare@iint,@sumintselect@i=1,@sum=0while@i<=10beginif@i&1=0--使用&運算符beginset@sum=@sum+@i*@iendset@i=@i+1endprint@sum7.3.4

循環語句goto語句是轉向語句,讓程序跳轉到一個指定的標簽處并執行其后的代碼。goto語句和標簽可以在程序、批處理和語句塊中的任意位置使用,也可以嵌套使用。其語法格式如下:定義標簽label:改變執行gotolabel參數說明:若有goto語句指向label標簽,則其為處理的起點。標簽必須符合標識符規則。7.3.5

goto語句例7-16

結合使用T-SQL編程的goto語句求10!,并顯示計算結果。代碼如下:declare@sint,@timesintselect@s=1,@times=1label1:--定義語句標號set@s=@s*@timesset@times=@times+1if@times<=10gotolabel1print'10!='+str(@s)7.3.5

goto語句return語句用于結束當前程序的執行,無條件地終止一個查詢、存儲過程或批處理,返回到上一個調用它的程序或其他程序;在括號內可指定一個返回值。其語法格式如下:return[integer_expression]參數說明:integer_expression為返回的整型值。存儲過程可以給調用過程或應用程序返回整型值。7.3.6

eturn語句例7-17

創建一個存儲過程,通過return語句返回一個值,用于判斷員工表employees是否存在該員工。代碼如下:createprocedurecheck_employee(@empidvarchar(50))asifexists(select*fromemployeeswhereempid=@empid)return1elsereturn-100該題目中,找到該員工則返回“1”,否則返回“-100”。7.3.6

eturn語句waitfor語句用于在達到指定時間或時間間隔之前阻止執行批處理、存儲過程或事務,直到所設定的時間已到或等待了指定的時間間隔之后才繼續往下運行。其語法格式如下:waitfordelay等待時間|time完成時間7.3.7waitfor語句參數說明:(1)“delay等待時間”是指定可以繼續執行批處理、存儲過程或事務之前必須經過的指定時間段,最長可為24小時。可使用datetime數據可接受的格式之一指定“等待時間”,也可以將其指定為局部時間,但不能指定日期,因此不允許指定datetime值的日期部分。7.3.7waitfor語句(2)“time完成時間”是指定運行批處理、存儲過程或事務的具體時刻。可以使用datetime數據可以接受的格式之一指定“完成時間”,也可以將其指定為局部變量,但不能指定日期,因此不允許指定datetime值的日期部分。例7-18

在10點盤點,從sales表中查詢當前的銷售情況。這里的時間是服務器時間,而不是客戶端時間。代碼如下:beginwaitfortime'10:00:00'select*fromsalesend7.3.7waitfor語句在T-SQL中可以使用兩類注釋符。ANSI標準的注釋符“--”用于單行注釋,/**/用于多行注釋。1)2)聚集索引非聚集索引7.3.8注釋語句其語法格式如下:--text_of_comment參數說明:兩個連字符(--)是SQL-92標準的注釋指示符。text_of_comment為包含注釋文本的字符串。7.3.8注釋語句1.單行注釋其語法格式如下:/*text_of_comment*/參數說明:text_of_comment為包含注釋文本的字符串。2.多行注釋腳本是存儲在文件中的一系列SQL語句,即一系列按順序提交

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論