3.5.2 定义视图
1)创建视图
SQL Server提供了两种方式创建视图,一种方式是通过SQL Server Management Studio创建视图,另一种方式是使用CREATE VIEW创建视图。
(1)使用SQL Server Management Studio创建视图
启动SQL Server Management Studio。
在左边的“对象资源管理器”窗口中展开“数据库”→“视图”节点。
在“视图”节点上单击鼠标右键,在出现的快捷菜单中选择“新建视图”命令,如图3-22所示。
出现“添加表”对话框,如图3-23所示,在该对话框中可以按住Ctrl键,同时选择创建视图需要的表,单击“添加”按钮。
图3-22 新建视图
图3-23 “添加表”对话框
出现图3-24所示的视图设计器界面。在该界面中有4个窗格,即关系图窗格、条件窗格、SQL窗格和结果窗格。关系图窗格显示正在查询的基本表,每个矩形代表一个表,并显示可以用到的数据列,表与表之间的联系用连线表示;条件窗格显示表中的基本列,用户可以在其中设置要显示哪个表的哪些列;SQL窗格对应系统自动生成的创建视图的语句;结果窗格显示一个网格,用来显示视图中对应的数据。
图3-24 “视图设计器”界面
视图设计器设置完成后,单击工具栏上的
“验证SQL语句”按钮,此时系统会进行语法检查,语法检查无误后,再单击工具栏上的
“执行SQL语句“按钮,结果窗格中会显示该视图对应的数据。
单击工具栏上的
“保存”按钮,出现确定视图名称的对话框,输入视图名称,单击“确定”按钮,即可完成视图的创建。
在左边的“对象资源管理器”窗口中刷新,就可以看到新建的视图。
(2)使用CREATE VIEW语句创建视图
其基本格式如下:
说明:
schema_name:视图所属架构的名称;
view_name:视图名称,必须符合标识符的规则;
column:视图中的属性列使用的名称,如果未指定column,则视图属性列将获得与SELECT语句中的列相同的名称;
AS:指定视图要执行的操作;
select_statement:定义视图的SELECT语句,该语句可以使用多个表和其他视图;
WITH CHECK OPTION:可选项,强制针对视图执行的所有数据修改语句,都必须符合在select_statement中设置的条件。
【例3.64】 建立计算机学院学生的视图Jsj1_Student。
系统执行CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。只有对视图进行查询、插入、修改或删除操作时,才按视图的定义从基本表中将数据查出。
【例3.65】 建立计算机学院学生的视图Jsj_Student,并指定WITH CHECK OPTION选项。
WITH CHECK OPTION;
加上WITH CHECK OPTION选项以后,对该视图进行插入、删除、修改操作时,系统会自动加上视图定义中的条件:“Sdept=计算机”。
若一个视图是从单个基本表导出的,并且只是取去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图。例3.64和例3.65中创建的视图就是行列子集视图。
【例3.66】 基于例3.65中定义的视图Jsj_Student,建立计算机学院选修了课程“C001”的学生的视图:学号、姓名、成绩。
视图不仅可以建立在单个基本表上,也可以建立在多个基本表上,或者建立在一个或多个已定义好的视图上,或者建立在基本表与视图上。例3.66中的视图就是基于基本表和视图创建的。
【例3.67】 定义一个反映学生年龄的视图。
定义基本表时,为了减少数据库中的冗余数据,表中一般只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的。由于视图中的数据并不实际存储,所以定义视图时可以根据应用的需要设置一些派生属性列。带派生属性列的视图也称为带表达式的视图。例3.67中的视图就是一个带表达式的视图,视图中的年龄是通过计算得到的。
【例3.68】 将每门课程的不及格人数定义为一个视图。
可以用带有聚合函数和GROUP BY子句的查询来定义视图,这种视图称为分组视图。例3.68创建的Cno_NoPass就是一个分组视图。由于AS子句中SELECT语句的select_list中的人数是通过作用聚合函数得到的,所以CREATE VIEW中必须明确定义组成Cno_NoPass视图的各个属性列名。
2)修改视图
对于一个已经存在的视图,可以使用ALTER VIEW语句进行修改,其基本格式如下:
说明:各参数与CREATE VIEW语句中的参数含义相同。
3)删除视图
删除视图即删除视图的定义,可以使用DROP VIEW语句,其基本格式如下:
【例3.69】 删除例3.67和例3.68中创建的视图Age_Student和Cno_NoPass。
DROP VIEW Age_Student,Cno_NoPass;