视图是从一个或多个基本表(视图)中导出的表,是关系数据库系统为用户提供从不同角度观察和使用数据库中数据的一种机制。与基本表不同的是,视图是一个虚表,在数据库中只存放视图的定义,而不存放视图的数据,这些数据仍存放在原来的表中。基本表中的数据的变化可以通过试图反映出来。
视图一旦定义,就可以如同使用基本表一样使用视图,可以对视图进行查询操作,但对于图的更新操作(插入,删除,修改)则受到一定的限制。
视图的定义与删除
1.创建视图
create view <视图名> [ (<列名> [,<列名>]...) ]
as <select 子查询>
[with check option];
其中,<select 子查询>可以是任意复杂的select查询,但一般不允许含有order by子句和distinct关键字。
with check option用于强制所有通过视图更新的数据必须满足select子查询中指定的条件。
在定义视图时,默认状态下(不指定列名)视图的列名与基本表中的列名相同,但对以下几种情况必须指定列名。
(1)当目标列是聚集函数或列表达式时。
(2)多表连接时选出了几个同名列作为视图的字段
(3)需要在试图中为某列指定一个更合适的列名
eg:建立计算机系学生的视图,并要求进行修改和插入时需保证该视图只能对计算机系的学生进行操作。
create view c_student
as
select Sno,Sname,Ssex,Sage
from Student
where Sdept='CS'
with check option;
该视图中由于添加了with check option选项,所以当通过视图进行更新时,系统会自动检查或加上Sdept=’CS’的条件。
eg:建立选择了2号课程且成绩在80分以上的学生视图。
create view student_course_2(Sno,Sname,Ssex,Sage,Cno,Grade)
as
select student.Sno,Sname,Ssex,Sage,Cno,Grade
from Student,SC
where Student.Sno=SC.Sno and Grade>=80 and Cno='2';
eg:建立一个反映学生出生年份的视图
create view student_birth(Sno,Sname,Sbirth)
as
select Sno,Sname,2008-Sage
from Student;
2.删除视图
删除视图的语句格式为
DROP VIEW <视图名>
查询视图
eg:在计算机系的视图c_student上查询年龄在18-20岁之间的学生的学号和姓名。
select Sno,Sname
from c_student
where Sage between 18 and 20;
eg:上例进行转换后的查询语句为:
select Sno,Sname
from Student
where Sdept='CS' and Sage between 18 and 20;
eg:在student_course_2视图上查询成绩在90分以上的女同学的学号和姓名。
select Sno,Sname
from student_course_2
where Ssex='女' and Grade>=90;
更新视图
eg:在c_student的视图上进行如下操作,将学号为950002的学生的姓名改为”张良”.
update c_student
set Sname='张良'
where Sno='950002';
DBMS将上面的更新自动转换为
update student
set Sname='张良'
where Sno='950002' and Sdept='CS';
eg:在c_student的视图上进行如下操作,插入一个学生的信息。
insert into c_student
values('950013','李明','男',19);
eg:删除学号为980013的学生信息。
delete from c_student where Sno='980013';