`

Good SQL WEBSITE 细说Sql Server中的视图(上)(更新)

阅读更多
http://www.cnblogs.com/xbf321/archive/2009/06/16/view_in_sqlserver.html



1,什么是视图?

            2,为什么要用视图;

            3,视图中的ORDER BY;

            4,刷新视图;

            5,更新视图;

            6,视图选项;

            7,索引视图;


        细说Sql Server中的视图(下)    应大家要求已在“细说Sql Server中的视图(上)”中添加“为什么要用视图”一小节。



1.什么是视图

   视图是由一个查询所定义的虚拟表,它与物理表不同的是,视图中的数据没有物理表现形式,除非你为其创建一个索引;如果查询一个没有索引的视图,Sql Server实际访问的是基础表。

   如果你要创建一个视图,为其指定一个名称和查询即可。Sql Server只保存视图的元数据,用户描述这个对象,以及它所包含的列,安全,依赖等。当你查询视图时,无论是获取数据还是更新数据,Sql server都用视图的定义来访问基础表;

   视图在我们日常操作也扮演着许多重要的角色,比如可以利用视图访问经过筛选和处理的数据,而不是直接访问基础表,以及在一定程度上也保护了基础表。

   我们在创建视图的时候,也要遵守三个规则:

        不能在视图定义中指定ORDER BY ,除非定义中包含Top或For Xml 说明;
        所有的列必须有列名;
        这些所有的列名必须唯一;

    对于视图表中在没有top或for xml说明的情况下,不能有Order by 语句,这是因为视图被认为是一个表,表是一个逻辑的实体,它的行是没有顺序的。视图中所有列必须有列名,且唯一的情况我想大家都理解;

    下面的sql语句表示创建一个简单的视图:

       1:  CREATE VIEW dbo.V1

       2:  AS

       3:  SELECT CustomerID,CompanyName FROM Customers

       4:  WHERE EXISTS(SELECT * FROM Orders WHERE Customers.CustomerID = Orders.CustomerID)

2.为什么要使用视图(更新)

      SqlServer既然给我们提供这样的对象,就一定有它的作用。而我们在使用视图上,要么用的过多,要么用的不够,所以一部分人建议不要用视图,而一部分人又建议少用。那我们听谁的呢?

      其实我们要是掌握了用视图的目的,就能在正确的地方,用正确的视图;那么视图能给我们解决什么问题呢?

            1,为最终用户减少数据库呈现的复杂性。客户端只要对视图写简单的代码,就能返回我所需要的数据,一些复杂的逻辑操作,放在了视图中来完成;

            2,防止敏感的列被选中,同时仍然提供对其他重要数据的访问;

            3,对视图添加一些额外的索引,来提高查询的效率;

      视图其实没有改变任何事情,只是对访问的数据进行了某种形式的筛选。考虑一下视图的作用,你应该能看到视图的概念如何为缺乏经验的用户简化数据(只显示他们关心的数据),或者不给予用户访问基础表的
  权利,但授予他们访问不包含敏感数据视图的权力,从而提前隐藏敏感数据。

      要知道,在默认的情况下,视图没有做什么特殊的事情。视图就好象一个查询那样从命令行运行(这里不存在任何形式的预先优化),这意味着在数据请求和将被交付的数据之间多加了一层开销。这表明视图绝不可能像
   只是直接运行底层SELECT语句那样快。不过,视图存在有一个原因--这就是它的安全性或为用户所做的简化,在你的需要和开销之间权衡,找到最适合特定情况的解决方案。

3.视图中的ORDER BY

    视图表示一个逻辑实体,它与表非常类似;

    如果我们在上面的创建的sql语句中加一个Order BY 语句,看看有什么效果:

   1:  ALTER VIEW dbo.V1

   2:  AS

   3:  SELECT CustomerID,CompanyName FROM Customers

   4:  WHERE EXISTS(SELECT * FROM Orders WHERE Customers.CustomerID = Orders.CustomerID) 

   5:  ORDER BY CompanyName



    运行该语句将会失败,回收到以下的提示:

    Msg 1033, Level 15, State 1, Procedure V1, Line 5
    除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。

    根据提示,ORDER By 也不是不能用,只有指定了Top或for xml语句后,ORDER BY 才能使用,如:
    

       1:  ALTER VIEW dbo.V1

       2:  AS

       3:  SELECT TOP(10) CustomerID,CompanyName FROM Customers

       4:  WHERE EXISTS(SELECT * FROM Orders WHERE Customers.CustomerID = Orders.CustomerID) 

       5:  ORDER BY CompanyName

      但是,并不建议在视图中使用ORDER BY ,这是因为视图表示一个表,而对于表来说,是不会有排序的;所以建议在查询视图的时候,用ORDER BY;

      SQL Server2005联机丛书有一段这样的描述:“在视图、内联函数、派生表或子查询的定义中使用ORDER BY 字句,子句只能用户确定TOP子句返回的行。ORDER BY 不保证在查询这些构造时得到有序结果,除非在查询本省也指定了ORDER BY.”

4.刷新视图

    我在上面说过,视图会保存元数据,列,安全,以及依赖等信息,如果我们把基础表的架构更改了,并不会直接反映到视图上来;更改架构后,使用sp_refreshview存储过程刷新视图的元数据是一个好习惯;

    比如我们创建了一个表T1和一个T1的视图V1,然后更改T1,再看V1的结果:

    首先创建表T1:

       1:  IF OBJECT_ID('T1') IS NOT NULL

       2:      DROP TABLE T1

       3:  

       4:  CREATE TABLE T1(col1 INT,col2 INT)

       5:  INSERT INTO T1(col1,col2) VALUES(1,2)

       6:  GO

    然后创建T1的视图V1:

       3:  CREATE VIEW V1

       4:  AS

       5:  SELECT * FROM T1



       在现实实践中,要避免在视图中的SELECT语句中使用*,在这只是演示。如果你查询视图V1就会出现以下结果:
        tmp16

       接下来,我们对表T1添加一列col3:
     

   1:  ALTER TABLE T1 ADD col3 INT

       然后再次查询视图V1,你想这时的结果是三列呢,还是而列呢?答案是二列。T1架构的改变,并没有影响到视图的元数据中,这时候,如果我们要刷新一下视图V1,我们就可以用:EXEC sp_refreshview V1 命令, 再次查询,V1的结果就是三列了。

     不写了,困了,明天再补全,就分上下二节吧

    兴百放

参考文献:《T-SQL程序设计》
Tag 标签: 视图,Sql Server,View,刷新视图,更新视图,索引视图
分享到:
评论

相关推荐

    细说SQL Server中的视图

    1,什么是视图? 2,为什么要用视图; 3,视图中的ORDER BY; 4,刷新视图; ...当你查询视图时,无论是获取数据还是更新数据,Sql server都用视图的定义来访问基础表;  视图在我们日常操作也扮演

    SQL Server 利用触发器对多表视图进行更新的实现方法

    综上所述,SQL Server中的触发器可以用来自动化复杂的业务逻辑,特别是当需要跨多个表进行数据更新时。在本例中,通过触发器可以实现在更新`XINXIN_TAB`或`FENSHU_TAB`时自动维护`ZHONGHE_TAB`的综合分数信息,从而...

    SQL Server2008修改视图-SQL语句方式.pptx

    在 SQL Server 2008 中,修改视图是通过使用 Alter View 语句来实现的。下面将详细介绍修改视图的语法、实例和注意事项。 修改视图语法 修改视图的基本语法格式为: Alter View <视图名> [<列名>[, …]] As 语句>...

    三个SQL视图查出所有SQL Server数据库字典

    1. **系统表和视图的变化**:随着版本的更新,SQL Server 2005引入了新的系统表和视图,以提供更强大的功能和支持更多的数据库对象。因此,在编写查询时需要考虑使用哪些最新的系统表和视图。 2. **语法兼容性**:...

    SQL Server索引视图及性能提高简介

    在SQL Server 2000中,引入了索引视图的概念,使得视图不仅可以作为数据的安全访问机制和逻辑展示方式,还可以通过创建唯一群集索引和非群集索引来优化查询效率。 传统的视图在运行时会被临时实体化,即每次查询...

    清除sqlserver无效的视图及存储过程

    在SQL Server数据库管理中,有时由于项目的持续优化和升级,可能会遗留一些无效的视图或存储过程。这些对象可能由于代码改动、表结构调整或者不再被引用而变得无用,但它们依然存在于数据库中,占用资源并可能导致...

    sqlsever 刷新(更新)数据库中的所有视图

    sqlsever 刷新(更新)数据库中的所有的视图,用于表添加字段,但是视图还是没有字段

    sqlserver系统视图与存储过程应用说明

    sqlserver系统视图与存储过程应用说明,自己总结的,方便查看进程和表字段的注释

    SQLserver 中使用SQL语句创建视图:

    在SQL Server中,视图是一种虚拟表,它是由SQL SELECT语句创建的,可以用来封装复杂的查询逻辑,简化数据访问,并提供一定程度的数据安全性。视图并不实际存储数据,而是当查询视图时,根据其定义的SELECT语句动态...

    视图 sql server

    视图 sql server

    SQL Server2008创建视图-SQL语句方式.pptx

    本资源主要介绍了在 SQL Server 2008 中使用 SQL 语句创建视图的方法和语法结构。视图是从一个或多个表中导出的虚拟表,通过视图可以简化复杂的查询操作,提高数据访问效率和安全性。 创建视图语法 ------------- ...

    SqlServer2005 打开 SqlServer2008 mdf文件

    Sql Server 2005 打开 Sql Server 2008 mdf 文件数据库转换是指将 Sql Server 2008 中的数据库文件(mdf 文件)转换为 Sql Server 2005 可以识别的格式,以便在 Sql Server 2005 中使用。这种转换过程需要使用 Sql ...

    解密SQL SERVER 2005加密存储过程,视图、函数.sql

    解密SQL SERVER 2005加密存储过程,视图、函数.sql

    Delphi创建SQLserver数据库视图的例子.rar

    Delphi创建SQLserver数据库视图的例子,使用create View语句来生成视图,当然本程序创建好视图后,也可删除视图,下面是详细的代码:  //创建一个视图:  procedure TForm1.Button1Click(Sender: TObject);  ...

    sqlserver 存储过程,函数,视图实例

    在SQL Server数据库管理系统中,存储过程、函数和视图是三个重要的数据库对象,它们在数据库设计和数据操作中起着核心作用。以下是对这些概念的详细说明: **存储过程(Stored Procedure)** 存储过程是一组预编译...

    SQL Server2008删除视图.pptx

    在SQL Server 2008中,视图是数据库对象的一种,它提供了对数据的另一种访问方式,可以将复杂的查询结果或者多个表的数据组合成一个简单的视图,方便用户使用。视图的删除是一个常见的数据库管理操作,尤其当视图...

    Sql Server 2014 安装包

    Sql Server 2014 安装包 SQL Server 2014是微软推出的一款关系型数据库管理系统,它在企业级数据管理和分析领域扮演着重要的角色。此安装包包含两个主要组件:SQL Management Studio和SQL Server Express。 1. **...

    SQLSERVER2005创建视图视频

    SQL server2005 创建视图视频 SQL\创建视图(上).exe

Global site tag (gtag.js) - Google Analytics