绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
细说Sql Server中的视图(上)(更新)
2022-10-17 10:38:38

  1,什么是视图?

            2,为什么要用视图;

            3,视图中的ORDER BY;

            4,刷新视图;

            5,更新视图;

            6,视图选项;

            7,索引视图;


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

 

1.什么是视图

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

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

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

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

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

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

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

   1:  CREATE VIEW dbo.V1
   3:  SELECT CustomerID,CompanyName FROM Customers 


   1:  ALTER VIEW dbo.V1
   3:  SELECT CustomerID,CompanyName FROM Customers 
   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
   3:  SELECT TOP(10) CustomerID,CompanyName FROM Customers 
   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
   3:   
   5:  INSERT INTO T1(col1,col2) VALUES(1,2)

然后创建T1的视图V1:

   3:  CREATE VIEW V1
   5:  SELECT * FROM T1

 

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


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

   1:  ALTER TABLE T1 ADD col3 INT

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

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

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Microsoft SQL Server
创建时间:2022-03-30 11:29:11
Microsoft SQL Server
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • itt0918
    专家
戳我,来吐槽~