
前言
??個(gè)人主頁:?? :???初階牛???
??推薦專欄: ?????? c語言初階
??個(gè)人信條: ??知行合一
??本篇簡(jiǎn)介:>:介紹數(shù)據(jù)庫中有關(guān)視圖的知識(shí),參考學(xué)校作業(yè).
金句分享:
?找不到答案的時(shí)候,就找自己。?
視圖的定義:
定義:
根據(jù)用戶的各種需求重新構(gòu)造表的數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)就是視圖.
視圖是從一張或多張表中導(dǎo)出來的表,它不是真實(shí)存在的基本表,而是一張虛表,并沒有像基本表一樣存儲(chǔ)在數(shù)據(jù)庫中,而是相當(dāng)于一個(gè)查詢結(jié)果集合保存一樣.
基本概念:
視圖同其它基本表一樣,也包含了帶有各種名稱和列的數(shù)據(jù)行,對(duì)表能進(jìn)行的查詢,插入修改對(duì)視圖同樣可以,并且視圖是動(dòng)態(tài)生成的,對(duì)依賴的基本表中的數(shù)據(jù)修改,視圖也會(huì)自動(dòng)更新.
視圖的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
1)安全性:
用戶通過視圖只能查看基本表中的部分?jǐn)?shù)據(jù),未符合要求的數(shù)據(jù)并沒有被篩選出來,對(duì)于其它數(shù)據(jù)用戶既看不到也操作不了.數(shù)據(jù)庫授權(quán)命令可以限制用戶對(duì)數(shù)據(jù)庫檢索到特定的數(shù)據(jù)庫對(duì)象中上,但不能細(xì)致到限制為數(shù)據(jù)庫中特定的行和列上.
例如:
基本表為:(1)班全體學(xué)生
視圖為:年齡大于18的男學(xué)生
當(dāng)我們?cè)O(shè)置號(hào)權(quán)限后,用戶就只能查看符合要求的男學(xué)生信息,對(duì)于不符合條件的男學(xué)生和女學(xué)生的信息則既看不到,也操作不了.
2)簡(jiǎn)單性:
可以根據(jù)不同的需求創(chuàng)建不同的視圖,簡(jiǎn)化用戶的操作.
3)邏輯數(shù)據(jù)獨(dú)立性:
視圖可以在應(yīng)用程序與數(shù)據(jù)表之間,起到讓雙方在一定程度上獨(dú)立的作用.
即程序可以建立在視圖上,當(dāng)數(shù)據(jù)表發(fā)生變化時(shí),可以在表上修改視圖,通過視圖屏蔽表的變化,從而使應(yīng)用程序可以不改變.反之,當(dāng)應(yīng)用程序發(fā)生變化時(shí),也可以在表上修改視圖,屏蔽應(yīng)用的變化.
缺點(diǎn)::
1)影響查詢效率:
由于數(shù)據(jù)庫,管理系統(tǒng)必須把對(duì)視圖的查詢轉(zhuǎn)化為對(duì)基本表的查詢,當(dāng)一個(gè)視圖是由復(fù)雜的多個(gè)表連接定義時(shí),即使對(duì)視圖進(jìn)行一個(gè)簡(jiǎn)單的數(shù)據(jù)查詢也需要轉(zhuǎn)變?yōu)橐粋€(gè)復(fù)雜的多表查詢,耗費(fèi)一定的時(shí)間.
2)修改受限制:
對(duì)于復(fù)雜的視圖,視圖中的部分來源表中有數(shù)據(jù)不能被修改將導(dǎo)致視圖也不能被修改.
一、創(chuàng)建視圖
范例中的數(shù)據(jù)庫在前幾篇文章有提到,想要獲取數(shù)據(jù)庫中的數(shù)據(jù)可以翻看前幾篇復(fù)制獲取數(shù)據(jù).
數(shù)據(jù)庫和數(shù)據(jù)表的創(chuàng)建
對(duì)表添加數(shù)據(jù)
student表

course表

sc表

創(chuàng)建視圖的格式:
create view 視圖名
as
查詢語句
??栗子
(1)創(chuàng)建一個(gè)名為stuview2的水平視圖,從數(shù)據(jù)庫student info的Student表中查詢出性別為“男”的所有學(xué)生的資料。
并在創(chuàng)建視圖時(shí)使用with check option。(注:該子句用于強(qiáng)制視圖上執(zhí)行的所有修改語句必須符合由select語句where中的條件。)
解釋:
WITH CHECK OPTION的作用?
1.對(duì)于update,有with check option,要保證update后,數(shù)據(jù)要被視圖查詢出來;
2.對(duì)于delete,有無with check option都一樣;
4.對(duì)于insert,有with check option,要保證insert后,數(shù)據(jù)要被視圖查詢出來;
5.對(duì)于沒有where 子句的視圖,使用with check option是多余的。
語句:
create view stuview2--表示創(chuàng)建一個(gè)名為stuview2的視圖
as
select * from student where sex='男'
with check option
查看視圖:
語句:
select * from stuview2
執(zhí)行結(jié)果:
(2)創(chuàng)建一個(gè)名為stuview3的投影視圖,從數(shù)據(jù)庫student_info的Course表中查詢學(xué)分大于3的所有課程的課程號(hào)、課程名、總學(xué)時(shí)。并在創(chuàng)建時(shí)對(duì)該視圖加密。(提示:用with ENCRYPTION關(guān)鍵子句)
語句:
create view stuview3 with ENCRYPTION--創(chuàng)建視圖并加密
as
select Cno , Cname , Total_perior from course where credit>3
(3)創(chuàng)建一個(gè)名為stuview4的視圖,能檢索出“051”班所有女生的學(xué)號(hào)、課程號(hào)及相應(yīng)的成績(jī)。
create view stuview4
as
select * from sc
where sno=(
select sno from student
where classno='051' and sex='女')
(4)創(chuàng)建一個(gè)名為stuview5的視圖,能檢索出每位選課學(xué)生的學(xué)號(hào)、姓名、總成績(jī)。
create view stuview5
as
select student.sno 學(xué)號(hào),sname 姓名 ,Grade 成績(jī) from student,sc
where student.Sno=sc.sno
二、查詢視圖的創(chuàng)建信息及視圖中的數(shù)據(jù)
(1)查看視圖stuview2的創(chuàng)建信息。
a.通過系統(tǒng)存儲(chǔ)過程sp_help查看
sp_help stuview2
執(zhí)行結(jié)果:

b.通過查詢表sysobjectsa、
–b
select so.name , sc.name , sc.colid, st.name
from sysobjects so , syscolumns sc, systypes st
where so.id = sc.id
and so.xtype = 'v'
and so.status >= 0
and sc.xtype = sT.xusertype
and so.name = 'stuview2'
order by so.name,sc.colorder
執(zhí)行結(jié)果:

(2)通過查看視圖的定義腳本。
a.通過系統(tǒng)存儲(chǔ)過程sp_helptext
sp_helptext stuview2
執(zhí)行結(jié)果:

b.通過查詢表sysobjects和表syscomments
(提示:視圖的名稱保存在表sysobjects的name列,定義腳本保存在表syscomments的text列)
select so.name , sc.text
from sysobjects so, syscomments sc where so.id = sc.id
and so.xtype = 'v'and so.status >= 0
and so.name = 'stuview2'
執(zhí)行結(jié)果:
3)查看加密視圖stuview3的定義腳本。
sp_helptext stuview3
執(zhí)行結(jié)果:
三.修改視圖的定義
(1)修改視圖stuview3使其從數(shù)據(jù)庫Student_info的student表中查詢總學(xué)時(shí)大于60的所有課程的課程號(hào)、課程名、學(xué)分。(提示:若視圖原具有加密保護(hù),修改視圖時(shí)若未加with encryption子句,則修改后的視圖不再加密。)
alter view stuview3
with encryption
as
select Cno ,Cname , credit from course
where Total_perior>60
查看視圖:
select * from stuview3
四.視圖的更名與刪除
1)用系統(tǒng)存儲(chǔ)過程sp_rename將視圖stuview4更名為stuv4。
sp_rename stuview4, stuv4
運(yùn)行結(jié)果:
五.管理視圖中的數(shù)據(jù)
1)從視圖stuview2查詢出班級(jí)為“051”、姓名為“張虹的資料。
select * from stuview2
where classno='051' and sname='張虹'
2)向視圖stuview2中插入一行數(shù)據(jù),內(nèi)容為:
學(xué)號(hào) | 姓名 | 學(xué)號(hào) | 性別 | 家庭住址 | 入學(xué)時(shí)間 | 出生年月 |
---|---|---|---|---|---|---|
20110009 | 趙小林 | 054 | 男 | 南京 | 2011/09/01 | 1993/01/09 |
語句:
insert into stuview2
values ( '20110009','趙小林','男','1993/01/09', '054','2011/09/01',
'南京','CH ','201111')
--查看視圖:
select * from stuview2
可以觀察到視圖中已經(jīng)有了趙小林的信息.
3)查詢student,查看表中的內(nèi)容有何變化。Student表中是否也已有“趙小林”的信息
語句:
select * from student--查詢student表
4)向視圖stuview2中插入一行數(shù)據(jù),內(nèi)容為:
學(xué)號(hào) | 姓名 | 學(xué)號(hào) | 性別 | 家庭住址 | 入學(xué)時(shí)間 | 出生年月 |
---|---|---|---|---|---|---|
20110010 | 趙靜 | 054 | 女 | 南京 | 2011/09/01 | 1993/11/09 |
問題:能成功插入嗎?原因何在?
答案:
不能插入,原因是目標(biāo)視圖或者目標(biāo)視圖所跨越的某一視圖指定了WITH CHECK OPTION,而該操作的一個(gè)或多個(gè)結(jié)果行又不符合CHECK OPTION 約束。
5)修改視圖stuview2中的數(shù)據(jù)。
a.將stuview2中054班、姓名為“趙小林”同學(xué)的家庭地址改為“揚(yáng)州市”。
update stuview2
set Home_addr='揚(yáng)州市'
where Home_addr='南京' and sname='趙小林' and classno='054'
b.查詢student,查看表中的內(nèi)容有何變化student表中的趙小林的家庭住址已發(fā)生了改變
select * from student
運(yùn)行結(jié)果:
6)從視圖stuview1中將班級(jí)為054、姓名為“趙小林”同學(xué)刪除。文章來源:http://www.zghlxwxcb.cn/news/detail-404087.html
delete from stuview2
where sname=’趙小林’’
好了,今天的SQL Server知識(shí)就分享到這里了.下一篇將會(huì)是SQL server中存儲(chǔ)過程的介紹,
希望這篇文章對(duì)大家有幫助。歡迎小伙伴們私信提意見和提問哦!
最后,小伙伴們的點(diǎn)贊就是給牛牛最大的支持,能不能給牛牛來一個(gè)一鍵三連呢?謝謝支持。文章來源地址http://www.zghlxwxcb.cn/news/detail-404087.html
到了這里,關(guān)于SQL語句創(chuàng)建視圖:的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!