视图是根据预定义的查询建立起来的一个表,它的定义以模式对象的方式存在。同基表一样,视图包含一系列带有名称的列和行数据,但是与持久基表不同的是,在视图中没有存储任何数据。行和列的数据来自由定义视图的查询所引用的基表,并且在应用视图时动态生成。而正是由于视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中,所以说视图是一个虚拟表。
对其中多引用的基表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。也就是说,视图是数据库中某些表或其他视图中数据的特定子集。一旦定义了一个视图,就可以像使用基本表一样使用它。
1.了解视图
视图结合了基表和查询两者的特性:用户可以从一个或者多个相关的基表中提取一个数据集(查询特性);用户能运用视图去更新视图中的信息,并且永久地存储结果到磁盘(表特性)。
视图也可用作安全机制,方法是允许用户通过视图访问数据,而不授予用户直接访问基表的权限。
视图的优点主要表现在一下几点:
数据集中显示:视图使用户着重于他们感兴趣的某些特定数据和他们所负责的特定任务,可以提高数据操作效率。
简化对数据的操作:视图可以大大简化用户对数据的操作。可以经常使用连接、投影、联合查询或选择查询定义视图,这样在每次执行相同的查询时,不必重新写这些复杂的查询语句,只要一条简单的查询视图语句即可。可见视图向用户隐藏了表与表之间的复杂的连接操作。
自定义数据:视图能够让不同的用户以不同的方式看待不同或相同的数据集。即是不同水平的用户共同用一数据库时也是如此。
导出和导入数据:可以使用视图将数据导出至其他应用程序。
合并分割数据:在某些情况下,由于表中数据量太大,在表的设计过程中可能需要经常将表进行水平分割或垂直分割,然而这样表的结构的变化会对应用程序产生不良的影响。使用视图就可以重新保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。
安全机制:视图可以作为一种安全机制。通过视图用户只能查看和修改他们所能看到的数据。其他数据库或表既不可见也不可以访问。如果某一用户想要访问视图的结果集,必须授予其访问权限。视图所引用表的访问权限与视图权限的设置互不影响。
2.视图操作
?
2.1“增”操作
创建可更新视图的基本语句:
CREATE VIEW [()]
AS
[WITH CHECK OPTION]
其中,占位符表示所创建的视图的名称,占位符表示视图提供的列名,占位符表示通过视图修改行时,确认提交修改后,仍可通过视图看到修改的数据。
例如,在数据库“销售管理系统”中创建一个名为“客户_VIEW”的视图,该视图包含列“业务员编号”和“接待顾客人数”,其执行语句如下:
CREATE VIEW 客户_VIEW(业务员编号,接待顾客人数)
AS
SELECT 所属业务员编号,COUNT(客户姓名)
FROM 客户信息
GROUP BY 所属业务员编号
执行上述语句后,会在相应的数据库中创建一个名为“客户_VIEW”的视图,从该视图中可以查询每个业务员所接待的客户数。
如果创建一个视图该视图没有汇总或聚集数据,每一列都与一个基表中的一个源列相对应,并且每一行都与一个基表中的一个源行对应,则这个视图便是一个可更新的视图。例如,在数据库“销售管理系统”中,创建一个名为“业务员_VIEW”的视图,该视图中的列来自基表“业务员信息”中的列“业务员姓名”、“家庭住址”、“电话”。
CREATE VIEW 业务员_VIEW
AS
SELECT 业务员编号,业务员姓名,家庭住址,电话
FROM 业务员信息
在创建视图的语句中,WITH CHECK OPTION 子句使用与在SELECT语句中包含WHERE子句的可更新视图。例如,将上述视图“业务员_VIEW”改为姓王的业务员信息。
?
CREATE VIEW 业务员_VIEW
AS
SELECT 业务员编号,业务员姓名,家庭住址,电话
FROM 业务员信息
WHERE 业务员姓名 LIKE '王%'
这样如果在视图“业务员_VIEW”中只包含姓王的业务员信息。如果在视图中添加一个业务员信息,但是该业务员不姓王,那么更新这个视图将会不一样。由于这个视图是可更新的,所以允许上述设置。但是,如果紧接着再调用这个视图,那么用户将不能够看到刚被更新的行,也无法对其进一步地更新。
但是如果在创建视图定义的末尾添加 WITH CHECK OPTION 子句,如下语句:
CREATE VIEW 业务员_VIEW
AS
?
SELECT 业务员编号,业务员姓名,家庭住址,电话
FROM 业务员信息
WHERE 业务员姓名LIKE '王%' WITH CHECK OPTION
这时如果再次向视图中添加一个不姓王的业务员信息,系统将会弹出一个出错消息,告诉用户不能这样修改。所以,使用WITH CHECK OPTION 子句可以保证用户所执行的更新不会阻止他们有效地使用创建的更新。
实战演练:
1.使用CREATE VIEW 语句创建视图:
CREATE VIEW 入库单_VIEW(入库单编号,入库数量,入库金额)
AS
SELECT 入库单编号,入库数量,入库商品金额
FROM 入库单明细信息
WHERE 入库商品金额>10000
利用SELECT 语句对该视图进行查看:
SELECT *
FROM 入库单_VIEW
根据上述代码的解释,大家应该可以看懂,其所表述的意思,不再累述。
2.下面举一个基于计算的创建视图:
在数据库“销售管理系统”中,创建一个名为“商品信息_VIEW1”的视图,该视图的列基表“商品信息”,并且在视图中返回“单价”打八折后的商品信息。
CREATE VIEW 商品信息_VIEW1(商品名称,供应商编号,价格)
AS
SELECT 商品名称,供应商编号,单价*0.8
FROM 商品信息
2.2“删”操作
当不需要一个视图时可把他删除掉,用DROP VIEW从当前数据库中删除视图,删除视图的基本语法结构为:
DROP VIEW
执行DROP VIEW语句后,视图定义将被删除,但是它对存储在基表中的数据没有任何影响,这与删除表不一样。在删除视图后,既可以重建这个视图,也可以创建使用同一名称的不同视图。
例如,删除数据库“销售管理系统”中的视图“商品信息_VIEW”,用下述语句实现:
DROP VIEW 商品信息_VIEW
删除一个视图后,虽然对于它所基于的表和数据来说,不会受到任何影响,但是对于依赖于改视图的其他对象或查询来说,将会执行时出现错误。
2.3“改”操作
如果基表发生了变化,或者要通过视图查询更多的信息,都需要修改视图的定义。要改变一个已经创建的视图的定义,应该使用ALTER VIEW语句,其基本的语法格式:
ALTER VIEW [(view_column_name)]
AS
[WITH CHECK OPTION]
其中各参数与CREATE VIEW语句中相同。
例如,在数据库“珠宝营销系统”中,基于“珠宝信息”表创建了一个名为“珠宝信息_VIEW”的视图,该视图中包含列“珠宝商编号”、“珠宝名称”和“珠宝单价”,并且该视图只接受“珠宝售价”大于450的信息。通过下属CREATE VIEW语句创建视图:
CREATE VIEW 珠宝信息_VIEW
AS
SELECT 珠宝商编号,珠宝名称,珠宝售价
F