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