sql server 视图操作

视图的作用:

  1. 视图能够简化用户的操作
  2. 视图使用户能以多种角度看待同一数据
  3. 视图对重构数据库提供了一定程度的逻辑
  4. 视图能够对机密数据提供安全保护
  5. 适当的利用视图可以清新表达查询

**视图的特点:

  • 虚表,从一(多)表(或视图)导出
  • 只存放视图的定义,不存放视图对应的数据
  • 基表中的数据发生变化,从视图中查询出的数据随之改变

一、建立视图**

create view <视图名> [(<列名>,<列名>....)]
as <子查询>
[with check option]

with check option:

  • 对视图进行update,insert,delect操作时要满足视图定义中的谓词(即子查询中的条件表达式)
  • 子查询可以是任意的select语句,是否可以distinct和order by则决定具体系统的实现。

组成视图的属性列名:全部省略或全部指定

  1. 全部省略:
由子查询中select目标列中的诸字段组成
  1. 明确指定视图的所有列名
1、某个目标列是聚集函数或列表达式
2、多表连接时选出了几个同名列作为视图的字段
3、需要在视图中为某个列启用新的更合适的名字

涉及的表:

student(sno,sname,sage,ssex,sdept)primary key(sno)
sc(sno,cno,score)primary key(sno,cno)
course(cno,cname,cpno,ccredit)primary key(cno)

例1、建立软件工程系学生的视图

create view 软件工程_student
as
select sno,sname,sage from student where sdept = '软件工程';

例2、建立软件工程系学生的视图,并要求进行修改和更新操作时仍需保证该视图只有软件工程系的学生

create view 软件工程_student2
as
select sno,sname,sage from student where sdept = '软件工程'
with check option

with check option的作用:

  • 如果没有with check option约束,我可以通过视图’软件工程_student’向基本表student中插入和更新不是软件工程的学生记录
  • 加了with check option之后,视图 ‘软件工程_student2’ 只能向基本表student中插入和更新是软件工程的学生记录,插入的值中的系一定要指明是软件工程。

行列子集视图: 从一个基本表导出,并且只是去掉了基本表的某些行和某些列。,且保留了主码。

基于多个表的视图:
例3、建立软件工程选修了c1课程的学生视图(包括学号、姓名、成绩)

create view 软件工程_c1
as 
select student.sno,sname,score from student,sc
where student.sno = sc.sno and cno = 'c1';

例3、建立软件工程选修了c1课程的学生视图且成绩在90分以上的学生视图。

create view 软件工程_c1_plus
as 
select sno,sname,score from 软件工程_c1 where score > 90;

带表达式的视图:
例1、定义一个反映学生出生年份的视图

create view bt_s(sno,snme,sbirth)
as 
select sno,sname,2020-sage from student;

分组视图:
例1、将学生的学号及平均成绩定义为一个视图

create view s_g(sno,gavg)
as
select sno,avg(score) from sc group by sno;

建立视图的语句中子查询没有指定属性列的缺点: 修改基本表结构后,基本表和视图的映像关系会被破坏,导致该视图不能正确工作。

二、删除视图

drop view <视图名>[cascade];
  1. 该语句从数据字典中删除指定的视图定义
  2. 如果该视图上还导出了其他视图,使用cascade级联删除语句,把该视图和由它导出的所有视图一起删除
  3. 删除基表时,由该基表导出的所有视图定义都必须显式地使用drop view语句删除

cascade级联:

drop view 软件工程_c1 cascade;				/连软件工程_c1_plus一起删除了

三、查询视图

用户角度:查询视图与查询基本表相同
视图消解法:

  1. 进行有效性检查
  2. 转换成等价的对基本表的查询
  3. 执行修正后的查询

单表:
1、在软件工程系学生的视图中找出年龄小于20岁的学生

select * from 软件工程_student where sage < 20;
/转换后为
select * from student where sdept = '软件工程' and sage < 20;

多表:
2、查询选修了c1课程的软件工程系的学生

select * from 软件工程_student,sc wehre 软件工程_student.sno = sc.sno and cno = 'c1'

视图消解法的局限:不能对分组后聚集的视图生成正确的查询。

三、更新视图

例1、将软件工程系学生视图 软件工程_student中学号为 20200001的学生姓名改为 ‘’virus‘

update 软件工程_student set sname = 'virus' where sno = 20200001;

例2、向软件工程系学生视图 软件工程_student中插入一个新的学生记录,学号为 20200002,姓名为 “李四” ,年龄为 20

insert into 软件工程_student values (20200002,'李四',20);
转换为对基本表的更新:
insert into 软件工程_student(sno,sname,sage,sdept) values (20200002,'李四',20,'软件工程');

例3、删除软件工程系学生视图 软件工程_student中学号为 20200002 的学生记录

delete from 软件工程_student where sno = 20200002;

更新的限制:

  1. 允许对行列子集视图进行更新
  2. 对其他类型视图的更新不同系统有不同的限制
  3. 一个不允许更新的视图上定义的视图也不允许更新
  4. 若视图字段来自字段表达式或常数,则只允许对该视图进行delete操作
  5. 若视图定义中含有distinct短语,则此视图不允许更新
  6. 若视图定义中有嵌套查询,并且内层查询的from子句中涉及的表也是导出该视图的基本表,则此视图不允许更新

你可能感兴趣的:(sql,server)