實驗八 視圖數據庫
1、實驗目的:安全
1.瞭解視圖的概念和與基本表的區別。函數
2.掌握SQL建立視圖的方法。測試
3.掌握視圖更新與基本表更新的相關性spa
4.3d
2、實驗內容blog
1.基本知識排序
建立視圖的命令it
1) create view <視圖名>io
2) as
3) select <目標列>
4) from <表名列表>
5) [where 查詢條件]
6) [group by 分組數據 having 分組篩選條件]
7) [with check option]
說明:
1) 視圖名的起名規則,遵循標識符的命名規則。
2) 子查詢的查詢結果爲視圖。視圖是查詢的定義,數據存儲在基本表,因此視圖是虛表。
3) 子查詢不能進行排序。因此沒有Order by子句。
4) 當使用with check option子句時,將會在更新視圖時,強制附加where條件的內容。
2.建立視圖
實驗1:建立CS系學生信息視圖CS_VIEW
命令:
create view CS_VIEW
as
select *
from student
where sdept = 'CS'
with check option;
完成實驗
:建立視圖後,更新基本表(更新200215121學生的年齡爲21歲),從新查看視圖內數據,有沒有更新?將用到的命令、測試過程和說明的問題記錄清楚。
會更新。說明視圖只是定義,不保存數據,數據來源於基本表,視圖的數據來源於基本表。視圖是個虛表,不佔用存儲空間。
實驗2:建立數據庫課程學生成績單。
DS_GRADE(學號,姓名,成績)
說明:視圖能夠來源於多個表。
注意:視圖也能夠在視圖的基礎上進行建立。
實驗3:建立一個各系學生人數統計視圖。SDEPT_VIEW(系名,人數)
Create view sdept_view
As
Select sdept 系名,count(*) 人數
From student
Group by sdept
視圖的建立可使用分組和彙集函數,使用戶只能看到統計結果,不能看到明細,體現了數據的安全性。
3.修改數據更新視圖
實驗4:經過CS_View更新CS系學生的年齡增長1歲。
命令:
update CS_VIEW
set sage = sage + 1;
命令可以執行,查看基本表和視圖數據是否已更新。基本表數據更新了嗎?視圖數據更新了嗎?
實驗5:更新DS_GRADE視圖內200215121學生的成績爲85.
命令:update DS_GRADE
set grade = 85
where sno = '200215121'
結果:命令成功?仍是不成功?爲何?
4.插入數據更新視圖
實驗6:插入一學生(200215126,張三,男,20)到CS_VIEW視圖。
命令:
insert into cs_view
values('200215126','張三','男',20)
查看基本表student和CS_VIEW視圖,有什麼狀況?
基本表內可以查詢到,而CS_View視圖內,沒有
說明:
1.在建立視圖CS_VIEW時,沒有加可選子句with check option,經過視圖插入的數據不通過視圖where子句檢驗,插入的數據不知足sdept爲CS也沒有問題,因此這個沒有sdept的值(爲NULL)數據可以插入(到基本表),而視圖內看不到不是CS系的學生數據。
2.若是在建立CS_VIEW時,使用了with check option子句,則經過視圖插入數據時,須要檢驗數據是否爲CS系的數據(知足提升安全性的要求),若是知足則可以插入,不然不容許插入。
注意:
在定義視圖時With check option的做用。
命令7:插入('200215127','李四',87)到視圖DS_GRADE。
命令?
執行狀況?
實驗8:插入(’ABC’,1)到SDEPT_VIEW視圖。
命令是?
可以插入嗎?
4、總結:
0.建立視圖的幾種形式。
1.視圖能夠從基本表導出,也能夠從視圖導出。
2.視圖不保存數據,數據保存在基本表中。
3.更新基本表,視圖數據會發生變化;成功更新視圖,
基本表也會發生變化。
4.更新視圖不成功的狀況很常見。不能知足建立視圖where條件的更新不可以更新;有多個表或視圖導出的視圖不可以更新;有group by或彙集函數的視圖不可以更新。