SQL View(視圖)
視圖無非是存儲在數據庫中的相關名稱的SQL語句。視圖實際上是一個表中的預定義的SQL查詢形式的組合物。
視圖可以包含一個表中的所有行或從表中選擇部分行。視圖可以從一個或多個表取決於書麵SQL查詢來創建。
視圖是一種虛擬表,讓用戶做到以下幾點:
-
用戶或用戶類彆的找到天然或直觀的結構數據的方式。
-
限製訪問的數據,使得用戶可以看到,(有時)修改確實需要或不需要更多。
-
彙總可從表中的數據生成各種報告。
創建視圖:
使用CREATE VIEW語句創建數據庫視圖。 視圖可以從一個單一的表,多個表或另一視圖中創建。
要創建視圖,用戶必須根據具體的實施有相應的係統權限。
CREATE VIEW基本的語法如下:
CREATE VIEW view_name AS SELECT column1, column2..... FROM table_name WHERE [condition];
可以包括在正常使用的SQL SELECT查詢類似的方式,在SELECT語句中的多個表。
例子:
考慮CUSTOMERS表具有以下記錄:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
現在,下麵的例子創建客戶表的視圖。這個視圖將用於從CUSTOMERS表讀取客戶姓名和年齡:
SQL > CREATE VIEW CUSTOMERS_VIEW AS SELECT name, age FROM CUSTOMERS;
現在,你可以查詢CUSTOMERS_VIEW類似的方式來查詢實際的表。 下麵是一個例子:
SQL > SELECT * FROM CUSTOMERS_VIEW;
這將產生以下結果:
+----------+-----+ | name | age | +----------+-----+ | Ramesh | 32 | | Khilan | 25 | | kaushik | 23 | | Chaitali | 25 | | Hardik | 27 | | Komal | 22 | | Muffy | 24 | +----------+-----+
WITH CHECK OPTION:
WITH CHECK OPTION是CREATE VIEW語句選項。WITH CHECK OPTION的目的是為了確保所有更新和插入滿足視圖定義的條件。
如果它冇有滿足條件,在UPDATE或INSERT返回一個錯誤。
以下是創建CUSTOMERS_VIEW 視圖例子使用WITH CHECK OPTION:
CREATE VIEW CUSTOMERS_VIEW AS SELECT name, age FROM CUSTOMERS WHERE age IS NOT NULL WITH CHECK OPTION;
在這種情況下,WITH CHECK OPTION拒絕任何NULL值條目在視圖的AGE列,因為該視圖由數據定義的不能在AGE欄中有NULL值。
更新視圖:
視圖在一定條件下可以更新:
-
SELECT子句不包含關鍵字DISTINCT。
-
SELECT子句不包含彙總函數。
-
SELECT子句不包含集合函數。
-
SELECT子句不能包含集合運算符。
-
SELECT子句不能包含一個ORDER BY子句。
-
FROM子句中不能包含多個表。
-
WHERE子句不能包含子查詢。
-
查詢不包含GROUP BY或HAVING。
-
計算列無法更新。
-
從基表中的所有NOT NULL列必須包含在視圖是為了使用INSERT查詢功能。
所以,如果一個視圖滿足所有上述規則,那麼就可以更新視圖。下麵是一個例子,更新Ramesh的年齡:
SQL > UPDATE CUSTOMERS_VIEW SET AGE = 35 WHERE name='Ramesh';
這最終將更新基礎表CUSTOMERS,並同樣在視圖中反映。現在,試著查詢基礎表,SELECT語句將產生如下結果:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 35 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
將行插入視圖:
數據行可以插入的視圖。適用於UPDATE命令規則同樣也適用於INSERT命令。
在這裡,我們也不能插入行到CUSTOMERS_VIEW,因為我們還冇有包括在該視圖中的所有NOT NULL列, 否則,你可以插入數據行到視圖,以其插入一個表中類似的方式。
在視圖中刪除行:
可以從視圖中刪除數據行。適用於UPDATE和INSERT命令的規則同樣也適用於DELETE命令。
下麵是一個例子刪除其 AGE= 22 的記錄
SQL > DELETE FROM CUSTOMERS_VIEW WHERE age = 22;
這將最終從基表CUSTOMERS刪除一行,並同樣在視圖本身也會有反映。現在,試著查詢基礎表,SELECT語句將產生如下結果:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 35 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
刪除視圖:
很顯然,在這裡有一個視圖,需要一種方法來刪除這個視圖如果它不再需要。語法很簡單,如下所示:
DROP VIEW view_name;
下麵是一個例子是刪除CUSTOMERS客戶表的視圖:
DROP VIEW CUSTOMERS_VIEW;