教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

什么是oracle視圖?創(chuàng)建或修改oracle視圖語法

更新時間:2021年08月20日16時56分 來源:傳智教育 瀏覽次數(shù):

加QQ:435946716獲取Orcale視頻全套【筆記+教程】



1. 什么是視圖?

視圖是一種數(shù)據(jù)庫對象,是從一個或者多個數(shù)據(jù)表或視圖中導(dǎo)出的虛表,視圖所對應(yīng)的數(shù)據(jù)并不真正地存儲在視圖中,而是存儲在所引用的數(shù)據(jù)表中,視圖的結(jié)構(gòu)和數(shù)據(jù)是對數(shù)據(jù)表進行查詢的結(jié)果。

根據(jù)創(chuàng)建視圖時給定的條件,視圖可以是一個數(shù)據(jù)表的一部分,也可以是多個基表的聯(lián)合,它存儲了要執(zhí)行檢索的查詢語句的定義,以便在引用該視圖時使用。、

使用視圖的優(yōu)點:

(1) 簡化數(shù)據(jù)操作:視圖可以簡化用戶處理數(shù)據(jù)的方式。

(2) 著重于特定數(shù)據(jù):不必要的數(shù)據(jù)或敏感數(shù)據(jù)可以不出現(xiàn)在視圖中。

(3) 視圖提供了一個簡單而有效的安全機制,可以定制不同用戶對數(shù)據(jù)的訪問權(quán)限。

(4) 提供向后兼容性:視圖使用戶能夠在表的架構(gòu)更改時為表創(chuàng)建向后兼容接口。


2. 創(chuàng)建或修改視圖語法

CREATE [OR REPLACE] [FORCE] VIEW view_name 
AS subquery 
[WITH CHECK OPTION ] 
[WITH READ ONLY]

選項解釋:

OR REPLACE :若所創(chuàng)建的試圖已經(jīng)存在,ORACLE 自動重建該視圖;

FORCE :不管基表是否存在 ORACLE 都會自動創(chuàng)建該視圖;

subquery :一條完整的 SELECT 語句,可以在該語句中定義別名;

WITH CHECK OPTION :插入或修改的數(shù)據(jù)行必須滿足視圖定義的約束;

WITH READ ONLY :該視圖上不能進行任何 DML 操作。


3. 刪除視圖語法


DROP VIEW view_name

4. 案例


4.1 簡單視圖的創(chuàng)建與使用

什么是簡單視圖?如果視圖中的語句只是單表查詢,并且沒有聚合函數(shù),我們就

稱之為簡單視圖。

需求:創(chuàng)建視圖 :業(yè)主類型為 1 的業(yè)主信息

語句:

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

查詢結(jié)果如下:

視圖

結(jié)果已經(jīng)更改成功。

我們再次查詢表數(shù)據(jù)

視圖02

發(fā)現(xiàn)表的數(shù)據(jù)也跟著更改了。由此我們得出結(jié)論:視圖其實是一個虛擬的表,它的數(shù)據(jù)其實來自于表。如果更改了視圖的數(shù)據(jù),表的數(shù)據(jù)也自然會變化,更改了表的數(shù)據(jù),視圖也自然會變化。一個視圖所存儲的并不是數(shù)據(jù),而是一條SQL語句。


4.2 帶檢查約束的視圖

需求:根據(jù)地址表(T_ADDRESS)創(chuàng)建視圖VIEW_ADDRESS2,內(nèi)容為區(qū)域ID為2的記錄。

語句:

create or replace view view_address2 as
select * from T_ADDRESS where areaid=2
with check option

執(zhí)行下列更新語句:

update view_address2 set areaid=1 where id=4

系統(tǒng)提示如下錯誤信息:

查詢視圖

4.3 只讀視圖的創(chuàng)建與使用

如果我們創(chuàng)建一個視圖,并不希望用戶能對視圖進行修改,那我們就需要創(chuàng)建視圖時指定 WITH READ ONLY 選項,這樣創(chuàng)建的視圖就是一個只讀視圖。

需求:將上邊的視圖修改為只讀視圖

create or replace view view_owners1 as
select * from T_OWNERS where ownertypeid=1
with read only

語句:

修改后,再次執(zhí)行 update 語句,會出現(xiàn)如下錯誤提示

視圖

4.4 創(chuàng)建帶錯誤的視圖

我們創(chuàng)建一個視圖,如果視圖的 SQL 語句所設(shè)計的表并不存在,如下

create or replace view view_TEMP as
select * from T_TEMP

T_TEMP 表并不存在,此時系統(tǒng)會給出錯誤提示

錯誤視圖

有的時候,我們創(chuàng)建視圖時的表可能并不存在,但是以后可能會存在,我們?nèi)绻藭r需要創(chuàng)建這樣的視圖,需要添加 FORCE 選項,SQL 語句如下:

create or replace FORCE view view_TEMP as
select * from T_TEMP

此時視圖創(chuàng)建成功。


4.5 復(fù)雜視圖的創(chuàng)建與使用

所謂復(fù)雜視圖,就是視圖的 SQL 語句中,有聚合函數(shù)或多表關(guān)聯(lián)查詢。

我們看下面的例子:

(1)多表關(guān)聯(lián)查詢的例子

需求:

創(chuàng)建視圖,查詢顯示業(yè)主編號,業(yè)主名稱,業(yè)主類型名稱

語句:

create or replace view view_owners as
select o.id 業(yè)主編號,o.name 業(yè)主名稱,ot.name 業(yè)主類型
from T_OWNERS o,T_OWNERTYPE ot 
where o.ownertypeid=ot.id

使用該視圖進行查詢

select * from view_owners

那這個視圖能不能去修改數(shù)據(jù)呢?

我們試一下下面的語句:

update view_owners set 業(yè)主名稱='范小冰' where 業(yè)主編號=1;

可以修改成功。

我們再試一下下面的語句:

update view_owners set 業(yè)主類型='普通居民' where 業(yè)主編號=1;

這次我們會發(fā)現(xiàn),系統(tǒng)彈出錯誤提示:

oracle視圖

這個是什么意思?是說我們所需改的列不屬于鍵保留表的列。


什么叫鍵保留表呢?

鍵保留表是理解連接視圖修改限制的一個基本概念。該表的主鍵列全部顯示在視圖中,并且它們的值在視圖中都是唯一且非空的。也就是說,表的鍵值在一個連接視圖中也是鍵值,那么就稱這個表為鍵保留表。

在我們這個例子中,視圖中存在兩個表,業(yè)主表(T_OWNERS)和業(yè)主類型表(T_OWNERTYPE), 其中 T_OWNERS 表就是鍵保留表,因為T_OWNERS的主鍵也是作為視圖的主鍵。鍵保留表的字段是可以更新的,而非鍵保留表是不能

更新的。

(2)分組聚合統(tǒng)計查詢的例子

需求:創(chuàng)建視圖,按年月統(tǒng)計水費金額,效果如下

視圖

語句:

create view view_accountsum as
select year,month,sum(money) moneysum 
from T_ACCOUNT 
group by year,month
order by year,month

此例用到聚合函數(shù),沒有鍵保留表,所以無法執(zhí)行 update 。

oracle視圖



猜你喜歡:

MySQL數(shù)據(jù)庫什么是外鍵?

Mysql安裝失敗后怎么卸載干凈?

Mysql索引如何使使用?怎么創(chuàng)建索引?

傳智教育java開發(fā)培訓(xùn)課程

0 分享到:
和我們在線交談!