Oracle視圖及索引

一.概念

   視圖以經過定製的方式顯示包含在一個或多個表(或其它視圖)中的數據.視圖獲取查詢的輸出結果,並將其作爲表來處理.因此可以將視圖視爲”已存儲的查詢”或”虛擬表”.創建視圖所依據的表稱爲”基表”..
視圖的優點:
1.提供了另外一種級別的表安全性
2.隱藏的數據的複雜性
3.簡化的用戶的SQL命令
4.隔離基表結構的改變
5.通過重命名列,從另一個角度提供數據

二.語法

Create [or replace] [force | noforce] view 視圖名
[(alias [,alias]……)]
As select語句
[with check option [constraint constraint]]
[with read only];
注:
or replace        如果視圖已存在,引選項將重新創建該視圖.
Force        如果使用了此關鍵字,則無論基表是否存在,都將創建視圖
Noforce        這是默認值,如果使用此關鍵字,則僅當基表存在時才創建視圖.
Alias        指定由視圖的查詢所選擇的表達式或列的別名.別名的數目必須與視圖所選擇的表達式的數目相匹配
with check option此選項指定只能插入或更新視圖可以訪問的行.術語constraint表示爲check option約束指定的名稱.如果視圖中的select語句加入了where條件來顯示特定的行.如果指定with check option.使用update更改where條件下的列,視圖將會報錯.如果不指定with check option視圖不會報錯,但再用此視圖將不會在顯示出查詢結果,因爲基表中已沒有where條件下的特定行.
with read only    此選項確保不能在此視圖上執行任何修改操作.如果沒有此選項,在視圖上進行的修改操作只能對視圖中所帶的鍵保留表進行修改操作.
在select語句中使用order by,結果集會按指定的順序排列行.在查詢視圖中可以不再使用order by子句
在視圖中可以使用單行函數(由數字,字符,日期組成),分組函數和表達式.

在視圖上使用insert delete update語句的限制:
1.    在視圖中使用DML語句只能修改一個底層的基表.
2.    如果對記錄的修改違反了基表的約束條件,則無法更新視圖.
3.    如果創建的視圖包含連接運算符,DISTINCT運算符,集合運算符,聚合函數和group by子句,則不無對視圖更新.
4.    如果創建的視圖含僞列或表達式,則將無法更新視圖.

刪除視圖語法:
    Drop view 視圖名

三.實例

--使用sys管理權限給soctt用戶授權創建試圖的權限
grant create view to scott;
--使用sys管理權限撤銷scott用戶創建視圖的權限
revoke create view from scott;
--創建單表視圖 v_emp_2
select * from t_emp;
create view v_emp_2 as select empno,ename,job,sal from t_emp;

--查詢視圖
select*from v_emp_2;
--更新視圖
update t_emp set ename='張三' where empno=7369;
commit;
--增加視圖數據
insert into v_emp_2 values(1111,'李四','工人',44);
commit;
--按條件創建視圖
create view v_emp_4 as select empno,ename,job,sal,deptno from t_emp where deptno=10;
--查詢視圖
select*from v_emp_4;

--創建只讀視圖with read only(無法執行DML操作)
create or replace view v_emp_3 as select * from t_emp where deptno=20 with read only;
select*from v_emp_3;
update v_emp_3 set ename='張三' where empno=7369;

----創建檢查約束視圖with check option 
create or replace view v_emp_3 as select*from t_emp where deptno=10 with check option;
 --插入一條記錄部門編號爲10的記錄(可以執行,符合約束條件)
    select * from tsm_emp;
    insert into v_emp_3 values(2222,'爲你','java',
    7499,sysdate,10000,100,10);
    commit;
    --插入一條記錄部門編號爲20的記錄(不能執行,違反約束條件)
    insert into v_emp_3 values(3333,'索拉卡','java',
    7499,sysdate,10000,100,20);
    commit;
    --修改視圖 部門修改(不能執行,違反約束條件)
    update v_emp_3 set deptno='123' where deptno='20'
    
    select * from v_emp_3;
--創建聯表視圖
 create or replace view v_emp_3 as
  select e.empno,e.ename,e.job,e.sal,e.deptno,d.dname 
  from emp e,dept d where e.deptno=d.deptno
   
  select * from v_emp_3;








 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章