oracle 視圖基礎知識

視圖實際上是一個或多個表上的預定義查詢,這些表稱爲基表。

視圖並不存儲數據,只是在查詢視圖時才訪問基表。

視圖的優點:

·限制用戶只能通過視圖檢索數據,對用戶屏蔽基表

·可以將複雜的查詢編寫爲視圖,減少用戶查詢的複雜度

·限制某個視圖只能訪問基表中的部分數據,提高了安全性

//

創建視圖

create [or replace] [{force|noforce}] view view_name

[(alias_name[,alias_name...])]

as subquery

[with {check option|read only} constraint constraint_name]

or replace:如果視圖存在就替換它。

force:即使基表不存在也要建立該視圖。

noforce:若基表不存在就不建立此視圖,默認值。

view_name:視圖名稱。

alias_name:爲自查詢中的表達式指定一個別名,別名個數與子查詢中列數相同。

subquery:指定一個子查詢,它對基表進行查詢,如果已經提供別名,可以在select子句之後的列表中使用別名

with check option:表名只有子查詢檢索的行才能被插入、刪除、更新,

默認情況下,在插入、刪除、更新行之前並不會檢查這些行是否被子查詢檢索。

constraint_name:指定with check option或read only約束的名稱。

with read only:說明只能對基表中的行進行只讀訪問。

//

視圖有兩種基表類型

·簡單視圖,包含一個子查詢,它只能從一個基表中檢索數據

·複雜視圖,包含一個子查詢,有以下特點:

·從多個基表中檢索數據

·使用group by或distinct子句對行進行分組

·包含函數調用

//

實例1:

//

測試數據:

SQL> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

----- ---------- --------- ----- ----------- --------- --------- ------

7369 SMITH CLERK 7902 1980-12-17 800.00 20

7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30

7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30

7566 JONES MANAGER 7839 1981-4-2 2975.00 20

7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30

7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30

7782 CLARK MANAGER 7839 1981-6-9 2450.00 10

7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20

7839 KING PRESIDENT 1981-11-17 5000.00 10

7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30

7876 ADAMS CLERK 7788 1987-5-23 1100.00 20

7900 JAMES CLERK 7698 1981-12-3 950.00 30

7902 FORD ANALYST 7566 1981-12-3 3000.00 20

7934 MILLER CLERK 7782 1982-1-23 1300.00 10

//

SQL> select * from dept;

DEPTNO DNAME LOC

------ -------------- -------------

10 ACCOUNTING NEW YORK

20 RESEARCH DALLAS

30 SALES CHICAGO

40 OPERATIONS BOSTON

爲emp表建立一個簡單視圖,訪問emp表的屬性(empno,ename,job,sal),並且sal>1200的員工

create view view_emp as

select empno,ename,job,sal

from emp

where sal>1200;

//

select * from view_emp;

EMPNO ENAME JOB SAL

----- ---------- --------- ---------

7499 ALLEN SALESMAN 1600.00

7521 WARD SALESMAN 1250.00

7566 JONES MANAGER 2975.00

7654 MARTIN SALESMAN 1250.00

7698 BLAKE MANAGER 2850.00

7782 CLARK MANAGER 2450.00

7788 SCOTT ANALYST 3000.00

7839 KING PRESIDENT 5000.00

7844 TURNER SALESMAN 1500.00

7902 FORD ANALYST 3000.00

7934 MILLER CLERK 1300.00

/*從結果可知,我們將emp表中薪水大於1200的員工的empno,ename,sal查詢了出來*/

實例2:

建立一個複雜視圖

create or replace view view_emp_dept as

select d.deptno,d.dname,min(e.sal) min_sal,max(e.sal) max_sal

from emp e,dept d

where e.deptno=d.deptno(+)

group by d.deptno,d.dname;

//

select * from view_emp_dept;

DEPTNO DNAME MIN_SAL MAX_SAL

------ -------------- ---------- ----------

10 ACCOUNTING 1300 5000

20 RESEARCH 800 3000

30 SALES 950 2850

/*正如我們所期待的,我們將scott用戶下的emp表和dept表連接起來:

emp.deptno=dept.deptno(+),左外連接,

既按照emp表中的部門來查詢:

部門號(deptno),部門名稱(dname),部門最低薪水(min_sal),部門最高薪水(max_sal).*/

修改視圖

修改視圖時加上or replace即可,例如:

create view view_emp_sal as

select ename,job,deptno,sal

from emp

where sal>1000;

//

create or replace view view_emp_sal as

select ename,job,deptno,sal*12

from emp

where sal>1000;

//

編譯視圖

當基表改變時,建立在基表上的視圖就會無效,

我們可以通過下面這條語句從數據字典中查詢無效的視圖:

select 'alter view'||owner||'.'||object_name||'compile;'

from dba_objects

where status='INVALID' and object_type='VIEW';

//

刪除視圖

drop view view_name;

//

獲取視圖信息

通過查看user_views視圖

SQL> desc user_views;

Name Type Nullable Default Comments

---------------- -------------- -------- ------- ----------------------------------------------------------

VIEW_NAME VARCHAR2(30) Name of the view

TEXT_LENGTH NUMBER Y Length of the view text

TEXT LONG Y View text

TYPE_TEXT_LENGTH NUMBER Y Length of the type clause of the object view

TYPE_TEXT VARCHAR2(4000) Y Type clause of the object view

OID_TEXT_LENGTH NUMBER Y Length of the WITH OBJECT OID clause of the object view

OID_TEXT VARCHAR2(4000) Y WITH OBJECT OID clause of the object view

VIEW_TYPE_OWNER VARCHAR2(30) Y Owner of the type of the view if the view is a object view

VIEW_TYPE VARCHAR2(30) Y Type of the view if the view is a object view

SUPERVIEW_NAME VARCHAR2(30) Y Name of the superview, if view is a subview

//

SQL> select view_name,text_length,text

2 from user_views;

VIEW_NAME TEXT_LENGTH TEXT

------------------------------ ----------- --------------------------------------------------------------------------------

VIEW_EMP 52 select empno,ename,job,sal

from emp

where sal>1200

VIEW_EMP_DEPT 134 select d.deptno,d.dname,min(e.sal) min_sal,max(e.sal) max_sal

from emp e,dept d

//


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