1. 程式人生 > >MySQL視圖了解

MySQL視圖了解

進行 bsp 記錄 創建 供應商 rop union def 完整性

視圖是什麽

  視圖是一種虛擬存在的表,不會在數據庫中實際存在。相比較普通的表,有如下優勢

  • 簡單:使用視圖的用戶完全不需要關心後面對應的表的結構、關聯條件和篩選條件,對用戶來說已經是過濾好的復合條件的結果集
  • 安全:使用視圖的用戶只能訪問被允許查詢的結果集,對表的管理權限並不能限制到某個行某個列,但是通過視圖就可以簡單地實現
  • 數據獨立:一旦視圖的結構確定了,可以屏蔽表結構變化對用戶的影響,源表增加列對視圖沒有影響;源表修改列名,則可以通過修改視圖來解決,不會造成對訪問者的影響

視圖操作

  視圖的操作包括創建或者修改視圖、刪除視圖、以及查看視圖定義

創建或者修改視圖

  創建視圖需要有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視圖了解