1-7 视图
u      了解视图基本定义和特点
u      学习如何建立和删除视图的SQL语句,掌握参数WITH CHECK OPTION的使用特点
1-7-1 视图概述
视图从本质上是虚表,即在物理磁盘中并不存储,仅仅当用户查询需要时候在内存中临时生成,随着内存数据的清除而自动消亡,因此视图也被称为是用户临时表。视图使用的好处主要体现在以下几点:
1.   简化用户的操作
2.   使用户能以多种角度看待同一数据
3.   对重构数据库提供了一定程度的逻辑独立性
4.   能够对机密数据提供安全保护
1-7-2 建立视图
建立视图的一般格式如下:
CREATE VIEW <视图名>[(<列名>[,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION]
删除视图的一般格式为:
DROP VIEW <视图名>
有下列三种情况下必须明确指定视图的所有列名:
1.   某个目标列不是单纯的属性名,而是集函数或列表达式;
2.   多表连接时选出了几个同名列作为视图的字段;
3.   需要在视图中为某个列启用新的更合适的名字。
WITH CHECK OPTION指明当对视图进行数据修改时,要检查是否满足视图定义中的条件。是否带有WITH CHECK OPTION子句的视图最本质的区别是,在插入和更新视图的时候,也希望受到where语句的限制的时候,就必须带上WITH CHECK OPTION
同时我们需要注意的是,建立视图中的子查询语句可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT短语。
实验:建立视图实验
--1. 建立视图,查询同类商品的库存信息
Use cpxs --调用产品销售数据库
create view cpxi
as
(select 产品号,产品名称,sum(库存量) as 总库存量
from 产品入库表 group by 产品号,产品名称)
select * from cpxi   --查询刚刚建立的视图
--2. 查询2004-9-11日商场产品销售明细单
select 产品销售表.产品流水号,产品名称,数量 as 销售数量,客户名称
from 产品销售表,客户表,产品入库表
where 产品销售表.客户号=客户表.客户号 and 产品销售表.产品流水号=产品入库表.产品流水号
      and 产品销售表.销售日期=‘2004-9-11’
--3. 创建视图,课程及格的学生姓名,班级,课程名,成绩表
Use school --调用学校数据库
create view jg_stu2
as
select sname,class,cname,degree from sc,student,course
where sc.cno=course.cno and student.sno=sc.sno
group by sc.cno,sname,class,cname,degree having degree>60 with check option
--4. 建立成绩都及格的视图
create view jg_stu1
as
select * from score where degree>=60 with check option
--下面将一条不及格信息插入该视图里面
insert into jg_stu1 values('105','9-888',30)
--当添加了with check option参数后,由于将插入一条不及格信息,因此会出现错误。
消息550,级别16,状态1,第1
试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了WITH CHECK OPTION,而该操作的一个或多个结果行又不符合CHECK OPTION 约束。语句已终止。
请注意,当通过视图插入数据的时候,以下的几条是不允许插入数据的:
1.   select子句中不能使用uniquedistinct关键字
2.   不能包括group by子句
3.   不能包括经算术表达式计算出来的列
4.   对于行列子集视图可以更新(视图是从单个基本表使用选择、投影操作导出的,并且包含了基本表的主码)
5.   select子句中的目标列不能包含聚集函数