1.定義一個新的試圖
create view v_test
as select *
form test
where id>=1001;
//如果需要對列重新命名,可以使用以下方式
create view v_test(dept_id,total_salary)
as select dept_id,sum(salary)
from test
group by dept_name;
//或者
create view v_test
as select dept_id,sum(salary) as total_salary
from test
group by dept_name;
當定義一個視圖時,數據庫系統存儲的是定義視圖所使用的查詢表達式本身,而不保存定義該視圖的查詢結果,用以保證無論我們何時執行這個查詢,視圖關係都被重新計算。
聚集結果(視圖)一般會比定義視圖的大關係要小得多,利用物化視圖來回答查詢會增加查詢速度,避免了讀取大的底層關係,不過,在定義物化視圖的時候,需要考慮到物化視圖查詢所帶來的好處還需要與存儲代價和增加的更新開銷相權衡。
一個視圖允許出現在任何關係名可以出現的地方,也就是說,可以使用在定義另一個視圖的表達式中,也可以用於insert語句中,在視圖中插入數據時,需要考慮到定義物化視圖的底層關係屬性的限制,一般會使用兩種解決方法來處理該插入:
1)拒絕該插入,並向用戶返回錯誤信息;
2)向關係中插入新的數據,並將視圖中不存在的屬性的值定義爲null。
一般來說,如果定義視圖的查詢對下列條件都能滿足,則該視圖稱爲可更新的(updatable):
1)from子句中只有一個數據庫關係;
2)select子句中只包含關係的屬性名,不包含任何的表達式、聚集或distinct聲明;
3)任何沒有出現在select語句中的屬性允許取空值;
4)查詢中不含有group by或having語句。
默認情況下,一個可更新的視圖允許插入 不滿足視圖所要求的選擇條件 的元組,可以使用with check option子句定義視圖,拒絕不滿足視圖要求的選擇條件的元組的插入或更新,定義方式如下
create view v_test
as select *
from test
where salary>10000
with check option;
當插入或更新一條紀錄時,salary小於10000時,數據庫會拒絕該元組的插入或更新。