天天看點

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

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

關系型資料庫中的資料是由一張一張的二維關系表所組成,簡單的單表查詢隻需要周遊一個表,而複雜的多表查詢需要将多個表連接配接起來進行查詢任務。對于複雜的查詢事件,每次查詢都需要編寫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 視圖

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

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

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

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

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

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

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

比如,我們希望從前文提到的四張表,order_baisc,order_details,user和product中查找所有記錄,需要寫入代碼指令:

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

想再次查詢這幾個表中uid為u0001的使用者的記錄,有需要鍵入一次操作指令:

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

也就是說,每次查詢都得重新鍵入查詢指令SQL代碼,這種費時費力的體力活,對于時間就是生命的你我來說,是不劃算的。是以借助視圖,來執行相同或相似的查詢。

2 建立視圖

2.1 建立視圖create view

建立視圖的代碼為:

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

可以看到,建立視圖和查詢相比,增加了前面的

CREATE VIEW 視圖名 AS

2.2 視圖運用

使用視圖和使用表完全一樣,隻需要把視圖當成一張表就OK了。視圖是一張虛拟表。

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

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

2.3 修改視圖CREATE OR REPLACE VIEW

修改和建立視圖可以使用代碼:

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

eg:

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

2.4 檢視視圖

(1)檢視資料庫中有哪些視圖 show tables

前面提到,視圖就是虛拟的表,是以,檢視視圖的方法和檢視表的方法是一樣的:

>SHOW TABLES;           
  • 1
資料庫之MySQL資料庫視圖:視圖定義、建立視圖、修改視圖

通過

show tables;

回報得到所有的表和視圖。同樣的,我們可以通過模糊檢索的方式專門檢視視圖,這個時候,視圖的指令統一采用v_視圖名v_視圖名的優勢就展現出來了。

(2)檢視視圖詳情

檢視視圖詳情的方法有兩種,一種是和檢視表詳情一樣使用

desc 視圖名

,另外一種方法是

show fields from 視圖名

>DESC 視圖名;
或者
>SHOW FIELDS FROM 視圖名;           
  • 1
  • 2
  • 3
資料庫之MySQL資料庫視圖:視圖定義、建立視圖、修改視圖

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

3 視圖與資料變更

3.1 表格資料變更

将表product中的資料進行更新,在通過視圖檢索:

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

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

視圖不是表,不儲存資料,知識一張虛拟表;

3.2 通過視圖變更資料

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

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

資料庫之MySQL資料庫視圖:視圖定義、建立視圖、修改視圖
  • (2)跨表插入資料

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

是以,可以通過視圖插入資料,但是隻能基于一個基礎表進行插入,不能跨表更新資料。
  • (3)WITH CHECK OPTION

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

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

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

可以看到系統提示錯誤CHECK OPTION FAILED。因為視圖限制了價格要高于3000.

後面再次嘗試了不加“WITH CHECK OPTION”的視圖,後者可以成功插入。

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

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

通過視圖修改,可能導緻資料無故消失,是以:

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

注意點:

1. 視圖不是表,不直接存儲資料,是一張虛拟的表;

2. 一般情況下,在建立有條件限制的視圖時,加上“WITH CHECK OPTION”指令。

原文位址:https://blog.csdn.net/moxigandashu/article/details/63254901 , 感謝原部落客。