概念:
視圖:所謂視圖就是提取一張或者多張表的數據生成一個映射,管理視圖可以同樣達到操作原表的效果,方便數據的管理以及安全操作。
視圖其實就是一條查詢sql語句,用於顯示一個或多個表或其他視圖中的相關數據。視圖將一個查詢的結果作為一個表來使用,因此視圖可以被看作是存儲查詢結果的一個虛擬表。視圖來源於表,所有對視圖數據的修改最終都會被反映到視圖的基表中,這些修改必須服從基表的完整性約束。
視圖的存儲
與表不同,視圖不會要求分配存儲空間,視圖中也不會包含實際的數據。視圖只是定義了一個查詢,視圖中的數據是從基表中獲取,這些數據在視圖被引用時動態的生成。由於視圖基於數據庫中的其他對象,因此一個視圖只需要占用數據字典中保存其定義的空間,而無需額外的存儲空間。
視圖的優勢:
1.信息隱藏
比如s_emp表中有工資,可以創建視圖,隱藏工資信息。(可以配合權限,讓某個用戶只能查看視圖,不能查看表。)
2.使復雜查詢變得簡單。
3.數據獨立
4.相同數據的不同展示形式。
視圖的分類:
1.簡單視圖
2.復雜視圖
比較:
簡單視圖 復雜視圖
涉及到的表個數 1 1個或多個
包含函數 不包含 包含
包含組數據 不包含 包含
通過視圖使用DML 可以 不可以
視圖的創建:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name
[(alias[, alias]...)]
AS
select 。。。。
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
note:
1.or replace:代表修改view
2.force| noforce: 即使基表不存在也要建立該視圖 | 基表不存在就不建立此視圖,默認值。
3.alias: 視圖中的列的名字(相當於給子查詢的結果列起別名)
4.子查詢中可以包含復雜的查詢語法,這些細節都對用戶隱藏。
5.子查詢中不能包含order by子句。
6.WITH CHECK OPTION 插入或修改的數據行必須滿足視圖定義的約束;換句話說,加上該關鍵詞表示對view進行dml操作的時候,只能操作select語句中where條件限制的內容
7.WITH READ ONLY :該視圖只讀,不能在這個視圖上進行任何DML操作。
8.查看視圖結構: desc view_name;
例如:
create or replace view myView
as
select id,last_name,start_date
from s_emp
where id <= 4;
此時可以使用:
1.查看視圖中所有數據信息
select * from myView;
2.執行插入:
insert into myView values(111,'haha','03-5月-16'); 插入成功!
3.再次查看,找不到剛插入的數據,因為這條數據不滿足id<=4,但是查看原始表s_emp,有這條數據。
如果:
create or replace view myView
(id,name,s_date)
as
select id,last_name,start_date
from s_emp
where id <= 4
with check option;
此時可以使用:
1.查看視圖中所有數據信息
select * from myView;
2.執行插入:
insert into myView values(121,'haha','03-5月-16'); 插入失敗!,因為視圖的約束時id<=4,現在插入的id值為121,所以失敗!
create or replace view myView
(id,name,s_date)
as
select id,last_name,start_date
from s_emp;
or
create or replace view myView
as
select id,last_name,start_date s_date
from s_emp;
myView中列的名字都為id,name,s_Date.
創建復雜視圖:
復雜視圖可能包含分組,組函數,多表連接等。
例如:
CREATE or replace VIEW myView
(name, minsal, maxsal, avgsal)
AS SELECT d.name, MIN(e.salary),
MAX(e.salary), AVG(e.salary)
FROM s_emp e, s_dept d
WHERE e.dept_id = d.id
GROUP BY d.name;
查看視圖信息
可以使用數據字典user_views;
刪除視圖對象:
ROP VIEW view_name;