檢視表 是一個**虛擬資料表**,其內容由一個 SELECT 查詢定義。它**不儲存實體資料**,只儲存查詢定義。每次查詢檢視表時,資料庫引擎會動態執行底層查詢並回傳結果。
| 特性 | 資料表 | 檢視表 |
|---|---|---|
| 資料儲存 | 實體儲存資料列 | 不儲存資料,只存查詢定義 |
| 佔用空間 | 佔用資料/索引頁面 | 極小 (僅元資料) |
| 資料即時性 | 即時 | 即時 (每次查詢重新運算) |
| 可更新性 | 完全可更新 | 符合條件時可更新 (單一基底表、無聚合、無 DISTINCT 等) |
WHERE Status = 'Active')。SELECT 檢視表。SELECT * FROM v_Simple。CREATE VIEW [schema.]view_name [(column_alias_list)]
[WITH ENCRYPTION | SCHEMABINDING | VIEW_METADATA]
AS
SELECT column_list
FROM table_sources
[WHERE condition]
[GROUP BY ...]
[HAVING ...]
[WITH CHECK OPTION] -- 僅允許符合 WHERE 條件的資料被修改
GO
CREATE VIEW v_OfficeDetail
AS
SELECT
o.OfficeName AS 樓盤名稱,
c.AreaName AS 城市,
a.AreaName AS 區域,
s.AreaName AS 街道
FROM dbo.Office_Info AS o
INNER JOIN dbo.Base_Area AS c ON o.CityID = c.AreaID
INNER JOIN dbo.Base_Area AS a ON o.AreaID = a.AreaID
INNER JOIN dbo.Base_Area AS s ON o.StreetID = s.AreaID;
GO
-- 使用檢視表
SELECT * FROM v_OfficeDetail WHERE 城市 = N'台北市';
ALTER VIEW v_OfficeDetail
AS
SELECT o.OfficeName, c.AreaName AS City
FROM dbo.Office_Info o
INNER JOIN dbo.Base_Area c ON o.CityID = c.AreaID; -- 簡化版
IF EXISTS (SELECT * FROM sys.views WHERE name = 'v_OfficeDetail')
DROP VIEW v_OfficeDetail;
| 選項 | 用途 | 限制/影響 |
|---|---|---|
| SCHEMABINDING | 綁定基底表結構,防止被修改/刪除導致檢視表失效 | 必須使用兩部分名稱 (schema.table);基底表不可 DROP/ALTER 破壞結構 |
| WITH ENCRYPTION | 加密檢視表定義,防止 sp_helptext 檢視 | 無法反編譯 (需第三方工具);備份腳本會失去定義 |
| VIEW_METADATA | 讓 ODBC/OLEDB 客戶端將檢視表視為可更新資料表 | 較少使用 |
| WITH CHECK OPTION | 透過檢視表修改資料時,強制符合 WHERE 條件 | 防止「透過檢視表更新」導致資料落出檢視範圍 |
CREATE VIEW v_OfficeSchemaBound
WITH SCHEMABINDING
AS
SELECT OfficeID, OfficeName, CityID
FROM dbo.Office_Info; -- 必須 dbo.Office_Info
-- 此時嘗試 ALTER TABLE dbo.Office_Info DROP COLUMN CityID 會失敗,提示受檢視表綁定
在檢視表上建立 **叢集索引**,即可將結果集實體儲存,查詢時直接讀取索引頁面,大幅提升聚合/多表 JOIN 查詢效能。
WITH SCHEMABINDINGOUTER JOIN、DISTINCT、UNION、subquery、aggregate (除 COUNT_BIG(*)) 等ANSI_NULLS, QUOTED_IDENTIFIER 等 SET 選項正確CREATE VIEW v_SalesSummary
WITH SCHEMABINDING
AS
SELECT ProductID, COUNT_BIG(*) AS Cnt, SUM(UnitPrice) AS TotalPrice
FROM dbo.SalesOrderDetail
GROUP BY ProductID;
GO
CREATE UNIQUE CLUSTERED INDEX IX_v_SalesSummary ON v_SalesSummary (ProductID);
GO
-- 查詢自動使用索引檢視表 (Enterprise Edition 自動匹配,Standard 需加 NOEXPAND HINT)
SELECT ProductID, Cnt FROM v_SalesSummary WHERE ProductID = 777;
TOP,否則無意義且浪費資源。GRANT SELECT ON v_Sensitive TO Role_A; 實現欄位級安全。v_ 前綴 + PascalCase,如 v_CustomerOrderSummary。檢視表是**封裝查詢邏輯、實現安全控管、簡化應用開發**的利器。善用 SCHEMABINDING 保護結構穩定,必要時建立 **索引檢視表** 獲得物質化查詢加速。遵循「單一職責、扁平化、權限最小化」原則設計檢視表,能大幅降低系統複雜度。