--索引(index)和視圖(view)--
--索引(index)--
--概述:
數據庫中的索引類似於書籍的目錄,他以指針形式包含了表中一列或幾列組合的新順序,實現表中數據庫的邏輯排序。索引創建在數據表或者視圖的字段上,生成索引頁,存放於數據庫中。
--分類:在SQL Server中,根據索引的作用和存儲方式的不同,將索引分為聚集索引和非聚集索引兩類。
1)聚集索引 :指數據庫的物理順序與被創建索引的字段順序完全相同。同一個數據表最多只能創建一個聚集索引。默認情況下主鍵自動被創建為聚集索引。聚集索引通常被創建在經常被查詢的字段上,以提高查詢效率。
2)非聚集索引 :非聚集索引並不改變數據表的物理順序,而是生成一個索引文件,用來存放索引順序的指針地址。系統通過在索引文件中查找到的地址與數據表中的數據進行關聯,進而顯示查詢結果。一張數據表最多允許創建254個非聚集索引,多列的復合索引最多允許創建在16個列上。
--作用:
索引的主要作用是用來提高查詢效率。在數據庫的查找過程中,對於無索引的數據表,系統會從表的第一行逐漸查找到最後一行,從而找出滿足條件的記錄信息;而對於設置了索引的數據表,系統會先使用索引查找到數據的存儲位置,找到後再到數據表中找出對應數據記錄的詳細信息,但滿足查找條件的記錄後面出現了不滿足條件的記錄時,系統將不再繼續查找,這樣無需掃描全表,從而提高查詢效率。
--創建索引--
注:由於約束屬性的限制,數據表中字段被設置了主鍵約束和唯一約束時,將為主鍵約束設置唯一的聚集索引,為唯一約束設置唯一的非聚集索引。若要創建索引,可以使用管理器或者T-SQl語言。
create [unique] [ clustered| nonclustered] index 索引名 --create表示創建,index表示索引。“索引名”須符合命名規則,且不能與已存在的索引重名。可選項unique表示唯一屬性,clustered表示聚集 屬性,nonclustered表示非聚集屬性。不加這兩個關鍵字,默認為非聚集、非唯一索引。
on 表名 (字段名1,字段名2 ...)
例:(為 "商品管理數據庫"中“商品信息表”的“商品類型名”字段創建一個名為“IX_商品類型表_商品類型名”的非聚集唯一索引)
use 商品管理數據庫
go
create unique nonclustered
index IX_商品類型表_商品類型名
on 商品類型表(商品類型名)
--查看索引--
exec sp_helpindex 數據表名
例:(查看“商品管理數據庫”的“商品類型表”的索引)
use 商品管理數據庫
go
exec sp_helpindex 商品類型表
--修改索引--
1)修改索引名稱:
exec sp_rename '數據表名.舊索引名','新索引名'
例:
use 商品管理數據庫
exec sp_rename '商品類型表.IX_商品類型表_商品類型名','IX_商品類型名'
2)修改不依賴於約束的索引屬性:
“對象資源管理器”——“服務器”——“數據庫”——要修改的數據庫——“表”——要修改的數據表——“索引”——右鍵單擊要修改的索引——“索引屬性”——去掉“唯一”屬性的選項
3)修改依賴於約束的索引屬性:
“對象資源管理器”——“服務器”——“數據庫”——要修改的數據庫——“表”——要修改的數據表——右鍵單擊“設計”打開“表設計器”——右鍵單擊“列名”選擇“索引/鍵”——選中要修改的索引(主鍵約束) ,在右側屬性窗口中“表設計器”——“創建為聚集”屬性——修改為“否”
--刪除索引--
drop index 表名.索引名
例:(刪除“商品管理數據庫”的“商品類型表”中名為“IX_商品類型表”的索引)
use 商品管理數據庫
go
drop index 商品類型表.IX_商品類型名
--視圖(view)--
--概述:
視圖是基於數據庫中原始數據表(基表)而生成的虛擬表。其內容由查詢定義,同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。視圖中的數據可以來源於一行或者多張基本表,也可以來源於基本表和視圖的查詢組合。由於視圖中的數據不是真實存在而是源於基本表,因此基本表中的數據發生變化後,查看視圖時視圖中的查詢結果也會隨之發生變化。一般情況下不能通過視圖修改表中數據信息,而要通過修改基本表實現。簡單地說,視圖即是把select語句的查詢結果保存起來,以便日後使用。
--作用:1)簡化操作。2)結果直觀。3)提升安全。4)導出保存。
--創建視圖--
create view 視圖名 [with encryption] as select 查詢語句 --create view 表示創建視圖。with encryption 命令用來創建視圖的代碼或過程加密。as 關鍵字後面跟隨滿足select語句語法格式的查詢語句。
例:(在“商品管理數據庫”中查詢出2012年11月2日進貨商品的信息,要求顯示出商品編號、商品名稱、進貨數量和進貨日期字段信息,將結果創建到名為“v_商品_進貨”的視圖中) use 商品管理數據庫 go create view vs_商品_進貨成功 as select 商品信息表.商品編號,商品名稱,進貨數量,進貨日期,'進貨成功' '備注' from 商品信息表,進貨信息表 where 商品信息表.商品編號=進貨信息表.商品編號 and 進貨日期='2012-11-02' 例:(在“商品管理數據庫”中查詢出商品名稱中帶“酒”的商品的詳細銷售信息(顯示商品編號、商品名稱、銷售單價、銷售數量、銷售金額、客戶姓名和銷售日期)) use 商品管理數據庫 go create view v_銷售信息 as select 商品信息表.商品編號,商品名稱,銷售單價,銷售數量,銷售金額,客戶姓名,銷售日期 from 銷售信息表 join 商品信息表 on 銷售信息表.商品編號=商品信息表.商品編號 join 客戶信息表 on 客戶信息表.客戶編號=銷售信息表.客戶編號 where 商品信息表.商品名稱 like '%酒%'理解例子
--查詢視圖--
1)查詢視圖結果
select * | [字段名列表] from 視圖名 [where 條件表達式]
例:(查詢“v_商品 _進貨”視圖中的商品進貨信息)
select * from v_商品_進貨成功
例:(查詢“v_商品 _進貨”視圖中進貨數量大於等於300的商品進貨信息)
use 商品管理數據庫
go
select * from v_商品_進貨成功 where 進貨數量>=300
2)查詢視圖創建信息
exec sp_helptext 視圖名
例:(查看“商品管理數據庫”中名為“V_商品_進貨”的視圖的創建信息)
use 商品管理數據庫
go
exec sp_helptext v_商品_進貨成功
--修改視圖--
1)修改視圖名
exec sp_rename 舊視圖名,新視圖名
例:
use 商品管理數據庫
go
exec sp_rename v_商品_進貨成功,v_商品信息_進貨成功
2)修改視圖內容
alter view 視圖名 [with encryption] as select 查詢語句 --alter view表示修改視圖,“視圖名 ”必須是已存在的視圖名。其他命令與創建視圖相同。
例:(將“商品管理數據庫”中名為“v_商品_進貨成功”的視圖內容修改為查看2012年11月1日進貨記錄信息)
use 商品管理數據庫
go
alter view v_商品_進貨成功
as
select 商品信息表.商品編號,商品名稱,進貨數量,進貨日期
from 商品信息表,進貨信息表
where 商品信息表.商品編號=進貨信息表.商品編號
and 進貨日期='2012-11-01'
--刪除視圖--
drop view 視圖名
例:(將“商品管理數據庫”中名為“v_商品_進貨成功”的視圖刪除)
use 商品管理數據庫
go
drop view v_商品_進貨成功
注:"--"可看成說明或者注釋文本