Sql Server 視圖數(shù)據(jù)的增刪改查教程
一、視圖的基本概念
視圖是用于查詢的另外一種方式。 與實際的表不同,它是一個虛表;因此數(shù)據(jù)庫中只存在視圖的定義,而不存在視圖中相對應(yīng)的數(shù)據(jù),數(shù)據(jù)仍然存放在原來的基本表中。視圖是一種邏輯對象。
二、 視圖能做什么
導(dǎo)出數(shù)據(jù); 在導(dǎo)出數(shù)據(jù)時,常常需要多個表聯(lián)合查詢,這個時候就可以使用視圖;轉(zhuǎn)換字段,如把status(0/1 Int類型)字段轉(zhuǎn)換成啟用/停用(文字) ,然后用視圖保存定義。
數(shù)據(jù)安全,可以給視圖加密。
三、視圖操作
3.1 查詢數(shù)據(jù)
(一)準(zhǔn)備素材:
使用兩張表,其中一張是家電表,另外一張字典表(只需要知道這兩張表有一個連接字段brandID-RowID:注意兩個表沒有強(qiáng)制使用外鍵約束),準(zhǔn)備好素材
SELECT TOP 1000 [appliancesName] ,[appliancesType] ,[code] ,[**brandId**] ,[standard] ,[appliancesStatus] ,[appliancesIsNew] ,[appliancesIsKey] ,[appliancesRemark] ,[appliancesId] FROM sfa_t_appliances
另外一張表字典表
SELECT TOP 1000 [**RowID**] ,[PRowID] ,[DicKey] ,[DicVal] ,[Status] FROM sfa_t_TSysDictionary
說明:sfa_t_appliances 表中的字段brandId 與 sfa_t_TSysDictionary表中的rowid做關(guān)聯(lián)。
(二)創(chuàng)建視圖:
create view appliances_view(id,name,brandName) as select s.appliancesId,s.appliancesName,d.DicVal from sfa_t_appliances s,sfa_t_TSysDictionary d where s.brandId = d.RowID
(三)查詢:
查詢數(shù)據(jù),可以將視圖看做一張實實在在的數(shù)據(jù)表,能夠執(zhí)行各種查詢操作。
如下圖所示,執(zhí)行一個查詢操作:
(四)備注
有些書上說:可以對任何查詢結(jié)果進(jìn)行排序,但是只有當(dāng)視圖包括Top子句時才能排序視圖。這樣看來書上確實是有問題的。動手實踐出真知
3.2 插入數(shù)據(jù)
實驗一
往視圖中插入一條數(shù)據(jù):
解釋:
往視圖中插入數(shù)據(jù)時,能夠往sfa_t_appliances 中插入數(shù)據(jù)。但是視圖為什么讀取不到呢?
create view appliances_view(id,name,brandName) as select s.appliancesId,s.appliancesName,d.DicVal from sfa_t_appliances s,sfa_t_TSysDictionary d where s.brandId = d.RowID
注意視圖的創(chuàng)建語法:是通過關(guān)聯(lián)關(guān)系獲取到的數(shù)據(jù)。注意觀看視圖的三個字段的來源。自然,在appliancesID為112233的記錄中沒有brandID,所以自然不能讀取到數(shù)據(jù)。
實驗二
說明: 往只含一個基本字段中插入數(shù)據(jù)是完全沒有問題的。上圖也插入成功了。
實驗三
將多個基表的字段都插入試試:
insert into appliances_view(id,name,brandName) values(112234,'視圖','冰箱')
小節(jié):
使用INSERT語句進(jìn)行插入操作的視圖必須能夠在基表(組成視圖查詢的表)中插入數(shù)據(jù),否則會操作失敗。
如果視圖上沒有包括基表中所有屬性為not null的行,那么插入操作會由于哪些列的NULL值而失敗。
補(bǔ)充
通過視圖可以向數(shù)據(jù)庫表中插入數(shù)據(jù),修改數(shù)據(jù)和刪除表中數(shù)據(jù)。如果視圖的SELECT語句中包含了DISTINCT、表達(dá)式(如計算列和函數(shù)),或FROM子句中引用多個表,或者引用不可更新的視圖,或有Group by 或者h(yuǎn)aving子句,那么都不能通過視圖操作數(shù)據(jù)。
3.3 修改數(shù)據(jù)
解釋
能夠?qū)?shù)據(jù)進(jìn)行修改,但是只能修改一張表中的數(shù)據(jù)。
查看下圖,修改基于兩個表的字段:
失敗了,說明只能修改一張表中的字段。
3.4 刪除數(shù)據(jù)
小結(jié):
如果一個視圖鏈接了兩個以上的基表,則不允許進(jìn)行數(shù)據(jù)刪除操作。如果視圖中的列是常數(shù)或者幾個字符串列值得和,那么盡管插入和更新操作時不允許的,但是卻可以進(jìn)行刪除操作。
實驗:
(一) 創(chuàng)建基于一個表的視圖:
(二)執(zhí)行刪除操作結(jié)果:
(三)結(jié)果說明:
基于一個表的視圖是能夠執(zhí)行刪除操作的。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持本站。如有錯誤或未考慮完全的地方,望不吝賜教。
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。