本文為 SQL 關聯資料庫 基本介紹系列文,第 10 篇:
- 關聯式資料庫與資料完整性:初學者指南
- SQL 觸發器(Triggers):自動執行的資料庫機制
- Django 信號(Signals) vs SQL 觸發器(Triggers):關係與差異解析
- 關聯式資料庫與交易(Transaction)機制入門
- 深入理解死結(Deadlock)與發生條件
- DCL(資料控制語言)入門:SQL 權限管理基礎
- SQL 儲存程序(Stored Procedure)入門
- ORM(對象關係對映):讓資料庫操作更簡單的工具
- SQL 儲存程序 vs ORM:如何選擇最適合的數據庫操作方式?
- 關聯式資料庫 View(檢視)是什麼?完整指南 👈進度
- 理解 Materialized View:初學者指南
在關聯式資料庫管理系統(RDBMS)中,開發者經常需要從多張表格中擷取資料,或建立特定格式的查詢結果,以方便存取與管理。
檢視(View) 就是為了解決這些需求而設計的功能。
許多初學者會將「檢視」誤以為是「物化檢視(Materialized View)」,但它們的運作方式其實大不相同。
本文將帶你深入了解 View(檢視) 的概念、優勢、用途,以及如何在 SQL 中建立與管理檢視。
什麼是 View(檢視)?
View 的基本概念
檢視(View) 是一種 虛擬表(Virtual Table),它的內容來自於一個或多個資料表的查詢結果。
與一般的資料表不同,View 本身不存儲資料,而是動態地從基礎表擷取數據,當查詢 View 時,系統會執行對應的 SQL 查詢並返回結果。
View 的運作方式
View 其實就是一個 SQL 查詢的別名。
當使用者查詢 View 時,資料庫會將 View 定義的 SQL 語句轉換為實際的 SQL 執行,並回傳結果。
例如,假設我們有一張 employees(員工)表:
| id | name | department | salary |
|---|---|---|---|
| 1 | Alice | IT | 60000 |
| 2 | Bob | HR | 50000 |
| 3 | Charlie | IT | 70000 |
如果我們經常需要查詢 IT 部門的員工,則可以建立一個 View 來簡化這個操作:
CREATE VIEW it_employees AS
SELECT id, name, salary
FROM employees
WHERE department = 'IT';
當我們查詢 it_employees View 時:
SELECT * FROM it_employees;結果會像這樣:
| id | name | salary |
|---|---|---|
| 1 | Alice | 60000 |
| 3 | Charlie | 70000 |
View 本身不儲存這些數據,而是每次查詢時,會重新執行 SELECT 語句來取得最新的結果。
如何建立與管理 View
建立 View
使用 CREATE VIEW 來建立 View,例如:
CREATE VIEW active_customers AS
SELECT id, name, email
FROM customers
WHERE status = 'active';
查詢 View
可以像查詢一般資料表一樣查詢 View:
SELECT * FROM active_customers;更新 View
如果要修改 View,可以使用 CREATE OR REPLACE VIEW:
CREATE OR REPLACE VIEW active_customers AS
SELECT id, name, email, created_at
FROM customers
WHERE status = 'active';刪除 View
如果不再需要某個 View,可以刪除:
DROP VIEW active_customers;為什麼要使用 View?
使用 View 有許多好處,以下是幾個主要的優勢:
提高查詢的可讀性
在開發應用時,SQL 查詢可能會變得非常複雜,包含多張表的 JOIN、彙總計算等。
使用 View,可以將複雜的查詢封裝起來,使程式碼更加簡潔易讀。例如:
原始查詢(複雜 SQL)
SELECT e.id, e.name, d.department_name, e.salary
FROM employees e
JOIN departments d ON e.department = d.id
WHERE e.salary > 50000;
使用 View 簡化
CREATE VIEW high_salary_employees AS
SELECT e.id, e.name, d.department_name, e.salary
FROM employees e
JOIN departments d ON e.department = d.id
WHERE e.salary > 50000;
之後,只需簡單查詢:
SELECT * FROM high_salary_employees;這樣可以避免每次都寫冗長的 SQL 語句,提高可讀性與維護性。
提供資料安全性
如果我們不希望使用者直接存取敏感數據(如員工薪資),可以使用 View 來過濾部分欄位。例如:
CREATE VIEW public_employees AS
SELECT id, name, department
FROM employees;這樣,當使用者查詢 public_employees 時,他們無法看到 salary 欄位的內容,提高了數據的安全性。
簡化應用開發
開發應用程式時,可能需要從多張表中擷取數據,但不希望讓應用程式負責複雜的 SQL 處理。
使用 View,可以讓應用端直接查詢 View,避免處理複雜的關聯邏輯。
增強可維護性
當資料表的結構改變時,只需修改 View,而不需要修改所有應用程式中的查詢。
例如,假設 employees 表的 department 欄位被改為 department_id,我們只需更新 View,而不需要修改所有應用程式中的 SQL。
View 的限制
雖然 View 有許多優點,但也有一些限制:
View 不能提高查詢效能
View 本身不存儲資料,每次查詢 View 時,仍然需要從基礎表重新擷取數據。因此,如果基礎表的數據量非常大,查詢 View 可能會很慢。
(如果想要提升查詢效能,應該考慮 物化檢視(Materialized View),因為它會預先儲存查詢結果。)
某些 View 不能更新
在某些情況下,View 不能用來更新資料,例如:
- 如果 View 包含
JOIN,可能無法直接對 View 進行INSERT、UPDATE或DELETE操作。 - 如果 View 使用了
GROUP BY或DISTINCT,則無法直接更新數據。
例如:
CREATE VIEW employee_salary AS
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;這個 View 無法更新,因為 AVG(salary) 是聚合函數。
可能影響資料一致性
如果基礎表的結構變更(如刪除某個欄位),可能會導致 View 失效,影響系統的穩定性。
View 與 Stored Procedure 的差別
雖然 View 和 Stored Procedure(儲存程序) 都是 SQL 中用來簡化和封裝查詢的工具,但它們的性質和用途截然不同。
View(檢視)
View 是 一種虛擬表(Virtual Table),它的本質是 一個 SQL 查詢的封裝,但不儲存數據,每次查詢時都會動態執行 SQL。它的用途主要是簡化複雜查詢,提高可讀性和安全性。
CREATE VIEW it_employees AS
SELECT id, name, salary
FROM employees
WHERE department = 'IT';
📌 View 的特點
- 像資料表一樣被查詢(可用
SELECT * FROM view_name;)。 - 不能執行邏輯運算(如條件判斷、迴圈)。
- 不能傳遞參數(只能固定查詢特定的 SQL 結果)。
- 不能改變資料(部分 View 不能執行
INSERT、UPDATE、DELETE)。
Stored Procedure(儲存程序)
Stored Procedure 是 一段 SQL 代碼的封裝,可以包含變數、條件邏輯(IF、CASE)、迴圈(WHILE、FOR)、參數等,並可以 動態執行 SQL 查詢或資料修改。
CREATE PROCEDURE get_employee_salary(IN emp_id INT)
BEGIN
SELECT name, salary FROM employees WHERE id = emp_id;
END;📌 Stored Procedure 的特點
- 可執行邏輯運算(可用
IF、CASE、LOOP)。 - 可接受輸入參數(允許客製化查詢)。
- 可修改資料(
INSERT、UPDATE、DELETE)。 - 不返回結果作為表,而是執行後返回一組數據或影響行數。
執行方式:
CALL get_employee_salary(1);這與 SELECT * FROM view_name; 不同,因為 View 只是查詢,而 Stored Procedure 可以執行更靈活的邏輯。
主要差異分析表
| View(檢視) | Stored Procedure(儲存程序) | |
|---|---|---|
| 本質 | 虛擬表,封裝 SELECT 查詢 | 預存 SQL 指令,可包含邏輯控制 |
| 儲存數據 | ❌ 不儲存數據,只封裝查詢 | ❌ 也不儲存數據,但可操作數據 |
| 可修改數據 | ⚠️ 可能可以(但有許多限制) | ✅ 可使用 INSERT、UPDATE、DELETE |
| 可接受參數 | ❌ 不能傳遞參數 | ✅ 可接受參數(用於客製化查詢) |
| 可執行條件判斷/迴圈 | ❌ 不行 | ✅ 可執行 IF、LOOP |
| 查詢方式 | SELECT * FROM view_name; | CALL procedure_name(params); |
| 主要用途 | 簡化查詢,提供虛擬表 | 執行資料操作、商業邏輯 |
何時該用 View?何時該用 Stored Procedure?
📌 使用 View 的場景
✅ 簡化複雜的 SQL 查詢,讓開發者不需要每次都寫重複的 JOIN、GROUP BY。
✅ 提供安全性,讓使用者只能存取特定欄位(隱藏敏感數據)。
✅ 作為虛擬表,允許應用程式當作普通表來查詢數據。
📌 使用 Stored Procedure 的場景
✅ 需要動態輸入參數,例如根據不同的條件查詢不同的結果。
✅ 需要執行邏輯運算(IF 條件、計算、存取不同的資料表)。
✅ 需要執行多個 SQL 操作,如先插入資料,然後再更新另一個表。
✅ 需要批量處理數據,例如計算某些統計數據並批次更新。
結論
View(檢視)是一種強大的 SQL 工具,能夠讓開發者簡化查詢、提高可讀性、增強安全性,並提供更靈活的數據存取方式。
然而,由於 View 不會儲存查詢結果,因此它並不適用於提升效能的場景。
如果你想要提升查詢效能,應該考慮 Materialized View(物化檢視),因為它會預先計算並儲存查詢結果,減少執行時間。
希望這篇文章能幫助你更好地理解 View 的概念,並能夠在開發與資料庫設計中靈活運用!