Oracle的視圖和SQLServer的視圖基本一樣。
視圖,是一個虛擬的表,不會給視圖分配存儲空間。視圖的建立需要依賴於單個或多個普通表,被依賴的普通表就成爲"基表"。可以就像 用 select 語句類似,在某些表中選取字段和篩選條件,可以查詢出數據,把這數據構成一張虛擬的表,這就叫視圖。
視圖隱藏了數據的複雜性,還可以方便用戶的查詢,另外,還可以隔離物理表結構改變。視圖通常是用來查詢的,也可以對視圖進行增刪改。但是在視圖上進行增刪改要滿足一些前提: 單表視圖可以進行增刪改操作;在多表視圖中,只能對 鍵保留表進行刪改操作;或者 定義觸發器,替換掉增刪改語句。對視圖進行新增、刪除、修改視圖的數據是會把關聯的基表數據給改變的。
視圖創建語句如下,也可以在視圖上創建視圖
CREATE[OR REPLACE] VIEW [viewName]
AS
select s.sno,s.sname,s.deptno
from STUDENT s
[WITH CHECK OPTION]
[WITH Read ONLY];
例如 創建了帶主鍵的表DEPARTMENT、STUDENT 一個多表視圖VW_STU_DEPT 兩個單表視圖
---建立表---
CREATE TABLE DEPARTMENT(
DEPTNO CHAR(3) PRIMARY KEY,
DEPTNAME VARCHAR2(20)
);
INSERT INTO DEPARTMENT VALUES('001','中文系');
INSERT INTO DEPARTMENT VALUES('002','數學系');
INSERT INTO DEPARTMENT VALUES('003','英語系');
---建立表---
CREATE TABLE STUDENT(
SNO NUMBER (6) PRIMARY KEY,
SNAME VARCHAR2(10),
DEPTNO CHAR(3),
CONSTRAINT dep_DEPARTMENT FOREIGN KEY (DEPTNO) REFERENCES DEPARTMENT(DEPTNO)
);
INSERT INTO STUDENT VALUES(1,'張三','001');
INSERT INTO STUDENT VALUES(2,'李四','001');
INSERT INTO STUDENT VALUES(3,'王五','002');
----建立多表視圖----
CREATE VIEW VW_STU_DEPT
as
select s.sno,s.sname,s.deptno dept1,
d.deptno dept2,d.deptname from STUDENT s,DEPARTMENT d
where s.deptno=d.deptno
commit;
------建立單表視圖----
CREATE VIEW VW_STU1
as
select s.sno,s.sname,s.deptno
from STUDENT s
where deptno='001';
------建立單表視圖----
CREATE VIEW VW_STU2
as
select s.sno,s.sname,s.deptno
from STUDENT s
where deptno='001'
WITH CHECK OPTION;
視圖是一個虛擬表,查詢視圖的方法和查詢表是一樣的。單表視圖是可以進行修改的:
我們可以看見,單表視圖 VW_STU1 被成功修改,修改完後數據少一行的原因就是這個視圖的篩選條件只有STUDENT表上的 字段depno值要爲 '001' 纔會被納入視圖 VW_STU1 。
我們Rollback 後,再對VW_STU2 視圖進行相同的SQL操作
發現程序報錯的原因就在於 VW_STU2,加了 WITH CHECK OPTION 條件,這個條件禁止了把視圖數據減少的修改語句,但是增改操作還是可以的。 如果把視圖設爲只讀,在創建視圖的時候設定 WITH READ ONLY 就行,這樣就無法對視圖進行增刪改操作。
鍵保留表就是在定義視圖的時候,能夠在視圖上保留主鍵的基表
很明顯,對於視圖VW_STU_DEPT 中 保留了STUDENT基表上的主鍵,那麼STUDENT就是 鍵保留表,視圖只能對鍵保留表進行修改操作,不能對非鍵保留表進行修改操作,新增刪除依舊是可以的。
無法對多表視圖進行新增操作
但是可以對多表視圖進行刪除操作:
同時會影響到鍵保留表數據,但是不會影響到非鍵保留表數據
總而言之,在單表視圖中可以進行增刪查改操作,在多表視圖中只能對鍵保留表進行 刪查改 操作,無法修改普通表的。換言之,如果視圖沒有關聯的表裏面沒有主鍵,那麼就肯定無法進行增刪改操作。
刪除視圖:
DROP VIEW [視圖名];