SQL VIEW

View 檢視表、視圖 (SQL View)

View 是藉由 SQL SELECT 查詢動態組合生成的資料表 (亦即 View 是由查詢得到的結果集組合而成的資料表)。View 內的資料紀錄是由其它實際存在的資料表中產生的,它就像是一個虛擬資料表,實際上資料庫 (或說是硬碟) 裡面是不存在這一個資料表的 (只存在此 View 的相關定義),但是我們使用上卻有如實際存在的資料表 – 所有的 SQL 查詢語法都可以操作在此 View 上。

資料表是一種實體結構 (physical structure),而 View 是一種虛擬結構 (virtual structure)。

View 有哪些特性

  1. 加強資料庫的安全性,View 可以將實體資料表結構隱藏起來,同時限制使用者只可以檢視及使用哪些資料表欄位。
  2. 檢視表是唯讀的,亦即外部使用者無法直接透過 View 去修改內部資料。
  3. 將複雜的 SQL 查詢包裝在 View 中,可以簡化查詢的複雜度。
  4. 當資料表結構有變更時,只需要更改 View 的設定,不需更改程式。

建立 View (SQL CREATE VIEW)

CREATE VIEW view_name [(column_list)] AS
SELECT column_name(s)
FROM table_name
WHERE condition;

例如:

CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;

一個 View 可以由查詢實體資料表而建立,亦可以查詢其它已存在的 View 而建立。

更新 View (SQL CREATE OR REPLACE VIEW)

如果加上 OR REPLACE 子句的意思就是若同名的 View 已經存在就覆蓋取代它。如果 View 不存在,我們可以把 CREATE OR REPLACE VIEW 看做是如同 CREATE VIEW;而如果 View 已存在,我們可以把 CREATE OR REPLACE VIEW 看做是 ALTER VIEW。

CREATE OR REPLACE VIEW view_name [(column_list)] AS
SELECT column_name(s)
FROM table_name
WHERE condition;

刪除 View (SQL DROP VIEW)

DROP VIEW view_name;

View 使用實例 (Example)

假設這是一個產品訂單資料表 p_orders:

ProductPriceQuantity
LCD4000100
CPU5000200

我們可以建立一個方便查詢各產品售出總額的 View:

CREATE VIEW view_p_sum (Product, P_SUM) AS
SELECT Product, Price*Quantity FROM p_orders GROUP BY Product;

接著,你就可以像操作一般資料表:

SELECT * FROM view_p_sum
ProductP_SUM
CPU1000000
LCD400000

物化視圖 (Materialized View)

除了一般的 View 之外,某些資料庫還支援物化視圖 (Materialized View)。與一般 View 不同的是,Materialized View 會將查詢結果實際儲存在磁碟中,因此在讀取時不需要重新執行查詢,效能上會比一般 View 更好。

目前支援 Materialized View 的資料庫包括 PostgreSQL、Oracle、SQL Server(以 Indexed View 的形式支援)等。MySQL 原生不支援 Materialized View,但可以透過資料表搭配觸發器 (Trigger) 來模擬。

Materialized View 語法 (Materialized View Syntax)

以 PostgreSQL 為例,建立 Materialized View 的語法如下:

CREATE MATERIALIZED VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition;

View 與 Materialized View 的差異

資料儲存不儲存,每次查詢即時運算儲存在磁碟中查詢效能較慢(需即時執行查詢)較快(直接讀取已存資料)資料即時性永遠是最新資料需手動或排程刷新佔用空間不佔用額外空間佔用額外儲存空間適用場景資料量小、需即時資料資料量大、查詢頻繁、可容許些許延遲
特性ViewMaterialized View

刷新 Materialized View (Refresh)

由於 Materialized View 的資料是靜態儲存的,當來源資料表的資料發生變動時,Materialized View 的內容不會自動更新。我們需要手動刷新它:

REFRESH MATERIALIZED VIEW view_name;

如果不想在刷新時鎖定整個 Materialized View(即允許查詢同時進行),可以使用 CONCURRENTLY 選項(需要在 Materialized View 上建立唯一索引):

REFRESH MATERIALIZED VIEW CONCURRENTLY view_name;

Materialized View 使用實例 (Example)

延續上面的 p_orders 資料表範例,我們可以建立一個 Materialized View 來儲存各產品售出總額(以 PostgreSQL 為例):

CREATE MATERIALIZED VIEW mv_p_sum AS
SELECT Product, SUM(Price*Quantity) AS Total
FROM p_orders
GROUP BY Product;

建立完成後,可以像一般資料表一樣查詢:

SELECT * FROM mv_p_sum;

當 p_orders 資料有新增或異動時,需要執行刷新指令來更新 Materialized View 中的資料:

REFRESH MATERIALIZED VIEW mv_p_sum;

如果不再需要此 Materialized View,可以使用以下語法刪除:

DROP MATERIALIZED VIEW mv_p_sum;

延伸閱讀

留言功能已關閉。