摘要:本篇筆記記錄關於視圖的一些認識、從概念、優缺點到應用以及注意事項。
視圖是基於一張表或多張表或另外一個視圖的邏輯表。視圖不同於表,視圖本身不包含任何數據。表是實際獨立存在的實體,是用於存儲數據的基本結構。而視圖只是一種定義,對應一個查詢語句。視圖的數據都來自於某些表,這些表被稱為基表。數據庫中只在數據字典中存儲對視圖的定義。
1、為用戶集中數據,簡化用戶的數據查詢和處理。
2、屏蔽數據庫的復雜性,用戶不必了解數據庫的復雜性。
3、簡化用戶權限的管理,只授予用戶使用視圖的權限。
4、可以提高數據訪問的安全性,通過視圖往往只可以訪問數據庫中表的特定部分,限制了用戶訪問表的全部行和列。
5、便於數據共享,多個用戶不必都定義所需的數據。
指基於單個表並且不包含函數或表達式的視圖,在該視圖上可以執行DML語句(即可執行增、刪、改操作)。
指基於單個或者多個表或者包含函數、表達式或者分組數據的視圖,在該視圖上執行DML語句時必須要符合特定條件。注意:在定義復雜視圖時必須為函數或表達式定義別名
指基於多個表建立的視圖,一般來說不會在該視圖上執行INSERT、UPDATE、DELETE操作。
指只允許進行SELECT操作的視圖,在該視圖時指定WITH READ ONLY選項。該視圖上不能執行INSERT、UPDATE、DELETE操作。
WITH CHECK OPTION用於在視圖上定義CHECK約束,即在該視圖上執行INSERT或UPDATE操作時,數據必須符合查詢結果.
CREATE [OR REPLACE] VIEW view_name [(column_name1[,column_name2… AS select_statement [WITH CHECK OPTION] [WITH READ ONLY]
CREATE OR Repalce:用於創建和修改視圖 WITH CHECK OPTION :用於創建限制數據訪問的視圖 WITH READ ONLY :用於創建只讀視圖
a)簡單視圖可以執行DML操作。
b)在視圖出現下列情況時不可以通過視圖修改基表數據或插入數據:
i、集合運算符(union,intersect,minus)
ii、DISTINCT關鍵字
iii、GROUP BY,ORDER BY,CONNECT BY或START WITH子句
v、子查詢
vi、分組函數
vii、需要更新的列不是由“列表達式”定義的
vx、基表中所有NOT NULL列均屬於該視圖
select table_name,column_name,updatable,insertable,deletable from user_updatable_columns;
說明
updatable 表示當前字段是否可以執行修改操作
insertable 表示當前字段是否可以執行添加操作
deletable 表示當前字段是否可以執行刪除操作
--對簡單視圖的操作
drop table emp1;
create table emp1 as select * from emp;
--簡單視圖
create or replace view v_emp1
as
select * from emp1 ;
--查詢
select * from v_emp1;
--更新
update v_emp1 set v_emp1.ENAME='andy' where v_emp1.JOB='CLERK';
--增加
insert into v_emp1 values (7777, 'chy', 'MANAGER', 8888, sysdate, 10000,1111.11,20);
--刪除
delete from v_emp1 where v_emp1.EMPNO=7777;
--復雜視圖、僅兩基表相連、不包含各種分組函數、group by、distinct命令等。
create or replace view v_complex
as
select emp1.ename, emp1.job, dept.dname from emp1, dept where emp1.deptno=dept.deptno
with check option ;
--查詢
select * from v_complex;
--修改
update v_complex set v_complex.ename='andy' where v_complex.job='MANAGER';
--增加
--報錯:ORA-01776:無法通過連接視圖修改多個基表
insert into v_complex (v_complex.ename, v_complex.job, v_complex.dname) values ('chy', 'MANAGER', 'SALES');
--刪除
delete from v_complex where v_complex.ename='chy';
--復雜視圖、包含不能進行DML的元素、一般僅用與查詢、可以加上 with read only;
create or replace view v_complex_readonly
as
--對使用聚合函數的列必須使用別名!
select max(emp1.sal) max_sal from emp1, dept where emp1.deptno=dept.deptno group by dept.deptno
with read only;
--查詢
select * from v_complex_readonly;
--刪除視圖
create or replace view v_for_delete
as
select * from emp
with read only;
drop view v_for_delete;