一 :創建 (只創建邏輯結構,沒有實際的數據)(視圖就是顯示物理數據,不額外創建其他數據) create view <視圖名> [(<列名1>[,<列名2>]…)] as <子查詢> [with check option] 作用:顯示符合子查詢條件的列1 列2……. [with check option]表示當用戶做更新操作時,是否進行約束條件的檢查(例2將詳細敘述)
下面結合幾個例子幫助各位看客來了解以上語句的用法:
前提條件: 數據庫中現存在3個關系表 Student (Sno ,Sname,Ssex,Sage,Sdept); 解釋:學生(學號,學生姓名,學生性別,學生年齡,學生專業); Course(Cno,Cname,Cpno); 解釋:課程(課程號,課程名,可能的先修課程); SC(Sno,Cno,Grade); 解釋:學生選課情況(學號,課程號,成績)
例1:顯示IS專業的學生的學號,姓名,年齡,并將視圖名改為IS_ Student—————— create view IS_Student as select Sno,Sname,Sage from Student where Sdept = ‘IS’
例2:顯示IS專業的學生的學號,姓名,年齡,并將視圖名改為IS_ Student—————— create view IS_Student as select Sno,Sname,Sage from Student where Sdept=’IS’ with check option
[with check option]的意思是,當用戶插入新的記錄時,視圖檢測是否滿足約束條件(Sdept=’IS’),不加[with check option]則數據庫不檢測專業是否為IS。
例3:顯示IS_ S1視圖,其中包換學號姓名和年級這三個屬性,這個視圖描述的是專業為IS且選修了1號課程的學生—————create view IS_S1(Sno,Sname,Grade) as select Student.Sno,Sname,Grade from Student,SC where Sdept = ‘IS’ and Student.Sno=SC.Sno and SC.cno=’1’ (此例中屬性列名稱必不可少,且Sno因為在Student和SC中都存在,所以必須顯性指出是Student下的)
例4: create view IS_S2 as select * from IS _S1 where Grade >=90 ——在例3的基礎上篩選出分數在90分以上的學生的信息(此例子只為表明select可以從視圖中選擇查詢)
例5: 顯示視圖,顯示每個學生的學號和選修的課程的平均分—————create view S_G(Sno,Gavg) as select Sno,avg(Grade) from SC group by Sno
二:刪除視圖 drop view <視圖名> 例: drop view IS_S1 ——–將這個視圖清除,并且使建立在此視圖基礎上的其他視圖都不再起作用
三:查詢視圖 例1:select * from IS_Student where Sage<20 (IS _Student詳細信息來自于一中的例2) 這個語句在數據庫內部被轉化為 select Sno,Sname,Sage from Student where Sdept=’IS’ and Sage <20
例2: 查詢IS專業且選修了1號課程的學生的學號和姓名————select Sno,Sname from IS_Student,SC where IS _Student.Sno=SC.Sno and SC,Cno=’1’ (from后可以跟視圖和關系表)
例3:查詢平均分>=90的學生的學號和平均分————–select * from S_G where Gavg>=90 (S _G詳細信息來自于一中的例5)
四:更新視圖 例1:update IS_Student set Sname=’劉晨’ where Sno=’95020’; 在數據庫內部等價于 update Student set Sname=’劉晨’ where Sno=’95020’ and Sdept=’IS’; (如create 視圖時沒有加 with check option ,則數據庫內部等價于update Student set Sname=’劉晨’ where Sno=’95020’)
例2: insert into IS_Studnet values(‘95020’,’趙新’,20); 如創建視圖時加with check option,則數據庫內部等價于 insert into Student(Sno,Sname,Sage,Sdept) values(‘95020’,’趙新’,20,’IS’),否則則等價于Student(Sno,Sname,Sage) values(‘95020’,’趙新’,20)專業為空
當然有些視圖不允許更新: 1)視圖由兩個以上的基本表導出 2)視圖的字段來自字段表達式(經過運算)或常數 3)視圖的字段來自集合函數 4)視圖定義含group by子句(存在group by語句 時查詢也會受到影響) 5)視圖定義中含distinct短語 6)視圖定義中有嵌套查詢,并且內層查詢中的from子句設計的表也是導出該視圖的基本表 7)一個不允許更新的視圖上定義的視圖也不允許更新
不允許更新視圖時就不要將數據的更新操作的權利下放給用戶
新聞熱點
疑難解答