視圖是一種虛表,使用CREATE VIEW語句來定義視圖,該視圖是基於一個或多個表或視圖的邏輯表。一個視圖本身不包含任何數據, 視圖所基於的表稱為基表。 視圖就相當於一條select 語句,定義了一個視圖就是定義了一個sql語句, 視圖不占空間,使用視圖不會提高性能,但是能簡化sql語句 。 創建視 ...
視圖是一種虛表,使用CREATE VIEW語句來定義視圖,該視圖是基於一個或多個表或視圖的邏輯表。一個視圖本身不包含任何數據, 視圖所基於的表稱為基表。
視圖就相當於一條select 語句,定義了一個視圖就是定義了一個sql語句, 視圖不占空間,使用視圖不會提高性能,但是能簡化sql語句 。
創建視圖:
create view 視圖名;
如:
create or replace view v_test as select * from test where age=10;
create or replace: 如果view存在就覆蓋,不存在才創建。
刪除視圖:
drop view 視圖名;
許可權控制:
要在您自己的模式中創建視圖,您必須具有CREATE VIEW系統特權。
要在其他用戶的模式中創建視圖,您必須具有CREATE ANY VIEW系統特權。
包含該視圖的模式的所有者必須具有從視圖所基於的所有表或視圖中選擇,插入,更新或刪除行所必需的許可權。
詳細語句解析:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
其中:
with read only視圖只讀約束
with check option 不允許插入與where條件不符的記錄,類似於check約束的功能.
通過視圖修改數據:
CREATE VIEW clerk AS SELECT employee_id, last_name, department_id, job_id FROM employees
WHERE job_id = 'PU_CLERK' or job_id = 'SH_CLERK' or job_id = 'ST_CLERK';
使用視圖修改基表的數據,只有員工的ID,姓氏,部門號碼和職位在該視圖中可見,並且這些列只能在雇員是職員的行中更新:
UPDATE clerk SET job_id = 'PU_MAN' WHERE employee_id = 118;
有限制的修改:
連接視圖是其視圖子查詢包含連接的視圖。如果聯接中至少有一列具有唯一索引,則可以在聯接視圖中修改一個基表。
CREATE VIEW locations_view AS
SELECT d.department_id, d.department_name, l.location_id, l.city
FROM departments d, locations l WHERE d.location_id = l.location_id;
新增記錄 INSERT INTO locations_view VALUES(999, 'Entertainment', 87, 'Roma');
系統返回:ERROR at line 1:
ORA-01776: cannot modify more than one base table through a join view
可以查詢系統表USER_UPDATABLE_COLUMNS,查看連接視圖中的列是否可更新。
SELECT column_name, updatable FROM user_updatable_columns
WHERE table_name = 'LOCATIONS_VIEW' ORDER BY column_name, updatable;
改成如下語句,操作成功
INSERT INTO locations_view (department_id, department_name) VALUES (999, 'Entertainment');
1 row created.
參考文獻
oracle官網的Oracle11G-en-US.pdf