SQL應用與開發:(四)視圖的應用,sql應用開發視圖
視圖是根據預定義的查詢建立起來的一個表,它的定義以模式對象的方式存在。同基表一樣,視圖包含一系列帶有名稱的列和行資料,但是與持久基表不同的是,在視圖中沒有儲存任何資料。行和列的資料來自由定義視圖的查詢所引用的基表,並且在應用視圖時動態產生。而正是由於視圖所對應的資料並不實際地以視圖結構儲存在資料庫中,而是儲存在視圖所引用的表中,所以說視圖是一個虛擬表。
對其中多引用的基表來說,視圖的作用類似於篩選。定義視圖的篩選可以來自當前或其他資料庫的一個或多個表,或者其他視圖。也就是說,視圖是資料庫中某些表或其他視圖中資料的特定子集。一旦定義了一個視圖,就可以像使用基本表一樣使用它。
1.瞭解視圖
視圖結合了基表和查詢兩者的特性:使用者可以從一個或者多個相關的基表中提取一個資料集(查詢特性);使用者能運用視圖去更新視圖中的資訊,並且永久地儲存結果到磁碟(表特性)。
視圖也可用作安全機制,方法是允許使用者通過視圖訪問資料,而不授予使用者直接存取基表的許可權。
視圖的優點主要表現在一下幾點:
資料集中顯示:視圖使使用者著重於他們感興趣的某些特定資料和他們所負責的特定任務,可以提高資料操作效率。
簡化對資料的操作:視圖可以大大簡化使用者對資料的操作。可以經常使用串連、投影、聯集查詢或選取查詢定義視圖,這樣在每次執行相同的查詢時,不必重新寫這些複雜的查詢語句,只要一條簡單的查詢檢視語句即可。可見視圖向使用者隱藏了表與表之間的複雜的串連操作。
自訂資料:視圖能夠讓不同的使用者以不同的方式看待不同或相同的資料集。即是不同水平的使用者共同用一資料庫時也是如此。
匯出和匯入資料:可以使用視圖將資料匯出至其他應用程式。
合并分割資料:在某些情況下,由於表中資料量太大,在表的設計過程中可能需要經常將表進行水平分割或垂直分割,然而這樣表的結構的變化會對應用程式產生不良的影響。使用視圖就可以重新保持原有的結構關係,從而使外模式保持不變,原有的應用程式仍可以通過視圖來重載資料。
安全機制:視圖可以作為一種安全機制。通過視圖使用者只能查看和修改他們所能看到的資料。其他資料庫或表既不可見也不可以訪問。如果某一使用者想要訪問視圖的結果集,必須授予其存取權限。視圖所參考資料表的存取權限與視圖許可權的設定互不影響。
2.視圖操作
2.1“增”操作
建立可更新視圖的基本語句:
CREATE VIEW <view_name> [(<view_column_name>)]
AS <query_expression>
[WITH CHECK OPTION]
其中,預留位置<view_name>表示所建立的視圖的名稱,預留位置<view_column_name>表示視圖提供的列名,預留位置<WITH CHECK OPYION >表示通過視圖修改行時,確認提交修改後,仍可通過視圖看到修改的資料。
例如,在資料庫“銷售管理系統”中建立一個名為“客戶_VIEW”的視圖,該視圖包含列“業務員編號”和“接待顧客人數”,其執行語句如下:
CREATE VIEW 客戶_VIEW(業務員編號,接待顧客人數)
AS
SELECT 所屬業務員編號,COUNT(客戶姓名)
FROM 客戶資訊
GROUP BY 所屬業務員編號
執行上述語句後,會在相應的資料庫中建立一個名為“客戶_VIEW”的視圖,從該視圖中可以查詢每個業務員所接待的客戶數。
如果建立一個視圖該視圖沒有匯總或聚集資料,每一列都與一個基表中的一個源列相對應,並且每一行都與一個基表中的一個源行對應,則這個視圖便是一個可更新的視圖。例如,在資料庫“銷售管理系統”中,建立一個名為“業務員_VIEW”的視圖,該視圖中的列來自基表“業務員資訊”中的列“業務員姓名”、“家庭住址”、“電話”。
CREATE VIEW 業務員_VIEW
AS
SELECT 業務員編號,業務員姓名,家庭住址,電話
FROM 業務員資訊
在建立視圖的語句中,WITH CHECK OPTION 子句使用與在SELECT語句中包含WHERE子句的可更新視圖。例如,將上述視圖“業務員_VIEW”改為姓王的業務員資訊。
CREATE VIEW 業務員_VIEW
AS
SELECT 業務員編號,業務員姓名,家庭住址,電話
FROM 業務員資訊
WHERE 業務員姓名 LIKE '王%'
這樣如果在視圖“業務員_VIEW”中只包含姓王的業務員資訊。如果在視圖中添加一個業務員資訊,但是該業務員不姓王,那麼更新這個視圖將會不一樣。由於這個視圖是可更新的,所以允許上述設定。但是,如果緊接著再調用這個視圖,那麼使用者將不能夠看到剛被更新的行,也無法對其進一步地更新。
但是如果在建立視圖定義的末尾添加 WITH CHECK OPTION 子句,如下語句:
CREATE VIEW 業務員_VIEW
AS
SELECT 業務員編號,業務員姓名,家庭住址,電話
FROM 業務員資訊
WHERE 業務員姓名LIKE '王%' WITH CHECK OPTION
這時如果再次向視圖中添加一個不姓王的業務員資訊,系統將會彈出一個出錯訊息,告訴使用者不能這樣修改。所以,使用WITH CHECK OPTION 子句可以保證使用者所執行的更新不會阻止他們有效地使用建立的更新。
實戰演練:
1.使用CREATE VIEW 語句建立視圖:
CREATE VIEW 入庫單_VIEW(入庫單編號,入庫數量,入庫金額)
AS
SELECT 入庫單編號,入庫數量,入庫商品金額
FROM 入庫單明細資訊
WHERE 入庫商品金額>10000
利用SELECT 語句對該視圖進行查看:
SELECT *
FROM 入庫單_VIEW
根據上述代碼的解釋,大家應該可以看懂,其所表述的意思,不再累述。
2.下面舉一個基於計算的建立視圖:
在資料庫“銷售管理系統”中,建立一個名為“商品資訊_VIEW1”的視圖,該視圖的列基表“商品資訊”,並且在視圖中返回“單價”打八折後的商品資訊。
CREATE VIEW 商品資訊_VIEW1(商品名稱,供應商編號,價格)
AS
SELECT 商品名稱,供應商編號,單價*0.8
FROM 商品資訊
2.2“刪”操作
當不需要一個視圖時可把他刪除掉,用DROP VIEW從當前資料庫中刪除視圖,刪除視圖的基本文法結構為:
DROP VIEW <view_name>
執行DROP VIEW語句後,視圖定義將被刪除,但是它對儲存在基表中的資料沒有任何影響,這與刪除表不一樣。在刪除視圖後,既可以重建這個視圖,也可以建立使用同一名稱的不同視圖。
例如,刪除資料庫“銷售管理系統”中的視圖“商品資訊_VIEW”,用下述語句實現:
DROP VIEW 商品資訊_VIEW
刪除一個視圖後,雖然對於它所基於的表和資料來說,不會受到任何影響,但是對於依賴於改視圖的其他對象或查詢來說,將會執行時出現錯誤。
2.3“改”操作
如果基表發生了變化,或者要通過視圖查詢更多的資訊,都需要修改視圖的定義。要改變一個已經建立的視圖的定義,應該使用ALTER VIEW語句,其基本的文法格式:
ALTER VIEW <view_name>[(view_column_name)]
AS<query_expression>
[WITH CHECK OPTION]
其中各參數與CREATE VIEW語句中相同。
例如,在資料庫“珠寶營銷系統”中,基於“珠寶資訊”表建立了一個名為“珠寶資訊_VIEW”的視圖,該視圖中包含列“珠寶商編號”、“珠寶名稱”和“珠寶單價”,並且該視圖只接受“珠寶售價”大於450的資訊。通過下屬CREATE VIEW語句建立視圖:
CREATE VIEW 珠寶資訊_VIEW
AS
SELECT 珠寶商編號,珠寶名稱,珠寶售價
FROM 珠寶資訊
WHERE 珠寶售價>450
執行上述語句建立視圖後,通過下屬SELECT語句來查看視圖中的資訊:
SELECT *
FROM 珠寶資訊_VIEW
執行後,便得到了我們珠寶售價大於450的珠寶相關資訊。
然後對視圖“珠寶資訊_VIEW”的定義進行修改。將視圖中返回的行限定為“珠寶售價”大於550的資訊。則用下述的語句進行修改該視圖的定義:
ALTER VIEW 珠寶資訊_VIEW
AS
SELECT 珠寶商編號,珠寶商名稱,珠寶售價
FROM 珠寶資訊
WHERE 珠寶售價>550
成功執行上述語句後,使用SELECT語句查看修改後的視圖中資訊:
SELECT *
FROM 珠寶資訊_VIEW
執行後,便得到了我們珠寶售價大於550的珠寶相關資訊。
3.通過視圖修改資料
在視圖中對其中的資料進行修改,實際上就是對基表中的資料進行修改。這是由視圖本身的性質決定的,因為視圖是一個虛擬表, 它並不存在資料,資料只是存在於基表中。
如果建立視圖時,在CREATE VIEW語句中,有下列內容,則該視圖中的資料時不可修改的:
SELECT列表中含有DISTINCT;
SELECT列表中含有運算式,諸如計算資料行、函數等;
在FROM子句中引用多個表;
引用不可更新的視圖;
GROUP BY或HAVING子句。
通過視圖修改是通過INSERT、UPDATE和DELECT子句來完成的。
3.1 INSERT語句的使用
舉例來說,在資料庫”銷售管理系統“中,基於”供應商資訊“表建立一個名為”供應商_VIEW“的視圖,該視圖中包含列”供應商編號“、”供應商名稱“、”連絡人姓名“和”聯絡電話“。
CREATE VIEW 供應商資訊-VIEW
AS
SELECT 供應商編號,供應商名稱,連絡人姓名,聯絡電話
FROM 供應商資訊
成功運行上述語句後,開啟視圖”供應商_VIEW“,可以對其中的資訊進行查看。如果要在視圖中添加一行資料,則用INSERT 語句實現:
INSERT INTO 供應商資訊_VIEW
VALUES(1010,'黃河科技','吳奎','13202204586')
然後利用下述SELECT語句對插入的資料行後的視圖查詢:
SELECT *
FROM 供應商資訊_VIEW
查詢結果,便是我們在視圖的最後添加了一行資料,並且開啟相應的基表,在基表的最後一行也添加了上述資料。
3.2 UPDATE語句的使用
更新視圖中資料和更新基表中的資料的方式一樣,但是當視圖是基於多個基表的資料時,每次更新操作只能是更新來自一個基表中的資料列的值。
例如,將前面建立的視圖”操作人員資訊_VIEW“中,添加的姓名為”張蓉蓉“的操作人員的”聯絡電話“改為 13933456770:
UPDATE 操作人員資訊_VIEW
SET 聯絡電話='13933456770'
WHERE 操作人員姓名='張蓉蓉'
開啟視圖”操作人員資訊_VIEW“,對其中的資料進行查看,發現最後一行中的列”聯絡電話“中的資料變為13933456770。
3.3 DELETE語句的使用
通過視圖刪除資料的方法與通過基表刪除資料的方法一樣,最終還是體現為從基表中刪除資料。當一個視圖基於兩個或者兩個以上的基表時,不允許刪除視圖中的資料。
例如,刪除上述”供應商資訊_VIEW“視圖中天劍的那一行資料。
DELETE FROM 供應商資訊_VIEW
WHERE 供應商編號=1010
執行上述語句後,開啟視圖”供應商資訊_VIEW“,則在最前面添加”供應商編號“為1010的一行資料被刪除;同樣,在基表中的著一行資料也被刪除了。
4.學習小結
視圖,無論是對於使用者還是對於操作人員來說都是一個很重要的工具,簡單來說,就是一個虛擬表,而這個表是你想要的結果,從基表中查詢出來的結果,就展現在這個虛擬表中,滿足應用的情況下,隨時更改你想要的結果,簡單而實用。
通過本章節的學習,感覺資料庫的知識,實用性很強,努力去實戰一下,把知識融會一下。接下來的部落格,依舊是關於資料庫的相關知識的總結,期待吧!