SQL Server2017(七)视图

视图是从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个虚表。数据库值存放视图的定义,不存放视图对应的数据,这些数据仍然存放在原来的基本表中。
视图一经定义,就可以和基本表一样被查询,被删除,也可以在视图上再定义新的视图,但对视图的(增、删、改)操作有一定的限制。

定义视图

建立试图
其一般格式为

CREATE VIEW <视图名> [(<列名>)[,<列名>]……)]
AS <子查询>
[WITH CHECK OPTION];

组成视图的属性列名或者全部省略,或者全部指定,没有第三种选择,如果省略的视图的属性列名,则隐含该视图由子查询中SELECT 子句目标列中的诸字段组成。
下列三种情况,必须明确指定视图的属性列名:

  1. 某个目标列不是单纯的属性名,而是聚集函数或列表达式
  2. 多表连接时选出了几个同列名作为视图的字段
  3. 需要在视图中为某个列启用新的更合适的名字

例1

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';

建立信息系学生视图,要求进行修改和插入操作时仍需保证该视图只有信息系的学生

CREATE VIEW IS_Student 
AS 
SELECT Sno,Sname,Sage 
FROM Student 
WHERE Sdept='IS'
WITH CHECK OPTION;

若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图
例2

CREATE VIEW IS_S1(Sno,Sname,Grade)
AS
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Sdept='IS' AND
    Student.Sno=SC.Sno AND
    SC.Cno='1';

视图不仅可以建立在一个或多个基本表,也可以建立在一个或多个已经定义好的视图上,或建立在基本表与视图上

例3

CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade>=90;

定义视图时可以根据需要设置一些派生属性列,这些派生属性由于在基本表中并不实际存在,也称它们为虚拟列。带虚拟列的视图也称为带表达式的视图。
例4

CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2014-Sage
FROM Student;

用带有聚集函数和GROUP BY 子句的查询来定义视图,这种视图称为分组视图
例5

CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;

删除视图

DROP VIEW BT_S;

查询视图

可以像查询基本表一样查询

更新视图

由于视图不实际存储数据,因此对视图的更新最终转换为对基本表的更新
并不是所有视图都是可以更新的,一般地行列子集视图是可更新的

此博客中的热门博文

1.25USD,V2Ray搭建,让你奔向自由!

Rational Rose 2007破解版下载、安装教程

SQL Server2017(四)数据查询