视图的定义:
定义:
根据用户的各种需求重新构造表的数据结构,这种数据结构就是视图.
视图是从一张或多张表中导出来的表,它不是真实存在的基本表,而是一张虚表,并没有像基本表一样存储在数据库中,而是相当于一个查询结果集合保存一样.
基本概念:
视图同其它基本表一样,也包含了带有各种名称和列的数据行,对表能进行的查询,插入修改对视图同样可以,并且视图是动态生成的,对依赖的基本表中的数据修改,视图也会自动更新.
视图的优缺点:
优点:
1)安全性:
用户通过视图只能查看基本表中的部分数据,未符合要求的数据并没有被筛选出来,对于其它数据用户既看不到也操作不了.数据库授权命令可以限制用户对数据库检索到特定的数据库对象中上,但不能细致到限制为数据库中特定的行和列上.
例如:
基本表为:(1)班全体学生
视图为:年龄大于18的男学生
当我们设置号权限后,用户就只能查看符合要求的男学生信息,对于不符合条件的男学生和女学生的信息则既看不到,也操作不了.
2)简单性:
可以根据不同的需求创建不同的视图,简化用户的操作.
3)逻辑数据独立性:
视图可以在应用程序与数据表之间,起到让双方在一定程度上独立的作用.
即程序可以建立在视图上,当数据表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而使应用程序可以不改变.反之,当应用程序发生变化时,也可以在表上修改视图,屏蔽应用的变化.
缺点::
1)影响查询效率:
由于数据库,管理系统必须把对视图的查询转化为对基本表的查询,当一个视图是由复杂的多个表连接定义时,即使对视图进行一个简单的数据查询也需要转变为一个复杂的多表查询,耗费一定的时间.
2)修改受限制:
对于复杂的视图,视图中的部分来源表中有数据不能被修改将导致视图也不能被修改.
一、创建视图
范例中的数据库在前几篇文章有提到,想要获取数据库中的数据可以翻看前几篇复制获取数据.
student表
course表
sc表
创建视图的格式:
create view 视图名 as 查询语句
🌰栗子
(1)创建一个名为stuview2的水平视图,从数据库student info的Student表中查询出性别为“男”的所有学生的资料。
并在创建视图时使用with check option。(注:该子句用于强制视图上执行的所有修改语句必须符合由select语句where中的条件。)
解释:
WITH CHECK OPTION的作用?
1.对于update,有with check option,要保证update后,数据要被视图查询出来;
2.对于delete,有无with check option都一样;
4.对于insert,有with check option,要保证insert后,数据要被视图查询出来;
5.对于没有where 子句的视图,使用with check option是多余的。
语句:
create view stuview2--表示创建一个名为stuview2的视图 as select * from student where sex='男' with check option
查看视图:
语句:
select * from stuview2
执行结果:
(2)创建一个名为stuview3的投影视图,从数据库student_info的Course表中查询学分大于3的所有课程的课程号、课程名、总学时。并在创建时对该视图加密。(提示:用with ENCRYPTION关键子句)
语句:
create view stuview3 with ENCRYPTION--创建视图并加密 as select Cno , Cname , Total_perior from course where credit>3
(3)创建一个名为stuview4的视图,能检索出“051”班所有女生的学号、课程号及相应的成绩。
create view stuview4 as select * from sc where sno=( select sno from student where classno='051' and sex='女')
(4)创建一个名为stuview5的视图,能检索出每位选课学生的学号、姓名、总成绩。
create view stuview5 as select student.sno 学号,sname 姓名 ,Grade 成绩 from student,sc where student.Sno=sc.sno
二、查询视图的创建信息及视图中的数据
(1)查看视图stuview2的创建信息。
a.通过系统存储过程sp_help查看
sp_help stuview2
执行结果:
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
执行结果:
(2)通过查看视图的定义脚本。
a.通过系统存储过程sp_helptext
sp_helptext stuview2
执行结果:
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'
执行结果:
3)查看加密视图stuview3的定义脚本。
sp_helptext stuview3
执行结果:
三.修改视图的定义
(1)修改视图stuview3使其从数据库Student_info的student表中查询总学时大于60的所有课程的课程号、课程名、学分。(提示:若视图原具有加密保护,修改视图时若未加with encryption子句,则修改后的视图不再加密。)
alter view stuview3 with encryption as select Cno ,Cname , credit from course where Total_perior>60
查看视图:
select * from stuview3
四.视图的更名与删除
1)用系统存储过程sp_rename将视图stuview4更名为stuv4。
sp_rename stuview4, stuv4
运行结果:
五.管理视图中的数据
1)从视图stuview2查询出班级为“051”、姓名为“张虹的资料。
select * from stuview2 where classno='051' and sname='张虹'
2)向视图stuview2中插入一行数据,内容为:
学号 | 姓名 | 学号 | 性别 | 家庭住址 | 入学时间 | 出生年月 |
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
可以观察到视图中已经有了赵小林的信息.
3)查询student,查看表中的内容有何变化。Student表中是否也已有“赵小林”的信息
语句:
select * from student--查询student表
4)向视图stuview2中插入一行数据,内容为:
学号 | 姓名 | 学号 | 性别 | 家庭住址 | 入学时间 | 出生年月 |
20110010 | 赵静 | 054 | 女 | 南京 | 2011/09/01 | 1993/11/09 |
问题:能成功插入吗?原因何在?
答案:
不能插入,原因是目标视图或者目标视图所跨越的某一视图指定了WITH CHECK OPTION,而该操作的一个或多个结果行又不符合CHECK OPTION 约束。
5)修改视图stuview2中的数据。
a.将stuview2中054班、姓名为“赵小林”同学的家庭地址改为“扬州市”。
update stuview2 set Home_addr='扬州市' where Home_addr='南京' and sname='赵小林' and classno='054'
b.查询student,查看表中的内容有何变化student表中的赵小林的家庭住址已发生了改变
select * from student
运行结果:
6)从视图stuview1中将班级为054、姓名为“赵小林”同学删除。
delete from stuview2 where sname=’赵小林’’