1.關於視圖
-限制對數據庫的訪問
-容易實現複雜的查詢
-對於相同的數據可以產生不同的視圖
2.創建視圖
1)在CREATE VIEW語句中嵌入一子查詢
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[,alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
例:創建視圖empv,該屬兔僅包含10部門僱員的細節信息。
CREATE VIEW empv
AS SELECT empno,ename,job
FROM emp
WHERE deptno=10;
查看:DESC empv
2)別名的使用
例1:CREATE OR REPLACE VIEW salv
AS SELECT empno EMPLOYEE_ID,ename NAME,sal SALARY
FROM emp
WHERE deptno=30;
例2:CREATE OR REPLACE VIEW salv
(EMPLOYEE_ID,NAME,SALARY)
AS SELECT empno,ename,sal
FROM emp
WHERE deptno=30;
3.創建複雜視圖
例:創建一個基於兩個表並且含有組函數的複雜視圖
CREATE OR REPLACE VIEW dept_sum_v(name,minsal,maxsal,avgsal)
AS SELECT d.dname,MIN(e.sal),MAX(e.sal),AVG(e.sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.dname;
4.查看視圖
數據字典USER_VIEWS
SELECT view_name,text
FROM user_views;
結果:
VIEW_NAME TEXT
SALV SELECT empno EMPLOYEE_ID,ename NAME,sal SALARY FROM emp WH
5.從視圖檢索數據
SELECT * FROM salv;
6.視圖上執行DML操作
1)如果視圖包含以下內容,則不能實現對數據的修改:
-GROUP函數、GROUP BY子句、DISTINCT關鍵字
-使用表達式定義的列
-ROWNUM僞列
2)如果視圖中包含以下內容則不能刪除數據行
-GROUP函數
-GROUP BY子句
-DISTINCT關鍵字
-ROWNUM僞列
7.WITH CHECK OPTION子句
-如果要確保在視圖上執行的插入、更新操作僅限於一定的範圍,便可使用WITH CHECK OPTION 子句
例:
CREATE OR REPLACE VIEW empv
AS SELECT *
FROM emp
WHERE deptno=20
WITH CHECK OPTION CONSTRAINT empv_ck;
測試一:update empv set deptno=10 where empno=7369
結果:
ERROR 位於第 1 行:
ORA-01402: 視圖 WITH CHECK OPTIDN 違反 where 子句
測試二:update empv set sal=2000 where empno=7369
結果:已更新 1 行。
8.拒絕DML操作
-在視圖定義時使用WITH READ ONLY選項可以確保不能對視圖執行DML操作
例:
CREATE OR REPLACE VIEW empv(employee_ID,employ_name,job_title)
AS SELECT empno,ename,job
FROM emp
WHERE deptno=10
WITH READ ONLY;
9.刪除視圖
-刪除視圖並不會刪除數據,因爲視圖是基於數據庫中的基表
DROP VIEW view;
例:DROP VIEW empv;
10.小結
視圖是基於一個或多個表或視圖的邏輯表,它本身不包含數據,具有一下優點
-限制對數據庫的訪問
-簡化查詢
-維護數據的獨立性
-對相同的數據可以建立不同的視圖
-可以刪除視圖而不影響數據
練習
1.根據emp表來創建視圖empv,選取ename、job、sal、deptno列,分別對應顯示僱員名、工作類別、薪水、部門號
要求:只看到薪水小於1500的僱員信息
CREATE OR REPLACE VIEW empv
AS SELECT ename "僱員名",job "工作類別",sal "薪水",deptno "部門號"
FROM emp
WHERE sal<1500;
或:
CREATE OR REPLACE VIEW empv( "僱員名", "工作類別", "薪水","部門號")
AS SELECT ename,job,sal,deptno
FROM emp
WHERE sal<1500;
2.根據emp、dept表來創建視圖dept_sum_v,顯示empno、ename、job、sal、deptno、dname列信息
CREATE OR REPLACE VIEW dept_sum_v
AS SELECT empno,ename,job,sal,d.deptno,dname
FROM emp e,dept d
WHERE e.deptno=d.deptno;
3.創建視圖empv,顯示部門編號、僱員編號、僱員名字、薪水。
通過視圖empv插入數據(10,1000,'小王',2000)
CREATE OR REPLACE VIEW empv("部門編號","僱員編號","僱員名字","薪水")
AS SELECT deptno,empno,ename,sal
FROM emp;
INSERT INTO empv
VALUES (10,1000,'小王',2000);
4.創建視圖empv1,顯示部門編號,僱員編號,僱員名字,薪水,年薪。
通過視圖empv1插入數據(10,1000,'小王',2000,24000)
CREATE OR REPLACE VIEW empv1
("部門編號","僱員編號","僱員名字","薪水","年薪")
AS SELECT deptno,empno,ename,sal,sal*12
FROM emp;
INSERT INTO empv1
VALUES (10,1000,'小王',2000,24000);
結果:
INSERT INTO empv1
*
ERROR 位於第 1 行:
ORA-01733: 此處不允許虛擬列
5.創建視圖empv2,顯示部門編號,僱員名字,薪水,僱用日期
通過視圖empv2插入數據(10,'小王',2000,'2007-8-1')
CREATE OR REPLACE VIEW empv2("部門編號","僱員名字","薪水","僱用日期")
AS SELECT deptno,ename,sal,hiredate
FROM emp;
INSERT INTO empv2
VALUES (10,'小王',2000,'2007-8-1');
結果:
VALUES (10,'小王',2000,'2007-8-1')
*
ERROR 位於第 2 行:
ORA-01861: 文字與格式字符串不匹配
6.創建視圖empv3,顯示empno,ename,deptno,dname,sal
通過視圖empv3插入數據(1001,'小王',10,'開發部',2000)
CREATE OR REPLACE VIEW empv3
AS SELECT empno,ename,d.deptno,dname,sal
FROM emp e,dept d
WHERE e.deptno=d.deptno;
INSERT INTO empv3
VALUES (1001,'小王',10,'開發部',2000);
結果:
INSERT INTO empv3
*
ERROR 位於第 1 行:
ORA-01776: 無法通過連接視圖修改多個基表
7.通過視圖empv更新僱員編號是1000的僱員,薪水爲2500
UPDATE empv
SET sal=2500
WHERE empno=1000;
8.創建視圖empv3,根據部門分組顯示部門編號、部門最大薪水、最少薪水
更新部門編號爲10的部門,將最少的薪水增加500
CREATE OR REPLACE VIEW empv3
AS SELECT deptno,MAX(sal) maxsal,MIN(sal) minsal
FROM emp
GROUP BY deptno;
UPDATE empv3
SET minsal=minsal+500
WHERE deptno=10;
結果:
UPDATE empv3
*
ERROR 位於第 1 行:
ORA-01732: 此視圖的數據操縱操作非法
9.查看所建立的視圖
SELECT view_name,text
FROM user_views;
9.刪除以上創建的所有視圖
DROP VIEW dept_sum_v;
DROP VIEW empv;
DROP VIEW empv1;
DROP VIEW empv2;
DROP VIEW empv3;