1.1 視圖的定義
視圖(View)是數據庫中非常重要的內容,在實際開發中必須學會視圖的編寫。
用于產生視圖的表叫做該視圖的基表。一個視圖也可以從另一個視圖中產生。視圖是可以嵌套的。
視圖的定義存在數據庫中,與此定義相關的數據并沒有再存一份于數據庫中。視圖看上去非常象數據庫的物理表,對它的操作同任何其它的表一樣。
通過視圖修改數據時,實際上是在改變基表中的數據。基表數據的改變也會自動反映在由基表產生的視圖中。
1.2視圖的語法和優勢
視圖的具體優勢如下:
可以限制用戶只能通過視圖檢索數據。這樣就可以對最終用戶屏蔽建表時底層的基表;
可以將復雜的查詢保存為視圖,可以對最終用戶屏蔽一定的復雜性;
限制某個視圖只能訪問基表中的部分列或者部分行的特定數據,保證數據的安全性。
從多張基表中按一定的業務邏輯抽出用戶關心的部分,形成一張虛擬表。
創建視圖的語法如下:
create [ or replace ] [ force ] view [schema.]view_name
[ (column1,column2,…) ]
as
select …
[ with check option ] [ constraint constraint_name ]
[ with read only ];
(1) or replace: 如果存在同名的視圖, 則使用新視圖替代已有的視圖
(2) force: 強制創建視圖,不考慮基表是否存在,也不考慮是否具有使用基表的權限
(3) column1,column2,…:視圖的列名, 列名的個數必須與select查詢中列的個數相同; 如果select查詢包含函數或表達式,則必須為其定義列別名。
(4) with check option: 指對視圖執行的dml操作必須滿足“視圖子查詢”的條件即,對通過視圖進行的增刪改操作進行檢查,要求增刪改操作的數據, 必須是查詢語句所能查詢到的數據,否則不允許操作并返回錯誤提示。
(5)with read only:創建的視圖只能用于查詢數據, 不能用于更改數據。
視圖分為簡單視圖和復雜視圖。
簡單視圖:是指基于單個表建立的,不包含任何函數、表達式和分組數據的視圖。對簡單視圖可以進行dml操作。
復雜視圖是指在視圖定義中包括了聚合函數、分析函數、用戶自定義函數、多表關聯、子查詢等。此類視圖在某些特定條件下,優化器無法將視圖外的謂詞條件推送至視圖內的基表上,即使在基表的列上創建索引也無法使用索引。
對視圖進行DML操作就是對視圖數據來源的基礎表進行的操作(但不能違反基礎表的約束條件)。只能對簡單視圖進行DML操作,復雜視圖不可以。
【例1-1】建立雇員表包括職工編號、姓名、薪水、電話號碼。建立基于該表
的簡單視圖 vw_emp,對視圖進行dml操作
–第五章\st.sql
create table SM_EMP
( empid varchar2(30),
name varchar2(30),
salary NUMBER(6,2),
telno CHAR(8)
);
–建立視圖
create view vw_emp as select empid,name,salary,telno from SM_EMP;
對簡單視圖進行DML操作,代碼如下:
–插入數據
INSERT INTO vw_emp VALUES(‘15661’,‘張飛雨’,5500,'6678562 ');
–更新數據
update vw_emp set name=‘張雨庭’ where name=‘張飛雨’;
delete vw_emp where name=‘張雨庭’;
–查詢數據
select * from vw_emp where empid=‘15661’;
【例1-2】建立表銷售訂單表,包括操作號碼、總價、員工編號、銷售時間。建立雇員表包括職工編號、姓名、薪水、電話號碼。建立復雜視圖查詢職工的基本信息、 銷售總價、銷售時間。銷售總價的10%作為職工的提成,查詢出拿到提成的職工姓名。
建表,建立視圖代碼如下:
–第五章\st.sql
–建立銷售訂單表
CREATE TABLE sm_saleorderlist(
TransactionID NUMBER(10) ,
TotalPrice NUMBER(7,2) NOT NULL,
EmployID varchar2(30) NOT NULL,
SaleTime DATE NOT NULL,
PRIMARY KEY(TransactionID));
–插入測試數據
INSERT INTO sm_saleorderlist VALUES(1,100.10,‘0000000001’,‘09_9月_15’);
INSERT INTO sm_saleorderlist VALUES(3,300.10,‘0000000002’,‘09_9月_20’);
INSERT INTO sm_saleorderlist VALUES(4,100.10,‘0000000003’,‘09_9月_19’);
COMMIT;
–建立雇員表
create table SM_EMP
( empid varchar2(30),
name varchar2(30),
salary NUMBER(6,2),
telno CHAR(8)
);
INSERT INTO sm_emp VALUES(‘0000000001’,‘張飛飛’,5500,'6678562 ');
INSERT INTO sm_emp VALUES(‘0000000002’,‘關庭’,4500,‘87825626’);
INSERT INTO sm_emp VALUES(‘0000000003’,‘孫海’,6200,‘87783617’);
Commit;
–建立視圖,查詢銷售總價和銷售時間
create or replace view smv_zhcx
as
select a.empid,a.name,a.telno,b.transactionid,b.totalprice,b.saletime from sm_emp a
left join
sm_saleorderlist b
on a.empid=b.EmployID
–建立視圖,查詢職工能拿到提成
create view smv_cs
as
select empid,name,telno,totalprice*0.1 as commission ,saletime
from smv_zhcx
查詢視圖smv_zhcx數據,代碼如下:
select * from smv_zhcx t
執行后如圖5-1所示。
圖5-1查詢視圖smv_zhcx數據
查詢視圖smv_cs數據,代碼如下:
select * from smv_cs
執行后如圖5-2所示。
圖5-2查詢視圖smv_cs數據
5.1.3視圖修改和刪除
修改視圖的過程即為重新定義視圖的過程。可以通過先刪除視圖,然后再次創建視圖實現。另外,Oralce數據庫提供了一個專門的命令create or replace view來重新定義視圖。
刪除視圖的動作實際為刪除數據庫中的對象操作,因此該操作為DML操作。如同刪除數據表對象,刪除視圖也應該使用drop命令,其語法形式如下所示。
DROP VIEW view_name;
5.3視圖和表的區別
(1)表是創建好的,真實存在的,而視圖只是一段已經編譯好的sql語句。
(2)表占有真實的物理空間,而視圖只是一個邏輯概念。數據都是存儲在表里面的。
(3)表是內模式,視圖是外模式(內模式又稱存儲模式,對應于物理級,它是數據庫中全體數據的內部表示或底層描述,是數據庫最低一級的邏輯描述,它描述了數據在存儲介質上的存儲方式和物理結構,對應著實際存儲在外存儲介質上的數據庫。內模式由內模式描述語言來描述、定義,它是數據庫的存儲觀。外模式又稱子模式,對應于用戶級。它是某個或某幾個用戶所看到的數據庫的數據視圖,是與某一應用有關的數據的邏輯表示。外模式是從模式導出的一個子集,包含模式中允許特定用戶使用的那部分數據。
(4)視圖是查看數據表的一種方法,可以查詢到表中用戶想知道的數據,并且還不知道表結構,比較安全。
(5)表可以做增刪改查,視圖中簡單視圖可以做DML操作,復雜視圖只可以查詢。
(6)視圖的創建和刪除不影響表.