[sqlserver]sql编程3-视图的使用和示例

需求说明

本篇文章的视图需求也是建立在 游标的使用和示例 那篇文章内提到的两张基础表之上的。

目标是得到如下图的结果集,这张图是结果集的右半部分,左半部分就是对应的主表数据。

sqlserver视图的使用

视图的使用

1、视图的理解

从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据 。从数据库系统内部来看,一个视图是由SELECT语句组成的查询定义的虚拟表 。从数据库系统内部来看,视图是由一张或多张表中的数据组成的,从数据库系统外部来看,视图就如同一张表 一样,对表能够进行的一般操作都可以应用于视图,例如查询,插入,修改,删除操作等。 

2、视图的用途 

–          筛选表中的行

–          防止未经许可的用户访问敏感数据

–          降低数据库的复杂程度

–          将多个物理数据库抽象为一个逻辑数据库

3、视图的优点 

使用视图可以给用户和开发人员带来很多好处。具体为:

A. 对最终用户的好处

( 1 )结果更容易理解

创建视图时,可以将列名改为有意义的名称,使用户更容易理解列所代表的内容。在视图中修改列名不会影响基表的列名。

( 2 )获得数据更容易

很多人对 SQL 不太了解,因此对他们来说创建对多个表的复杂查询很困难。可以通过创建视图来方便用户访问多个表中的数据。 

B. 对开发人员的好处

( 1 )限制数据检索更容易

开发人员有时需要隐藏某些行或列中的信息。通过使用视图,用户可以灵活地访问他们需要的数据,同时保证同一个表或其他表中的其他数据的安全性。要实现这一目标,可以在创建视图时将要对用户保密的列排除在外。

( 2 )维护应用程序更方便

调试视图比调试查询更容易。跟踪视图中过程的各个步骤中的错误更为容易,这是因为所有的步骤都是视图的组成部分

本例代码

CREATE VIEW view_name   
   AS 
SELECT     dbo.DayPlan_Fee.ID, dbo.DayPlan_Fee.PlanDate AS 日期, dbo.DayPlan_Fee.BelongType AS 归集对象, dbo.DayPlan_Fee.BelongNumber AS 对应编号, 
                      dbo.DayPlan_Fee.CusName AS 客户名称, dbo.DayPlan_Fee.ContentType AS 内容类别, dbo.DayPlan_Fee.Effect AS 工作效果, 
                      dbo.DayPlan_Fee.ContentDes AS 工作说明, dbo.DayPlan_Fee.Dept AS 部门, dbo.DayPlan_Fee.FeeAfford AS 费用承担人, dbo.DayPlan_Fee.NextUserID AS 领导ID, 
                      dbo.DayPlan_Fee.WFState AS 审核状态, dbo.DayPlan_Fee.BackReason AS 退回原因, dbo.DayPlan_Fee.UserID AS 填单人ID, 
                      dbo.DayPlan_Fee.InsertTime AS 填单时间, dbo.DayPlan_Fee.LastUpdateTime AS 最后更新时间, dbo.Users.UserName AS 填单人姓名, 
                      dbo.Fun_GetJiaoTongFeeByFeeID(dbo.DayPlan_Fee.ID) AS 交通, dbo.Fun_GetFeeCountByFeeID(dbo.DayPlan_Fee.ID, N'交通费') AS 交通费总和, 
                      dbo.Fun_GetFeeNumCountByFeeID(dbo.DayPlan_Fee.ID, N'交通费') AS 交通费发票张数总和, dbo.Fun_GetZhuZhaoFeeByFeeID(dbo.DayPlan_Fee.ID, N'住宿费') 
                      AS 住宿, dbo.Fun_GetFeeCountByFeeID(dbo.DayPlan_Fee.ID, N'住宿费') AS 住宿费总和, dbo.Fun_GetFeeNumCountByFeeID(dbo.DayPlan_Fee.ID, N'住宿费') 
                      AS 住宿费发票张数总和, dbo.Fun_GetZhuZhaoFeeByFeeID(dbo.DayPlan_Fee.ID, N'招待费') AS 招待, dbo.Fun_GetFeeCountByFeeID(dbo.DayPlan_Fee.ID, N'招待费') 
                      AS 招待费总和, dbo.Fun_GetFeeNumCountByFeeID(dbo.DayPlan_Fee.ID, N'招待费') AS 招待费发票张数总和, dbo.Fun_GetQiTaFeeByFeeID(dbo.DayPlan_Fee.ID, 
                      N'邮寄费') AS 邮寄, dbo.Fun_GetFeeCountByFeeID(dbo.DayPlan_Fee.ID, N'邮寄费') AS 邮寄费总和, dbo.Fun_GetFeeNumCountByFeeID(dbo.DayPlan_Fee.ID, 
                      N'邮寄费') AS 邮寄费发票张数, dbo.Fun_GetQiTaFeeByFeeID(dbo.DayPlan_Fee.ID, N'标书费') AS 标书, dbo.Fun_GetFeeCountByFeeID(dbo.DayPlan_Fee.ID, 
                      N'标书费') AS 标书费总和, dbo.Fun_GetFeeNumCountByFeeID(dbo.DayPlan_Fee.ID, N'标书费') AS 标书费发票张数总和, 
                      dbo.Fun_GetQiTaFeeByFeeID(dbo.DayPlan_Fee.ID, N'其他') AS 其他, dbo.Fun_GetFeeCountByFeeID(dbo.DayPlan_Fee.ID, N'其他') AS 其他费用总和, 
                      dbo.Fun_GetFeeNumCountByFeeID(dbo.DayPlan_Fee.ID, N'其他') AS 其他发票张数总和
FROM         dbo.DayPlan_Fee INNER JOIN
                      dbo.Users ON dbo.DayPlan_Fee.UserID = dbo.Users.UserID

总结

可以看到,视图中也穿插了很多标量值函数的调用,这样也有个好处,可以让功能相对分立,修改维护也比较方便。大家有什么问题可以联系我哦,在文章标题下方有我们的qq群哦,欢迎加入。

分享到:更多 ()

抢沙发

评论前必须登录!