SQL入門經典(六)之視圖


視圖實際上就是一個存儲查詢,重點是可以混合和匹配來自基本表(或其他視圖)的數據,從而創建在很多方面象另一個普通表那樣的起的作用。可以創建一個簡單的查詢,僅僅從一個表(另一個視圖)選擇幾列或幾行,而忽略其他行或列,或者也可以創建一個復雜查詢。連接幾個表查詢,使得這些連接查詢看起來更像一個表。

對視圖的使用往往不是過多或者就是不夠-很少是正好的。學完視圖應當可以使用視圖達到以下的目的:

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 條件。不會針對到到基表限制。

USE panda
go
CREATE VIEW vw_test003
AS
 select ID,OrderDate,name FROM dbo.test003
 where test002ID between 4 and 6
with check option--命令已成功完成。where一定要,表示insert,delete,update 要滿足的條件才能執行命令不會終止
--在測試下添加數據和更新數據會怎么樣
select name from dbo.test003 where ID=7 --查詢數據name=test

update vw_test003 set name='panda_test' where ID=7 --(1 行受影響,test002ID=4)表示修改成功因為test002ID滿足test002ID between 4 and 6 

update vw_test003 set name='panda_test2' where ID=8 --(0條受影響)條件不滿足where。
后面delete,insert看看

insert vw_test003 values(getdate(),'221');--消息 550,級別 16,狀態 1,第 1 行
試圖進行的插入或更新已失敗,原因是目標視圖或者目標視圖所跨越的某一視圖指定了 WITH CHECK OPTION,而該操作的一個或多個結果行又不符合 CHECK OPTION 約束。
語句已終止。為什么呢?因為外鍵約束。我們改下視圖。
ALTER VIEW vw_test003
AS
 select ID,OrderDate,name,test002ID FROM dbo.test003
 where test002ID between 4 and 6
with check option --修改完成
在添加數據,
insert vw_test003 values('2016-6-25','221',4);--(1條收影響表示成功)
DELETE 需要條件,並且滿足條件

第一次查詢的數據

 

執行幾次后的數據

 

刪除視圖: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' 的文本已加密。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM