天天看點

視圖

<b>視圖:</b>是一個封裝了各種複雜查詢的語句,就稱為視圖。

<b>建立視圖</b>

       CREATE VIEW 視圖名字(字段) AS 子查詢

建立一個隻包含20部門雇員資訊的視圖(雇員的編号、姓名、工資)

       CREATE VIEW empv20 (empno,ename,sal) AS SELECT empno,ename,sal FROM emp WHERE deptno=20 ;

例如:将之前的一個複雜語句包裝成視圖

顯示部門内最低工資比20部門最低工資要高的部門的編号及部門内最低工資:

SELECT deptno,MIN(sal) FROM emp GROUP BY deptno HAVING MIN(sal)&gt;(SELECT MIN(sal) FROM emp WHERE deptno=20) ;

       此時就可以将上面的複雜查詢語句建立一張視圖,之後查詢視圖即可。

注意:

       如果要建立一個同名的視圖,則必須先将之前的視圖删除掉,再進行建立:

              DROP VIEW empv20 ;

       有些時候如果先删除再建立操作會比較麻煩,是以有時候最好的方式:如果視圖存在則先自動删除,之後自動建立。

CREATE OR REPLACE VIEW empv20 (deptno,msal) AS (SELECT deptno,MIN(sal) FROM emp GROUP BY deptno HAVING MIN(sal)&gt;(SELECT MIN(sal) FROM emp WHERE deptno=20)) ;

<b>注意點:</b>

       例如,還是建立一個隻包含20部門的視圖

              CREATE OR REPLACE VIEW empv20 (empno,ename,sal,deptno) AS SELECT empno,ename,sal,deptno FROM emp WHERE deptno=20 ;

       現在直接更新視圖裡的資料

              将7369的雇員編号修改為30。此操作在視圖中完成。

                     update empv20 SET deptno=30 where empno=7369 ;

              此時,提示更新完成。

       預設情況下建立的視圖,如果更新了,則會自動将此資料從視圖中删除,之後會更新原本的資料。

<b>思考:</b>

       如果能這樣做的話,肯定存在問題,因為視圖最好還是不要更新。

在建立視圖的時候有兩個參數:

       · WITH CHECK OPTION  à 保護視圖的建立規則

CREATE OR REPLACE VIEW empv20 (empno,ename,sal,deptno)

AS SELECT empno,ename,sal,deptno FROM emp WHERE deptno=20

WITH CHECK OPTION CONSTRAINT empv20_ck;

       再執行更新操作:

              update empv20 SET deptno=30 where empno=7369 ; à 此處更新的是部門編号,失敗

                     |- 之前是按照部門編号建立的視圖,是以不能修改部門編号

              update empv20 SET ename='tom' where empno=7369 ; à 可以更新,更新的是名字,成功

       · WITH READ ONLY(隻讀,不可修改),視圖最好不要輕易的修改

WITH READ ONLY;

       現在任意的字段都不可更改,是以現在的視圖是隻讀的。

本文轉自 李興華 51CTO部落格,原文連結:http://blog.51cto.com/lixinghua/91217,如需轉載請自行聯系原作者