<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)>(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)>(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,如需轉載請自行聯系原作者