文章

PostgreSQL - 第 13 天 - 視圖 (VIEW)

課程簡介

視圖是根據 SQL 查詢結果創建的虛擬表,它並不儲存實際的數據,而是儲存查詢結果的結構。視圖能夠簡化查詢、提升安全性,以及提高數據管理的靈活性。


什麼是視圖?

視圖(VIEW)是基於一個或多個表或其他視圖創建的虛擬表。視圖是一個「查詢別名」,可用來封裝複雜查詢,讓使用者只需訪問視圖名稱即可獲取查詢結果。視圖不會儲存數據本身,而是每次訪問時執行定義的查詢語句。

視圖的特性包括:

  • 簡化複雜查詢。
  • 提高數據隱私性,允許用戶只查看特定欄位。
  • 提供一致的數據檢視,無需重複撰寫複雜查詢。

創建視圖的語法

使用 CREATE VIEW 語句可以創建視圖:

1
2
3
4
CREATE VIEW 視圖名稱 AS
SELECT 欄位1, 欄位2, ...
FROM 表名
WHERE 條件;

範例

假設我們有一個 員工 表,裡面包含 姓名職位月薪。我們可以創建一個只顯示員工姓名和職位的視圖,隱藏月薪資訊。

1
2
3
CREATE VIEW 員工職位視圖 AS
SELECT 姓名, 職位
FROM 員工;

創建完這個視圖後,任何訪問 員工職位視圖 的用戶只能看到 姓名職位 欄位,而無法看到 月薪


使用視圖

一旦創建了視圖,您可以像使用普通表一樣對其進行查詢:

1
SELECT * FROM 員工職位視圖;

此查詢將返回員工的姓名和職位,因為這是視圖的定義。


視圖的優點

1. 簡化複雜查詢

假設有一個複雜的查詢,用來分析每位員工的月薪與平均月薪的比率。這個查詢可以封裝在視圖中,以後只需訪問該視圖即可:

1
2
3
CREATE VIEW 員工月薪分析 AS
SELECT 姓名, 月薪, 月薪 / (SELECT AVG(月薪) FROM 員工) AS 工資比率
FROM 員工;

這樣,使用者可以通過簡單的查詢來查看每位員工的工資比率:

1
SELECT * FROM 員工月薪分析;

2. 提高安全性

視圖可以限制用戶訪問數據的欄位。例如,對於不需要知道員工薪資的用戶,只需提供一個不包含 月薪 欄位的視圖。

3. 提供一致的數據檢視

視圖可以標準化常見查詢的結果。這樣可以確保所有人看到的數據是一致的,即使底層表有細微變動,視圖依然提供相同的結構。


更新視圖中的數據

在某些情況下,可以通過視圖直接更新數據。但視圖的更新有一些限制,僅當視圖滿足特定條件時才允許更新操作。一般來說,視圖的更新必須直接對應到單一表中的一行,並且視圖不包含聚合函數或其他難以直接映射的計算。

範例

假設有一個視圖 高薪員工,僅顯示月薪高於 50000 的員工:

1
2
3
4
CREATE VIEW 高薪員工 AS
SELECT 姓名, 月薪
FROM 員工
WHERE 月薪 > 50000;

對這個視圖進行更新將無法完成,因為視圖中的限制條件(月薪 > 50000)可能在更新後不成立。


修改視圖

可以使用 CREATE OR REPLACE VIEW 語句來更新視圖定義:

1
2
3
CREATE OR REPLACE VIEW 員工職位視圖 AS
SELECT 姓名, 職位, 月薪
FROM 員工;

這將替換原本的 員工職位視圖 定義,讓視圖新增了 月薪 欄位。


刪除視圖

可以使用 DROP VIEW 語句來刪除視圖:

1
DROP VIEW 視圖名稱;

例如:

1
DROP VIEW 員工職位視圖;

這會刪除 員工職位視圖,但不會影響原始表中的數據。


本日總結

今天我們學習了 PostgreSQL 中的視圖,並了解了它如何幫助我們簡化查詢、提高安全性以及提供一致的數據檢視。視圖能夠提升我們管理和訪問數據的靈活性,是一個實用的數據庫功能。明天我們將學習使用觸發器(Triggers)來處理自動化的數據操作。

本文章以 CC BY 4.0 授權