更新時間:2021-08-20 來源:黑馬程序員 瀏覽量:
加QQ:435946716獲取Orcale視頻全套【筆記+教程】
視圖是一種數據庫對象,是從一個或者多個數據表或視圖中導出的虛表,視圖所對應的數據并不真正地存儲在視圖中,而是存儲在所引用的數據表中,視圖的結構和數據是對數據表進行查詢的結果。
根據創建視圖時給定的條件,視圖可以是一個數據表的一部分,也可以是多個基表的聯合,它存儲了要執行檢索的查詢語句的定義,以便在引用該視圖時使用。、
使用視圖的優點:
(1) 簡化數據操作:視圖可以簡化用戶處理數據的方式。
(2) 著重于特定數據:不必要的數據或敏感數據可以不出現在視圖中。
(3) 視圖提供了一個簡單而有效的安全機制,可以定制不同用戶對數據的訪問權限。
(4) 提供向后兼容性:視圖使用戶能夠在表的架構更改時為表創建向后兼容接口。
CREATE [OR REPLACE] [FORCE] VIEW view_name AS subquery [WITH CHECK OPTION ] [WITH READ ONLY]
選項解釋:
OR REPLACE :若所創建的試圖已經存在,ORACLE 自動重建該視圖;
FORCE :不管基表是否存在 ORACLE 都會自動創建該視圖;
subquery :一條完整的 SELECT 語句,可以在該語句中定義別名;
WITH CHECK OPTION :插入或修改的數據行必須滿足視圖定義的約束;
WITH READ ONLY :該視圖上不能進行任何 DML 操作。
DROP VIEW view_name
4.1 簡單視圖的創建與使用
什么是簡單視圖?如果視圖中的語句只是單表查詢,并且沒有聚合函數,我們就
稱之為簡單視圖。
需求:創建視圖 :業主類型為 1 的業主信息
語句:
create or replace view view_owners1 as select * from T_OWNERS where ownertypeid=1
利用該視圖進行查詢
select * from view_owners1 where addressid=1;
就像使用表一樣去使用視圖就可以了。
對于簡單視圖,我們不僅可以用查詢,還可以增刪改記錄。
我們下面寫一條更新的語句,試一下:
update view_owners1 set name='王剛' where id=2;
再次查詢:
select * from view_owners1
查詢結果如下:
結果已經更改成功。
我們再次查詢表數據
發現表的數據也跟著更改了。由此我們得出結論:視圖其實是一個虛擬的表,它的數據其實來自于表。如果更改了視圖的數據,表的數據也自然會變化,更改了表的數據,視圖也自然會變化。一個視圖所存儲的并不是數據,而是一條SQL語句。
4.2 帶檢查約束的視圖
需求:根據地址表(T_ADDRESS)創建視圖VIEW_ADDRESS2,內容為區域ID為2的記錄。
語句:
create or replace view view_address2 as select * from T_ADDRESS where areaid=2 with check option
執行下列更新語句:
update view_address2 set areaid=1 where id=4
系統提示如下錯誤信息:
4.3 只讀視圖的創建與使用
如果我們創建一個視圖,并不希望用戶能對視圖進行修改,那我們就需要創建視圖時指定 WITH READ ONLY 選項,這樣創建的視圖就是一個只讀視圖。
需求:將上邊的視圖修改為只讀視圖
create or replace view view_owners1 as select * from T_OWNERS where ownertypeid=1 with read only
語句:
修改后,再次執行 update 語句,會出現如下錯誤提示
4.4 創建帶錯誤的視圖
我們創建一個視圖,如果視圖的 SQL 語句所設計的表并不存在,如下
create or replace view view_TEMP as select * from T_TEMP
T_TEMP 表并不存在,此時系統會給出錯誤提示
有的時候,我們創建視圖時的表可能并不存在,但是以后可能會存在,我們如果此時需要創建這樣的視圖,需要添加 FORCE 選項,SQL 語句如下:
create or replace FORCE view view_TEMP as select * from T_TEMP
此時視圖創建成功。
4.5 復雜視圖的創建與使用
所謂復雜視圖,就是視圖的 SQL 語句中,有聚合函數或多表關聯查詢。
我們看下面的例子:
(1)多表關聯查詢的例子
需求:
創建視圖,查詢顯示業主編號,業主名稱,業主類型名稱
語句:
create or replace view view_owners as select o.id 業主編號,o.name 業主名稱,ot.name 業主類型 from T_OWNERS o,T_OWNERTYPE ot where o.ownertypeid=ot.id
使用該視圖進行查詢
select * from view_owners
那這個視圖能不能去修改數據呢?
我們試一下下面的語句:
update view_owners set 業主名稱='范小冰' where 業主編號=1;
可以修改成功。
我們再試一下下面的語句:
update view_owners set 業主類型='普通居民' where 業主編號=1;
這次我們會發現,系統彈出錯誤提示:
這個是什么意思?是說我們所需改的列不屬于鍵保留表的列。
什么叫鍵保留表呢?
鍵保留表是理解連接視圖修改限制的一個基本概念。該表的主鍵列全部顯示在視圖中,并且它們的值在視圖中都是唯一且非空的。也就是說,表的鍵值在一個連接視圖中也是鍵值,那么就稱這個表為鍵保留表。
在我們這個例子中,視圖中存在兩個表,業主表(T_OWNERS)和業主類型表(T_OWNERTYPE), 其中 T_OWNERS 表就是鍵保留表,因為T_OWNERS的主鍵也是作為視圖的主鍵。鍵保留表的字段是可以更新的,而非鍵保留表是不能
更新的。
(2)分組聚合統計查詢的例子
需求:創建視圖,按年月統計水費金額,效果如下
語句:
create view view_accountsum as select year,month,sum(money) moneysum from T_ACCOUNT group by year,month order by year,month
此例用到聚合函數,沒有鍵保留表,所以無法執行 update 。
猜你喜歡: