視圖實際上就是一個存儲查詢,重點是可以混合和匹配來自基本表(或其他視圖)的數據,從而創建在很多方面象另一個普通表那樣的起的作用。可以創建一個簡單的查詢,僅僅從一個表(另一個視圖)選擇幾列或幾行,而忽略其他行或列,或者也可以創建一個複雜查詢。連接幾個表查詢,使得這些連接查詢看起來更像一個表。 對視圖的 ...
視圖實際上就是一個存儲查詢,重點是可以混合和匹配來自基本表(或其他視圖)的數據,從而創建在很多方面象另一個普通表那樣的起的作用。可以創建一個簡單的查詢,僅僅從一個表(另一個視圖)選擇幾列或幾行,而忽略其他行或列,或者也可以創建一個複雜查詢。連接幾個表查詢,使得這些連接查詢看起來更像一個表。
對視圖的使用往往不是過多或者就是不夠-很少是正好的。學完視圖應當可以使用視圖達到以下的目的:
1.為終端用戶減少明顯的數據複雜性。
2.防止敏感列被選擇,但是仍然提供對其他數據訪問。
3.給資料庫添加額外的索引提高查詢性能-甚至在沒有使用索引所基於的視圖也是如此。
視圖基本語法:CREATE VIEW <view name> AS <select statement>.是不是看起來很簡單。當然這上面的語法代表最簡化的語法,對於大多數來說。已經夠用了。擴展的語法如下:CREATE VIEW <view name> [WITH [ENCRYPTION][,] SCHMABINDING ][[,] VIEW_METADATA] AS <SELETE statement> [WITH CHECK OPTION][;]
下麵將分別講述上面代碼每一分,但是先看下最簡單的視圖。極其簡單視圖。
use AdventureWorks --我們接著用AdventureWorks這個資料庫 CREATE VIEW vw_ContactPhone --創建一個返回用戶手機的視圖 AS SELECT (FirstName+'.'+LastName) AS UserName,Phone FROM Person.Contact --命令已成功完成。 SELECT * FROM vw_ContactPhone --使用視圖(看起來和查詢表差不多)
創建視圖沒有真正的改變任何內容。只是通過了所訪問數據過濾,這樣做的好處是為終端用戶減少數據複雜性,在現在的這個時代有大量工具是用戶變得更簡單。這看起來沒有了不起的,但對於用戶來說,的確減少減少複雜性。
註意:要意識到,在預設情況下,對於視圖而言沒有特別要做事情。視圖就像命令行執行查詢命令那樣雲信。沒有任何預先優化的過程。這意味著在數據的請求和所交付數據之間提供額外一層系統開銷,視圖運行速度總是比直接運行內部的SELECT 語句要滿。也就是說視圖,視圖的存在有一個理由,即對於用戶而言是安全和簡化的 。因此在需求和系統開銷之間尋求平衡以適合特定的情況
使用過濾器視圖:
SELECT * FROM vw_ContactPhone WHERE Phone LIKE '334%' --用上一個創建視圖,查詢區號開始是 %334的號碼(10條結果)
使用更複雜的視圖:管理人員希望簡單查詢瞭解客戶訂購了那些訂單,這些訂單訂單頂過那些零件。以及那個帳號訂購的。下麵是創建一個執行非常簡單查詢的視圖。
USE AdventureWorks GO CREATE VIEW vw_CustomerOrders AS SELECT sc.AccountNumber,soh.SalesOrderID,soh.OrderDate,sod.ProductID,pp.Name,sod.OrderQty,sod.UnitPrice,(sod.UnitPriceDiscount*sod.UnitPrice*sod.OrderQty) AS TatolDisCount,sod.LineTotal FROM Sales.Customer AS sc inner join Sales.SalesOrderHeader AS soh on sc.CustomerID=soh.CustomerID Inner join Sales.SalesOrderDetail AS sod on soh.SalesOrderID=sod.SalesOrderID inner join Production.Product as pp on sod.ProductID=pp.ProductID
不需要過多培訓,管理人員都可以獲取他們想要的數據了。
通過WITH CHECK OPTION 限制插入到視圖中的內容。
WITH CHECK OPTION是sql server中鮮為人知功能之一。規則很簡單-為了使用視圖更新或者插入數據。結果必須符合以顯示在視圖結果中。重申一下,插入或者更新的行必須滿足視圖中SELECT 語句中使用WHERE 條件。不會針對到到基表限制。
刪除視圖:DROP VIEW <view name>,[<view name>,<......,n>];
讓視圖和表一樣,創建索引。只需要在AS前面加上:WITH SCHEMABINDING
CREATE VIEW vw_ContactPhoneIndex --創建一個可以建立索引返回用戶手機的視圖 WITH SCHEMABINDING AS SELECT (FirstName+'.'+LastName) AS UserName,Phone FROM Person.Contact --命令已成功完成。
保護代碼加密:只需要在AS前面加上:WITH ENCRYPTION,記得備份自己的數據。
CREATE VIEW vw_ContactPhoneEncry --創建一個加密引返回用戶手機的視圖 WITH ENCRYPTION AS SELECT (FirstName+'.'+LastName) AS UserName,Phone FROM Person.Contact --命令已成功完成。。 GO exec sp_helptext vw_ContactPhoneEncry --對象 'vw_ContactPhoneEncry' 的文本已加密。