視圖是建立在基表之上的虛擬表,儲存 SELECT 查詢定義,提供資料存取控制、查詢簡化、避免重複存取等優勢。本文涵蓋視圖類型、建立修改語法、DML 限制規則、刪除與 Top-N 分析應用。
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias [, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint_name]] [WITH READ ONLY [CONSTRAINT constraint_name]];
OR REPLACE:視圖存在則覆蓋。FORCE:基表不存在也能建立;NOFORCE(預設)需基表存在。WITH CHECK OPTION:DML 必須符合視圖 WHERE 條件。WITH READ ONLY:禁止任何 DML 操作。CREATE OR REPLACE VIEW view_name [(alias...)] AS subquery;
別名須與子查詢欄位一一對應。
| 操作 | 禁止條件(視圖定義包含以下任一項) |
|---|---|
| DELETE | 群組函數、GROUP BY、DISTINCT、ROWNUM |
| UPDATE | 群組函數、GROUP BY、DISTINCT、ROWNUM、欄位為運算式 |
| INSERT | 群組函數、GROUP BY、DISTINCT、ROWNUM、欄位為運算式、基表 NOT NULL 欄位未在視圖中 |
使用 WITH READ ONLY 可完全屏蔽 DML,違反將拋出 Oracle 錯誤。
DROP VIEW view_name;
僅移除視圖定義,基表資料不受影響。
查詢前 N 筆最大/最小值:
SELECT column_list, ROWNUM FROM (SELECT column_list FROM table ORDER BY top_n_column) WHERE ROWNUM <= N;
注意:ROWNUM 僅能用 < 或 <=,不能用 =, >, >=。
SELECT *
FROM (
SELECT ROWNUM rn, t.*
FROM (
SELECT * FROM employees ORDER BY salary DESC
) t
WHERE ROWNUM <= 20
)
WHERE rn > 10;