位置:首頁 > 數據庫 > SQL教學 > SQL View(視圖)

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;