当前课程知识点:数据库概论 > 第四章 数据库完整性、视图与安全性 > 4.5 视图 > 视图
同学们好
我是来自云南大学软件学院的包崇明
下面为大家介绍视图
在构造复杂查询的时候
我们经常用到子查询
查询语句冗长且复杂
难以理解
我们知道子查询得到的结果
也是以表的形式表示
如果能将子查询得到的结果命名为一张表
这张表可出现在select语句
的from子句后
那将为我们构造复杂查询带来很多方便
现在我们给出视图的定义
视图是一个由子查询产生的表
它可以有自己的名字和自己的字段名
对于用Create Table语句创建的表
我们称为基础表
在大多数情况下
视图可以象基础表一样使用
也就是说
基础表出现的地方
一般都可以使用视图
虽然使用方法基本一样
视图和基础表还是有区别
基础表中的数据存储在磁盘文件中
但是视图的数据依赖于基础表
并没有单独存放在磁盘中
需要执行查询才能获得视图数据
是一个由基础表中选择出来的
数据组成的逻辑窗口
所以视图又称为虚拟表
如果在视图上面执行更新操作
会出现什么情况
我们知道视图的数据
没有单独存放在磁盘文件当中
仅仅是一个查询结果
对查询结果进行更新
需要转换为对查询的基础表进行更新
如果我们能够确定转换为
对哪些基础表的哪些字段进行更新
这类视图就可以执行更新操作
称为可更新视图
多数情况下
由于我们不能确定对视图的更新
最终需要进行更新的基础表和字段
所以大多数视图是不可执行更新操作的
现在我们来看一下视图的定义语句
定义一个视图需要使用
CREATE VIEW语句
然后指定所创建的视图的名称
我们可以指定视图的列名列表
但这不是必须的
如果没有指定列名列表
创建的视图将使用子查询结果
中去除限定词后的列名作为字段名
如果这些列名中有相同的
则需要指定相应的视图字段名
以保证视图的字段名不重复
如果子查询结果中有表达式列
视图也需要指定表达式列的字段名
关键词as后面
是定义视图的子查询语句
也就是select语句
一般不允许在定义视图的
子查询中出现order by子句
最后是可选的
WITH CHECK OPTION子句
如果在视图定义中出现
WITH CHECK OPTION子句
首先要求创建的视图是可更新视图
其次如果在该视图上执行的
Insert或Update操作会
导致在基础表上更新了数据
但视图数据中找不到更新数据的情况
那么这些Insert和Update操作
将不允许执行
现在来看几个视图的例子
第一个例子是创建一个名为
cities的视图
列出customers表和
agents表中所有配对的城市
ccity和acity
要求居住在acity的代理商
为居住在ccity的顾客
至少下过一份订单
创建视图是语句是
CREATE VIEW cities ( ccity, acity )
AS SELECT c.city, a.city
FROM customers c, agents a, orders o
WHERE c.cid = o.cid and a.aid = o.aid;
注意在上述语句中我们给视图cities
指定了对应于子查询中的限定列名
c.city和 a.city的字段名
ccity和acity
如果我们在上述语句中删除指定的
视图列名表( ccity, acity )
则上述创建视图的语句将失败
因为去除子查询结果表的列名
c.city和 a.city的限定符
c和a后
列名都是city
意味着创建的视图具有两个同名字段
所以这是一个不合法的视图定义
下面再看一个视图的例子
CREATE VIEW custs
AS SELECT *
FROM customers
WHERE discnt <= 15.0
WITH CHECK OPTION
上述语句定义了一个从顾客信息表中
选择所有折扣小于等于15的顾客
组成的名为custs的视图
在custs视图定义语句中
我们没有指定custs的列名
意味着custs的列名
将继承子查询结果表的列名
在这个例子中也就是顾客信息表的列名
这是一个可更新视图
因为在这个视图上执行更新操作
能够确定转换为对顾客信息表的更新
语句中选项WITH CHECK OPTION
将让满足discnt >15.0 条件的
更新失败
因为更新的数据对视图是不可见的
我们在视图上插入一个CID为c009
折扣discnt为16的顾客
由于WITH CHECK OPTION选项的存在
这个insert操作将失败
因为插入的这个顾客的信息
对视图custs不可见
所以插入失败
总结一下
视图是一种重要的技术
具有下列作用
1. 视图提供了一种方法
使复杂的
经常用到的查询写起来更容易
2. 视图提供了一种数据组织方式
允许遗留程序能够继续执行
3. 视图提供了一种安全措施
使数据能够以不同的表示形式
提供给不同的用户
好了这节课的内容到这就结束了
我们下节课再见
-数据库概述
--Video
-导论--数据库概述
-1.1 数据库基础
--Video
-第一章 数据库基础--1.1 数据库基础
-2.1 CAP数据库
--CAP数据库
-第二章 关系运算--2.1 CAP数据库
-2.2 自然关系运算1
-- 自然关系运算1
-第二章 关系运算--2.2 自然关系运算1
-2.3 自然关系运算2
--自然关系运算2
-第二章 关系运算--2.3 自然关系运算2
-3.1 SQL概述
-- SQL概述
-3.1 SQL概述--作业
-3.2 数据定义DDL
--数据定义DDL
-3.2 数据定义DDL--作业
-3.3 SQL数据更新DML
-3.3 SQL数据更新DML--作业
-3.4 复杂SQL查询操作1
-第三章 结构化查询语言SQL--3.4 复杂SQL查询操作1
-3.5 复杂SQL查询操作2
-第三章 结构化查询语言SQL--3.5 复杂SQL查询操作2
-4.1 数据完整性
-4.1 数据完整性--作业
-4.2 完整性约束
--完整性约束
-4.2 完整性约束--作业
-4.3 外键约束
--外键约束
-4.3 外键约束--作业
-4.4 触发器
--触发器
-4.4 触发器--作业
-4.5 视图
--视图
-4.5 视图--作业
-4.6 安全性
--安全性
-4.6 安全性--作业
-5.1 索引
--Video
-5.2 B+树索引
--Video
-6.1 函数依赖
--Video
-6.2 Armstrong公理
--Video
-6.3 无损分解
--Video
-6.4 范式举例
--Video
-6.5 三种范式
--Video
-6.5 三种范式--作业
-7.1-E-R模型概述
--E-R模型概述
-7.2 E-R模型详解
--Video
-7.3 E-R模型的拓展
--Video
-7.4 E-R模型实例分析
--Video
-8.1 事务的ACID性质介绍
--ACID介绍
-8.1 事务的ACID性质介绍--作业
-8.2 事务经历
--事务经历
-8.2 事务经历--作业
-8.3 可串行化调度和前趋图
-8.3 可串行化调度和前趋图--作业
-8.4 两阶段封锁
--两段锁协议
-8.4 两阶段封锁--作业
-8.5 隔离级别
--隔离级别
-8.5 隔离级别--作业
-8.6 事务恢复
--事务恢复
-8.6 事务恢复--作业
-9.1 数据库使用介绍
--数据库使用介绍
-9.2 Java访问数据库
-9.2 Java访问数据库--作业
-10.1 数据库新技术概述
--Video