MySQL資料庫檢視:檢視定義、建立檢視、修改檢視

Kaitiren發表於2018-02-09

檢視是指計算機資料庫中的檢視,是一個虛擬表,其內容由查詢定義。同真實的表一樣,檢視包含一系列帶有名稱的列和行資料。但是,檢視並不在資料庫中以儲存的資料值集形式存在。行和列資料來自由定義檢視的查詢所引用的表,並且在引用檢視時動態生成。——百度百科

關係型資料庫中的資料是由一張一張的二維關係表所組成,簡單的單表查詢只需要遍歷一個表,而複雜的多表查詢需要將多個表連線起來進行查詢任務。對於複雜的查詢事件,每次查詢都需要編寫MySQL程式碼效率低下。為了解決這個問題,資料庫提供了檢視(view)功能。

0 檢視相關的MySQL指令

操作指令程式碼
建立檢視CREATE VIEW 檢視名(列1,列2...) AS SELECT (列1,列2...) FROM ...;
使用檢視當成表使用就好
修改檢視CREATE OR REPLACE VIEW 檢視名 AS SELECT [...] FROM [...];
檢視資料庫已有檢視>SHOW TABLES [like...];(可以使用模糊查詢)
檢視檢視詳情DESC 檢視名或者SHOW FIELDS FROM 檢視名
檢視條件限制[WITH CHECK OPTION]

1 檢視

百度百科定義了什麼是檢視,但是對缺乏相關知識的人可能還是難以理解或者只有一個比較抽象的概念,筆者舉個例子來解釋下什麼是檢視。

朕想要了解皇宮的國庫的相關情況,想知道酒窖有什麼酒,剩多少,窖藏多少年,於是派最信任的高公公去清點,高公公去國庫清點後報給了朕;朕又想知道藏書情況,於是又派高公公去清點並回來報告給朕,又想知道金銀珠寶如何,又派高公公清點。。。過一段時間又想知道藏書情況,高公公還得重新再去清點,皇上問一次,高公公就得跑一次路。

後來皇上覺得高公公不容易,就成立了國庫管理部門,小鄧子負責酒窖,小卓子負責藏書,而小六子負責金庫的清點。。。後來皇上每次想了解國庫就直接問話負責人,負責人就按照職責要求進行彙報。 
檢視

安排專人管理後,每次皇上想要了解國庫情況,就不必讓高公公每次都跑一趟,而是指定的人員按照指定的任務完成指定的彙報工作就可以了。

和資料庫相對應,每次進行查詢工作,都需要編寫查詢程式碼進行查詢;而檢視的作用就是不必每次都重新編寫查詢的SQL程式碼,而是通過檢視直接查詢即可。因此:

檢視是虛擬表,本身不儲存資料,而是按照指定的方式進行查詢。

比如,我們希望從前文提到的四張表,order_baisc,order_details,user和product中查詢所有記錄,需要寫入程式碼指令: 
查詢 
想再次查詢這幾個表中uid為u0001的使用者的記錄,有需要鍵入一次操作指令: 
查詢 
也就是說,每次查詢都得重新鍵入查詢指令SQL程式碼,這種費時費力的體力活,對於時間就是生命的你我來說,是不划算的。所以藉助檢視,來執行相同或相似的查詢。

2 建立檢視

2.1 建立檢視create view 
建立檢視的程式碼為:

>CREATE VIEW 檢視名(列1,列2...)
 AS SELECT (列1,列2...)
 FROM ...;
  • 1
  • 2
  • 3

可以看到,建立檢視和查詢相比,增加了前面的CREATE VIEW 檢視名 AS

2.2 檢視運用

使用檢視和使用表完全一樣,只需要把檢視當成一張表就OK了。檢視是一張虛擬表。

eg:建立order_baisc,order_details,user和product的查詢檢視,並通過檢視查詢uid為u0001的記錄: 
建立檢視

2.3 修改檢視CREATE OR REPLACE VIEW

修改和建立檢視可以使用程式碼:

CREATE OR REPLACE VIEW 檢視名 AS SELECT [...] FROM [...];
  • 1

eg: 
修改檢視

2.4 檢視檢視 
(1)檢視資料庫中有哪些檢視 show tables
 
前面提到,檢視就是虛擬的表,因此,檢視檢視的方法和檢視錶的方法是一樣的:

>SHOW TABLES;
  • 1

檢視檢視

通過show tables;反饋得到所有的表和檢視。同樣的,我們可以通過模糊檢索的方式專門檢視檢視,這個時候,檢視的命令統一採用v_的優勢就體現出來了。 
(2)檢視檢視詳情 
檢視檢視詳情的方法有兩種,一種是和檢視錶詳情一樣使用desc 檢視名,另外一種方法是show fields from 檢視名

>DESC 檢視名;
或者
>SHOW FIELDS FROM 檢視名;
  • 1
  • 2
  • 3

檢視檢視詳情

兩種方法得到的詳情都是一毛一樣的。

3 檢視與資料變更

3.1 表格資料變更 
將表product中的資料進行更新,在通過檢視檢索:

檢視與資料變更

可以看到表格資料變化後,在通過檢視檢索,得到的結果也同步發生了變化,因此,在此證明了:

檢視不是表,不儲存資料,知識一張虛擬表;

3.2 通過檢視變更資料

  • (1)插入資料
>INSERT INTO v_order(pid,pname,price) VALUES('p010','柴油','34');
  • 1

在此查詢檢視,發現插入了資料。

檢視變更資料

  • (2)跨表插入資料 
    通過上圖,我們可以看到,跨表插入資料系統反饋報錯,提示不能修改超過一個表的資料。

因此,可以通過檢視插入資料,但是隻能基於一個基礎表進行插入,不能跨表更新資料。

  • (3)WITH CHECK OPTION 
    如果在建立檢視的時候制定了“WITH CHECK OPTION”,那麼更新資料時不能插入或更新不符合檢視限制條件的記錄。

    eg:對錶product建立一個單價超過3000的檢視,並加上“WITH CHECK OPTION”,之後插入一個價格為42的記錄:

    “WITH CHECK OPTION”

    可以看到系統提示錯誤CHECK OPTION FAILED。因為檢視限制了價格要高於3000. 
    後面再次嘗試了不加“WITH CHECK OPTION”的檢視,後者可以成功插入。

    同樣的,在不加“WITH CHECK OPTION”的情況下,通過檢視修改記錄,也可以成功執行: 
    修改記錄

通過檢視修改,可能導致資料無故消失,因此:

沒有特殊的理由,建議加上“WITH CHECK OPTION”命令。

注意點: 
1. 檢視不是表,不直接儲存資料,是一張虛擬的表; 
2. 一般情況下,在建立有條件限制的檢視時,加上“WITH CHECK OPTION”命令。

相關文章