视图是根据预定义的查询建立起来的一个表,它的定义以模式对象的方式存在。同基表一样,视图包含一系列带有名称的列和行数据,但是与持久基表不同的是,在视图中没有存储任何数据。行和列的数据来自由定义视图的查询所引用的基表,并且在应用视图时动态生成。而正是由于视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中,所以说视图是一个虚拟表。
对其中多引用的基表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。也就是说,视图是数据库中某些表或其他视图中数据的特定子集。一旦定义了一个视图,就可以像使用基本表一样使用它。
1.了解视图
视图结合了基表和查询两者的特性:用户可以从一个或者多个相关的基表中提取一个数据集(查询特性);用户能运用视图去更新视图中的信息,并且永久地存储结果到磁盘(表特性)。
视图也可用作安全机制,方法是允许用户通过视图访问数据,而不授予用户直接访问基表的权限。
视图的优点主要表现在一下几点:
数据集中显示:视图使用户着重于他们感兴趣的某些特定数据和他们所负责的特定任务,可以提高数据操作效率。
简化对数据的操作:视图可以大大简化用户对数据的操作。可以经常使用连接、投影、联合查询或选择查询定义视图,这样在每次执行相同的查询时,不必重新写这些复杂的查询语句,只要一条简单的查询视图语句即可。可见视图向用户隐藏了表与表之间的复杂的连接操作。
自定义数据:视图能够让不同的用户以不同的方式看待不同或相同的数据集。即是不同水平的用户共同用一数据库时也是如此。
导出和导入数据:可以使用视图将数据导出至其他应用程序。
合并分割数据:在某些情况下,由于表中数据量太大,在表的设计过程中可能需要经常将表进行水平分割或垂直分割,然而这样表的结构的变化会对应用程序产生不良的影响。使用视图就可以重新保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。
安全机制:视图可以作为一种安全机制。通过视图用户只能查看和修改他们所能看到的数据。其他数据库或表既不可见也不可以访问。如果某一用户想要访问视图的结果集,必须授予其访问权限。视图所引用表的访问权限与视图权限的设置互不影响。
2.视图操作
2.1“增”操作
创建可更新视图的基本语句:
CREATE VIEW <view_name> [(<view_column_name>)]
AS <query_expression>
[WITH CHECK OPTION]
其中,占位符<view_name>表示所创建的视图的名称,占位符<view_column_name>表示视图提供的列名,占位符<WITH CHECK OPYION >表示通过视图修改行时,确认提交修改后,仍可通过视图看到修改的数据。
例如,在数据库“销售管理系统”中创建一个名为“客户_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 <view_name>
执行DROP VIEW语句后,视图定义将被删除,但是它对存储在基表中的数据没有任何影响,这与删除表不一样。在删除视图后,既可以重建这个视图,也可以创建使用同一名称的不同视图。
例如,删除数据库“销售管理系统”中的视图“商品信息_VIEW”,用下述语句实现:
DROP VIEW 商品信息_VIEW
删除一个视图后,虽然对于它所基于的表和数据来说,不会受到任何影响,但是对于依赖于改视图的其他对象或查询来说,将会执行时出现错误。
2.3“改”操作
如果基表发生了变化,或者要通过视图查询更多的信息,都需要修改视图的定义。要改变一个已经创建的视图的定义,应该使用ALTER VIEW语句,其基本的语法格式:
ALTER VIEW <view_name>[(view_column_name)]
AS<query_expression>
[WITH CHECK OPTION]
其中各参数与CREATE VIEW语句中相同。
例如,在数据库“珠宝营销系统”中,基于“珠宝信息”表创建了一个名为“珠宝信息_VIEW”的视图,该视图中包含列“珠宝商编号”、“珠宝名称”和“珠宝单价”,并且该视图只接受“珠宝售价”大于450的信息。通过下属CREATE VIEW语句创建视图:
CREATE VIEW 珠宝信息_VIEW
AS
SELECT 珠宝商编号,珠宝名称,珠宝售价
FROM 珠宝信息
WHERE 珠宝售价>450
执行上述语句创建视图后,通过下属SELECT语句来查看视图中的信息:
SELECT *
FROM 珠宝信息_VIEW
执行后,便得到了我们珠宝售价大于450的珠宝相关信息。
然后对视图“珠宝信息_VIEW”的定义进行修改。将视图中返回的行限定为“珠宝售价”大于550的信息。则用下述的语句进行修改该视图的定义:
ALTER VIEW 珠宝信息_VIEW
AS
SELECT 珠宝商编号,珠宝商名称,珠宝售价
FROM 珠宝信息
WHERE 珠宝售价>550
成功执行上述语句后,使用SELECT语句查看修改后的视图中信息:
SELECT *
FROM 珠宝信息_VIEW
执行后,便得到了我们珠宝售价大于550的珠宝相关信息。
3.通过视图修改数据
在视图中对其中的数据进行修改,实际上就是对基表中的数据进行修改。这是由视图本身的性质决定的,因为视图是一个虚拟表, 它并不存在数据,数据只是存在于基表中。
如果创建视图时,在CREATE VIEW语句中,有下列内容,则该视图中的数据时不可修改的:
SELECT列表中含有DISTINCT;
SELECT列表中含有表达式,诸如计算列、函数等;
在FROM子句中引用多个表;
引用不可更新的视图;
GROUP BY或HAVING子句。
通过视图修改是通过INSERT、UPDATE和DELECT子句来完成的。
3.1 INSERT语句的使用
举例来说,在数据库”销售管理系统“中,基于”供应商信息“表创建一个名为”供应商_VIEW“的视图,该视图中包含列”供应商编号“、”供应商名称“、”联系人姓名“和”联系电话“。
CREATE VIEW 供应商信息-VIEW
AS
SELECT 供应商编号,供应商名称,联系人姓名,联系电话
FROM 供应商信息
成功运行上述语句后,打开视图”供应商_VIEW“,可以对其中的信息进行查看。如果要在视图中添加一行数据,则用INSERT 语句实现:
INSERT INTO 供应商信息_VIEW
VALUES(1010,'黄河科技','吴奎','13202204586')
然后利用下述SELECT语句对插入的数据行后的视图查询:
SELECT *
FROM 供应商信息_VIEW
查询结果,便是我们在视图的最后添加了一行数据,并且打开相应的基表,在基表的最后一行也添加了上述数据。
3.2 UPDATE语句的使用
更新视图中数据和更新基表中的数据的方式一样,但是当视图是基于多个基表的数据时,每次更新操作只能是更新来自一个基表中的数据列的值。
例如,将前面创建的视图”操作人员信息_VIEW“中,添加的姓名为”张蓉蓉“的操作人员的”联系电话“改为 13933456770:
UPDATE 操作人员信息_VIEW
SET 联系电话='13933456770'
WHERE 操作人员姓名='张蓉蓉'
打开视图”操作人员信息_VIEW“,对其中的数据进行查看,发现最后一行中的列”联系电话“中的数据变为13933456770。
3.3 DELETE语句的使用
通过视图删除数据的方法与通过基表删除数据的方法一样,最终还是体现为从基表中删除数据。当一个视图基于两个或者两个以上的基表时,不允许删除视图中的数据。
例如,删除上述”供应商信息_VIEW“视图中天剑的那一行数据。
DELETE FROM 供应商信息_VIEW
WHERE 供应商编号=1010
执行上述语句后,打开视图”供应商信息_VIEW“,则在最前面添加”供应商编号“为1010的一行数据被删除;同样,在基表中的着一行数据也被删除了。
4.学习小结
视图,无论是对于用户还是对于操作人员来说都是一个很重要的工具,简单来说,就是一个虚拟的表,而这个表是你想要的结果,从基表中查询出来的结果,就展现在这个虚拟表中,满足应用的情况下,随时更改你想要的结果,简单而实用。
通过本章节的学习,感觉数据库的知识,实用性很强,努力去实战一下,把知识融会一下。接下来的博客,依旧是关于数据库的相关知识的总结,期待吧!