视图的特点:
- 是从一个或几个基本表(或视图)导出的虚表。
- 只存放视图的定义,不存放视图对应的数据。
- 基表中的数据发生变化,从视图中查询出的数据也可能随之改变。
建立视图
语句格式
CREATE VIEW <视图名> [(<列名> …)]
AS <子查询>
[ WITH CHECK OPTION ];
组成视图的属性列名:全部省略或全部指定
With check option:要求对视图的更新操作必须满足子查询中的where条件。
基本视图
例:建立IS系学生的视图IS_Student1 。
CREATE VIEW IS_Student1
AS
SELECT Sno,Sname,Ssex,Sage
FROM Student
WHERE Sdept= 'IS';
建立IS系学生的视图IS_Student2 ,并要求对视图进行修改和插入操作时仍需保证该视图只有IS系的学生 。
CREATE VIEW IS_Student2
AS
SELECT Sno,Sname,Ssex,Sage
FROM Student
WHERE Sdept= 'IS'
WITH CHECK OPTION;
基于多个基表的视图
建立IS系选修了1号课程的学生视图IS_S1。
CREATE VIEW IS_S1(Sno,Sname,Grade)
AS
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno AND
Sdept= 'IS' AND SC.Cno= '1';
基于视图的视图
建立IS系选修了1号课程且成绩在90分以上的学生的视图IS_S2
CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade>=90;
带表达式的视图
定义一个反映学生出生年份的视图BirthYear_S。
CREATE VIEW BirthYear_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2021-Sage
FROM Student;
分组视图
将学生的学号及他的平均成绩定义为一个视图S_G
CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
注:
同一数据库中,所有对象的名字都不要相同(即:不要有重名)。
- 除了不可以有同名视图外(即:不可以与其他视图重名),也不能与表重名。
- 反过来,新建表时,除了不可以与其他表重名外,也不能与视图重名。
删除视图
语句的格式:
DROP VIEW <视图名列表>;
- 该语句从数据字典中删除指定的视图定义。
- 如果该视图上还导出了其他视图,则不能删除。
- 删除基本表时,由该基本表导出的所有视图定义都必须显式地使用DROP VIEW语句删除。 例: 删除视图BT_S:
DROP VIEW BT_S;
create view v1 as select * from s
create view v2 as select * from v1
drop view v1
之后
视图v2还在
但视图不能用了
CREATE VIEW q12 as select q1,q2 from t1
CREATE VIEW q123 as select q1 from q12
drop table t1
之后
删除表t1,没有报错
视图都还在,但视图不能用了
查询视图
用户角度:查询视图与查询基本表相同 例:在IS系学生的视图IS_Student中找出年龄小于20岁的学生。
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
查询选修了1号课程的IS系学生学号和姓名
SELECT IS_Student.Sno,Sname
FROM IS_Student,SC
WHERE IS_Student.Sno =SC.Sno
AND SC.Cno= '1';
更新视图
- 由于视图数据来自基本表,所以对视图的更新实际上是对基本表的更新。
- 一般不允许通过视图更新基本表。
alter view v_name
as
select ......
T-SQL语句创建男生视图V_Stu:学号、姓名、性别。
create view V_Stu as select 学号,姓名,性别 from student where 性别='男'
T-SQL修改以上视图为女生视图 。
alter view V_Stu as select 学号,姓名,性别 from student where 性别='女'
视图的作用
- 视图能够简化用户的操作。
- 视图使用户能以多种角度看待同一数据 。
- 视图能够对机密数据提供安全保护。
- 适当的利用视图可以更清晰的表达查询。