SQLServer视图(一):视图简介

先举一个例子,在Northwind数据库中,如果要查看一个订单是由哪个雇员签订的,签订的时间是什么时候,买了什么产品,价格是多少,由谁来送货,送货的地址是什么等内容,那么就要从产品、订单、订单明细、雇员和运货商五个表中查询记录,其查询代码如下:

SELECT 订单.订单ID, 雇员.姓氏, 雇员.名字, 产品.产品名称,

         订单明细.单价, 订单明细.数量, 订单明细.折扣, 运货商.公司名称,

         订单.货主名称, 订单.货主地址, 订单.货主城市, 订单.订购日期,

         订单.发货日期

FROM 订单 INNER JOIN

           订单明细 ON 订单.订单ID = 订单明细.订单ID INNER JOIN

           雇员 ON 订单.雇员ID = 雇员.雇员ID INNER JOIN

           产品 ON 订单明细.产品ID = 产品.产品ID INNER JOIN

           运货商 ON 订单.运货商 = 运货商.运货商ID

查询结果如图9.1所示,如果要查询具体某一个订单的详细内容,还要在其后增加一个“WHERE 订单.订单ID =”的语句。

图9.1 执行查询语句后的结果

如果经常需要查询相同的字段内容(只是条件不同,如上例中可能只是订单的ID号不同而已),那么每次都重复地写这么一大串相同的代码,无疑会增加工作量和影响工作效率。

再看一下图9.1,其显示出来的界面与在SQL Server Management Studio中打开一个表的界面是否十分相似?如果将这个查询的结果集视为一个表,那么这个表就是一个视图,下面是将该查询结果创建成视图的代码:

CREATE VIEW 订单详细视图

AS

SELECT 订单.订单ID, 雇员.姓氏, 雇员.名字, 产品.产品名称,

         订单明细.单价, 订单明细.数量, 订单明细.折扣, 运货商.公司名称,

         订单.货主名称, 订单.货主地址, 订单.货主城市, 订单.订购日期,

         订单.发货日期

FROM 订单 INNER JOIN

           订单明细 ON 订单.订单ID = 订单明细.订单ID INNER JOIN

           雇员 ON 订单.雇员ID = 雇员.雇员ID INNER JOIN

           产品 ON 订单明细.产品ID = 产品.产品ID INNER JOIN

           运货商 ON 订单.运货商= 运货商.运货商ID

创建完视图之后,如果还要以同样的条件进行查询,只要输入以下一行代码就可以得到查询结果:

SELECT * FROM 订单详细视图

即使要查询某个订单的详细情况,也只要输入以下代码,而不用输入那么一长串代码了。

SELECT * FROM 订单详细视图

         WHERE 订单ID = 10248

视图具备了数据表的一些特性,数据表可以完成的功能,如查询、修改(虽然在修改记录时有些限制)、删除等操作,在视图中都可以完成。同时,视图也和数据表一样能成为另一个视图所引用的表。使用视图有以下几个优点:

l  简化查询语句:通过视图可以将复杂的查询语句变成很简单。

l  增加可读性:由于在视图中可以只显示有用的字段,并且可以使用字段别名,能方便用户浏览查询的结果。

l  方便程序的维护:如果用应用程序使用视图来存取数据,那么当数据表的结构发生改变时,只需要更设视图存储的查询语句即可,不需要更改程序。

l  增加数据的安全性和保密性:针对不同的用户,可以创建不同的视图,此时的用户只能查看和修改其所能看到的视图中的数据,而真正的数据表中的数据甚至连数据表都是不可见不可访问的,这样可以限制用户浏览和操作的数据内容。另外视图所引用的表的访问权限与视图的权限设置也是相互不影响的。

注意:视图是个虚拟的表,其存储的是查询语句而不是数据。视图中的数据都存储在其引用的数据表中,除非在视图中建立了索引。