视图的作用:
**视图的特点:
create view <视图名> [(<列名>,<列名>....)]
as <子查询>
[with check option]
with check option:
组成视图的属性列名:全部省略或全部指定
由子查询中select目标列中的诸字段组成
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的作用:
行列子集视图: 从一个基本表导出,并且只是去掉了基本表的某些行和某些列。,且保留了主码。
基于多个表的视图:
例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];
cascade级联:
drop view 软件工程_c1 cascade; /连软件工程_c1_plus一起删除了
用户角度:查询视图与查询基本表相同
视图消解法:
单表:
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;
更新的限制: