VIEW 檢視表
什麼是 VIEW?
比喻:VIEW 就像一個存好的「書籤查詢」 🔖
你常常執行同一段複雜的 SQL 查詢—— VIEW 讓你把它存起來,取個名字,以後直接用名字查。
VIEW 是一個虛擬表,它不存資料,只存查詢語句。
建立 VIEW
-- 建立一個「學生成績總覽」的 View
CREATE VIEW student_scores AS -- ← 定義 View 名稱
SELECT
s.Name AS 學生,
s.Department AS 科系,
c.Name AS 課程,
e.Score AS 分數
FROM Students s
INNER JOIN Enrollments e ON s.Id = e.StudentId
INNER JOIN Courses c ON e.CourseId = c.Id;
使用 VIEW
-- 用起來就像一般的表!
SELECT * FROM student_scores;
-- 可以加 WHERE
SELECT * FROM student_scores
WHERE 科系 = '資工系' AND 分數 >= 80;
-- 可以做聚合
SELECT 科系, AVG(分數) AS 平均分
FROM student_scores
GROUP BY 科系;
VIEW 的好處
1. 簡化複雜查詢
-- 沒有 View:每次都要寫一大串 JOIN
SELECT s.Name, c.Name, e.Score
FROM Students s
INNER JOIN Enrollments e ON s.Id = e.StudentId
INNER JOIN Courses c ON e.CourseId = c.Id
WHERE s.Department = '資工系';
-- 有 View:一行搞定
SELECT * FROM student_scores WHERE 科系 = '資工系';
2. 權限控制
-- 給業務部門看的 View(隱藏敏感欄位)
CREATE VIEW public_students AS
SELECT Name, Department, Score -- ← 不包含 Email、Phone
FROM Students;
-- 業務部門只能存取這個 View,看不到完整資料
GRANT SELECT ON public_students TO sales_role;
3. 資料抽象
-- 即使底層表結構改了,View 可以保持介面不變
-- 應用程式不需要跟著改
修改和刪除 VIEW
-- 修改 View(CREATE OR REPLACE)
CREATE OR REPLACE VIEW student_scores AS
SELECT
s.Name AS 學生,
s.Department AS 科系,
c.Name AS 課程,
e.Score AS 分數,
CASE WHEN e.Score >= 60 THEN '及格' ELSE '不及格' END AS 狀態
FROM Students s
INNER JOIN Enrollments e ON s.Id = e.StudentId
INNER JOIN Courses c ON e.CourseId = c.Id;
-- 刪除 View
DROP VIEW student_scores;
DROP VIEW IF EXISTS student_scores; -- 安全寫法
Materialized View(實體化檢視)
普通 View 每次查詢都重新執行 SQL。 Materialized View 會快取結果,查詢更快。
-- 建立 Materialized View
CREATE MATERIALIZED VIEW mv_dept_stats AS
SELECT
Department,
COUNT(*) AS student_count,
AVG(Score) AS avg_score
FROM Students
GROUP BY Department;
-- 查詢(直接讀快取,不重新計算)
SELECT * FROM mv_dept_stats;
-- 手動刷新(資料有變時需要刷新)
REFRESH MATERIALIZED VIEW mv_dept_stats;
| 比較 | VIEW | MATERIALIZED VIEW |
|---|---|---|
| 存資料 | ❌ 只存查詢 | ✅ 存結果 |
| 速度 | 每次重算 | 快取,很快 |
| 即時性 | 永遠最新 | 需手動刷新 |
| 適用場景 | 簡化查詢 | 報表、儀表板 |