本次必須學習一個全新的概念-- 視圖 (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僅僅能使用 < 或 <=, 而用=, >, >= 都將不能返回不論什麼數據。