Oracle 學習筆記 11 -- 視圖 (VIEW)

本次必須學習一個全新的概念-- 視圖 (VIEW)。在前面的筆記中曾提到過,數據對象包含:表、視圖、序列、索引和同義詞。前面的筆記都是對錶的想剖析,那麼本次筆記就對視圖的世界進行深刻的剖析。數據庫

      視圖是經過對一個表或者是多個表查詢獲得的,是從表中抽出的邏輯上相關的數據集合。但是視圖是一種虛表,它創建在已經存在表的基礎之上。也可以理解爲表中導出的「表」。視圖定義所根據的表稱爲基表,有點相似與JAVA中的父類(基類)。安全

     利用視圖可以控制對數據的訪問。簡化查詢,可以避免直接對數據庫中真實存在的表進行直接訪問,提升數據庫的安全性。函數


建立視圖學習


 建立視圖語法格式:    spa


CREATE [OR ERPLACE ]  VIEW   view_name   excel

as  子查詢 [WITH READ ONLY] | [WITH CHECK OPTION]。對象

子查詢可以是複雜的語句,如多個表之間的鏈接,子查詢可以使用單行函數。可以經過給子查詢中的列定義別名排序

來爲視圖的列定義成想要的名字。索引


例:建立視圖,依賴emp表。開發

SQL> create view emp_view 
  2  as select empno ,ename ,sal from emp ;
 
View created

在用soctt用戶運行上述語句的時候。可能會提示,沒有建立視圖的權限。可用如下的操做解決。

Oracle - OraClient10g_home1 --> Oracle EnterPrise Manager Console -->鏈接身份DBA

-->安全性-->用戶-->scott --> 雙擊-->系統 --> 加入create any view 權限-->肯定


現在對視圖進行查詢。

SQL> select * from  emp_view ;
 
EMPNO ENAME            SAL
----- ---------- ---------
 7369 SMITH         800.00
 7499 ALLEN        1600.00
 7521 WARD         1250.00
 7566 JONES        2975.00
 7654 MARTIN       1250.00
 7698 BLAKE        2850.00
 7782 CLARK        2450.00
 7788 SCOTT        3000.00
 7839 KING         5000.00
 7844 TURNER       1500.00
 7876 ADAMS        1100.00
 7900 JAMES         950.00
 7902 FORD         3000.00
 7934 MILLER       1300.00
 
14 rows selected

emp_view視圖定義以後。在此建立emp_view 視圖時,會提示名稱已經由現有對象使用,說明視圖的名稱不

贊成反覆。

假設想依舊使用emp_view視圖,可以使用 :

create or replace view emp_view as select empno ,ename ,sal from emp 。

儘管已經創

了emp_view語句,仍然可以建立成功。

系統會刪除emp_view視圖,在建立一個新的視圖。對視圖仍然可以

行相關的插入更新操做。對視圖的操做都會返回到基表中。和直接對錶的操做效果同樣。

例:對視圖進行插入刪除操做。將ename爲JAMES的工資改成2000 。插入一條新的數據。

SQL> update emp_view set sal = 2000 where ename = 'JAMES' ;

SQL> insert into emp_view values(7935 , 'zhangsan' , 5000);

如下看一下操做結果:

SQL> select * from emp_view where ename = 'JAMES' ;
 
EMPNO ENAME            SAL
----- ---------- ---------
 7900 JAMES        2000.00
 
SQL> select * from emp  where ename = 'JAMES' ;
 
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7900 JAMES      CLERK      7698 1981/12/3     2000.00               30


SQL> select * from emp_view  where ename='zhangsan' ; 
 
EMPNO ENAME            SAL
----- ---------- ---------
 7935 zhangsan     5000.00
 
SQL> select * from emp where ename='zhangsan';
 
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7935 zhangsan                                 5000.00           

上面使用DML語句進行了插入和更新操做。但是視圖使用DML時另外一些特別的規定:

當視圖定義中包括下面元素時,不能使用delete:

組函數、GROUP BY 、DISTINST 和 ROWNUM 僞列。

當視圖定義中包括下面元素時,不能使用update:

組函數、GROUP BY 、DISTINST 、 ROWNUM 僞列和列的定義表達式。

當視圖定義中包括下面元素時,不能使用insert:

組函數、GROUP BY 、DISTINST 、 ROWNUM 僞列、列的定義表達式和表中非空的列在視圖中未包含。

假設建立的視圖僅僅是爲了讓人瀏覽的內容而不能改動或者插入新的數據的話,那麼需要在建立視圖的時候加入限制(with read only) 僅僅讀的 。

create or replace view emp_view
as select empno ,ename ,sal from emp 
with read only

此時在運行update語句 update emp_view set sal = 2000 where ename = 'JAMES',會出現
ORA-01733: 此處不一樣意虛擬列提示 。


with check option :不能更新視圖的建立條件。此處不在贅述。


前面在運行多表查詢的時候。有這種一條語句,將emp表和dept表進行聯立。

select empno  ,ename , dname ,e.deptno
from emp e , dept d 
where d.deptno  = e.deptno 


EMPNO ENAME      DNAME          DEPTNO
----- ---------- -------------- ------
 7369 SMITH      RESEARCH           20
 7499 ALLEN      SALES              30
 7521 WARD       SALES              30
 7566 JONES      RESEARCH           20
 7654 MARTIN     SALES              30
 7698 BLAKE      SALES              30
 7782 CLARK      ACCOUNTING         10
 7788 SCOTT      RESEARCH           20
 7839 KING       ACCOUNTING         10
 7844 TURNER     SALES              30
 7876 ADAMS      RESEARCH           20
 7900 JAMES      SALES              30
 7902 FORD       RESEARCH           20
 7934 MILLER     ACCOUNTING         10
 
14 rows selected

假設在開發的過程當中,要屢次使用上面的多表鏈接的語句,那麼確定是很麻煩的。因此此時可以將上面多表查

詢的結果創建成一個試圖。

再次使用的時候就輕鬆多了 。

create view view_emp
as
select empno  ,ename , dname ,e.deptno
from emp e , dept d 
where d.deptno  = e.deptno 


當運行select * from view_emp ;語句時,與上面的多表查詢的效果是同樣的。使用試圖可以簡化操做。


刪除視圖

基本的語法:

DROP VIEW view_name ;

刪除視圖僅僅是刪除用戶本身建立的視圖,不會對基表中的數據產生影響。

例:刪除上面定義的視圖emp_view 。

drop view emp_name ;

 

Rownum 僞列

    上面提到了一個新的知識點rownum 僞劣。如下進行詳細的解釋一下。rownum 有點相似與excel中的表示行

的序號。實際上這是一個列,僞劣,可以在每張表中出現。

例:查詢表emp中的rownum 。

SQL> select rownum , empno from emp ;
 
    ROWNUM EMPNO
---------- -----
         1  7369
         2  7499
         3  7521
         4  7566
         5  7654
         6  7698
         7  7782
         8  7788
         9  7839
        10  7844
        11  7876
        12  7900
        13  7902
        14  7934
        15  7935
 
15 rows selected

假設現在想要查詢工資從高到低的前五條的數據,那麼

SQL> select rownum , empno,sal from emp where rownum <= 5 order by sal desc;
 
    ROWNUM EMPNO       SAL
---------- ----- ---------
         1  7935   5000.00
         5  7566   2975.00
         3  7499   1600.00
         4  7521   1250.00
         2  7369    800.00

觀察上面的數據,儘管是依照sal從高到低的排序,但是卻不是咱們想高的最高的五條數據的排序。事實上rownum和empno之間有某種關係。想要打破這中關係,可以使用如下的語句。

select rownum , empno,sal
from(
   select rownum , empno,sal
    from emp order by sal desc
)
where rownum <= 5

 

    ROWNUM EMPNO       SAL
---------- ----- ---------
         1  7935   5000.00
         2  7839   5000.00
         3  7788   3000.00
         4  7902   3000.00
         5  7566   2975.00

上面的查詢結果纔是咱們想要的結果。

假設咱們想要查詢3到8之間的數據呢 ?可以使用如下的數據

select rn ,empno ,sal from(
  select rownum rn , empno,sal
  from(
    select rownum , empno,sal
    from emp order by sal desc
  )
)
where rn >=3 and rn <=8 

 

 RN        EMPNO       SAL
------ ----- ---------
     3  7902   3000.00
     4  7788   3000.00
     5  7566   2975.00
     6  7698   2850.00
     7  7782   2450.00
     8  7900   2000.00
 
6 rows selected

              上面給rownum 起了一個別名,將這個僞劣化爲了一個實實在在存在的列。便可以進行 where rn > = 3 和 rn

    <=8的操做了。

注意:

ROWNUM僅僅能使用 < <=, 而用=, >, >= 都將不能返回不論什麼數據。

相關文章
相關標籤/搜索