SQL - 使用檢視



檢視只不過是儲存在資料庫中並具有關聯名稱的 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 表建立檢視的示例。此檢視將用於獲取 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 都滿足檢視定義中的條件。

如果它們不滿足條件,則 UPDATE 或 INSERT 將返回錯誤。

以下程式碼塊包含建立具有 WITH CHECK OPTION 的相同檢視 CUSTOMERS_VIEW 的示例。

CREATE VIEW CUSTOMERS_VIEW AS
SELECT name, age
FROM  CUSTOMERS
WHERE age IS NOT NULL
WITH CHECK OPTION;

在這種情況下,WITH CHECK OPTION 應該拒絕在檢視的 AGE 列中輸入任何 NULL 值,因為檢視是由 AGE 列中沒有 NULL 值的資料定義的。

更新檢視

檢視可以在某些條件下更新,如下所示:

  • SELECT 子句可能不包含 DISTINCT 關鍵字。

  • SELECT 子句可能不包含彙總函式。

  • SELECT 子句可能不包含集合函式。

  • SELECT 子句可能不包含集合運算子。

  • SELECT 子句可能不包含 ORDER BY 子句。

  • FROM 子句可能不包含多個表。

  • WHERE 子句可能不包含子查詢。

  • 查詢可能不包含 GROUP BY 或 HAVING。

  • 無法更新計算列。

  • 為了使 INSERT 查詢能夠工作,必須在檢視中包含來自基表的所有 NOT NULL 列。

因此,如果檢視滿足上述所有規則,則可以更新該檢視。以下程式碼塊包含一個更新 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 表中刪除 CUSTOMERS_VIEW 的示例。

DROP VIEW CUSTOMERS_VIEW;
廣告
© . All rights reserved.