MySQL視圖了解
視圖是什麽
視圖是一種虛擬存在的表,不會在數據庫中實際存在。相比較普通的表,有如下優勢
- 簡單:使用視圖的用戶完全不需要關心後面對應的表的結構、關聯條件和篩選條件,對用戶來說已經是過濾好的復合條件的結果集
- 安全:使用視圖的用戶只能訪問被允許查詢的結果集,對表的管理權限並不能限制到某個行某個列,但是通過視圖就可以簡單地實現
- 數據獨立:一旦視圖的結構確定了,可以屏蔽表結構變化對用戶的影響,源表增加列對視圖沒有影響;源表修改列名,則可以通過修改視圖來解決,不會造成對訪問者的影響
視圖操作
視圖的操作包括創建或者修改視圖、刪除視圖、以及查看視圖定義
創建或者修改視圖
創建視圖需要有CREATE VIEW的權限,並且對於查詢涉及的列有SELECT權限。如果使用CREATE OR REPLACE或者ALTER修改視圖,那麽還需要該視圖的DROP權限
創建視圖的語法為:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
修改視圖的語法為:
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
以northwind數據庫示例中的產品表和供應商表為例創建一個視圖:
MySQL的視圖定義有一定的限制,如,在FROM關鍵字後面不能包含子查詢。但可以將子查詢的內容先定義成一個視圖,再對該視圖創建視圖即可
視圖更新
視圖的可更新性與視圖中查詢的定義是有關系的。以下類型的視圖是不可更新的
- 包含以下關鍵字的sql語句:聚合函數、DISTINCT、GROUP BY、HAVING、UNION或者UNION ALL
- 常量視圖
- SELECT中包含子查詢
- JOIN
- FROM一個不能更新的視圖
- WHERE字句的子查詢引用了FROM字句中的表
WITH [CASCADED | LOCAL] CHECK OPTION 決定了是否允許更新數據使記錄不再滿足視圖的條件
- LOCAL 只要滿足本視圖的條件就可以更新
- CASCADED 則必須滿足所有針對該視圖的所有視圖的條件才可以更新,默認值為CASCADED
查看視圖
在目前的MySQL版本中,已摒棄了使用SHOW VIEWS查看視圖的方法,使用SHOW TABLES不僅可以顯示表,同時也可顯示視圖
例如,重新創建一個"產品_供應商_view"視圖,並且使用SHOW TABLES查看
CREATE OR REPLACE VIEW 產品_供應商_view AS
SELECT `產品`.`產品ID`, `產品`.`產品名稱`, `產品`.`單位數量`, `供應商`.`公司名稱`, `供應商`.`城市`
FROM `產品`, `供應商`
WHERE `產品`.`供應商ID` = `供應商`.`供應商ID`
使用SHOW TABLES查看結果:
使用SHOW TABLE STATUS也可查看視圖的信息
SHOW TABLE STATUS LIKE ‘產品_供應商_view‘ \G
查詢定義視圖的語句
視圖數據查詢
視圖"產品_供應商_view"的數據結構如圖所示
現在通過視圖查詢出一些數據
也可以使用GROUP BY等條件限制查詢
視圖數據修改
使用UPDATE語句可對視圖中的數據進行修改。如
UPDATE `產品_供應商_view` SET `產品名稱` = ‘果粒橙‘ WHERE `產品ID` = 1
可以看到,視圖中的第一條記錄中的產品名稱已變為"果粒橙",那麽視圖中的數據改變了,源表中的數據是不是也改變了呢?
事實上源表中的數據也發生了變化
視圖數據刪除
既然視圖中的數據可以修改,而且源表也隨之變化。那麽,如果刪除視圖中的數據,源表會如何變化呢
由於此視圖是由產品表和供應商連接查詢而創建的,所以為了保證數據的完整性,是不能夠刪除視圖中的記錄
刪除視圖
用戶可以一次刪除一個或多個視圖,但要求用戶必須有該視圖的DROP權限
語法:DROP VIEW [IF EXISTS] view_name [, view_name]...[RESTRICT | CASCADE]
例如,要刪除上文中創建的視圖"產品_供應商_view"
此時,視圖"產品_供應商_view"已被刪除
MySQL視圖了解