- 浏览: 97439 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (133)
- jQuery (11)
- XML (3)
- 组件 (1)
- JAVA (20)
- WEB (3)
- SPRING (6)
- HIBERNATE (5)
- AJAX (2)
- JS (1)
- JAVA webservice (1)
- Ditu (1)
- WEBSITE (1)
- HIBERNATE ANNOTATION (1)
- 排序 (1)
- TCP_NODELAY (1)
- ConvertUtils (1)
- Logistics (1)
- SQL SERVER 中identity (4)
- sql server (35)
- MYSQL (1)
- Eclipse (6)
- ORACLE (6)
- FLEX (4)
- notepad++ (0)
- UNION ALL (1)
- JUnit (3)
- SQL 异常处理 (1)
- @@trancount (1)
- IOS (1)
- ORA-02266 (1)
- REMOTE DESKTOP (0)
- HTML 优化 (1)
- CRLF (1)
- SQL Server Sequence (1)
最新评论
-
zjuttsw:
看的舒服
重要的hashcode equals转载
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,刷新视图,更新视图,索引视图
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,刷新视图,更新视图,索引视图
发表评论
-
WITH (NOLOCK)
2014-09-28 11:56 573http://www.cnblogs.com/henw/arc ... -
SQL Server Profiler使用方法
2014-05-21 16:55 605http://lyt7599.blog.163.com/blo ... -
SQL Server Error Message
2014-05-20 20:20 1290http://www.sql-server-helper.co ... -
SQL锁的概述
2014-05-16 14:39 401http://blog.csdn.net/htl258/art ... -
SET...
2013-12-31 11:16 314http://msdn.microsoft.com/en-us ... -
DATE
2013-12-30 15:23 441http://blog.csdn.net/dba_huangz ... -
DATE AND TIME
2013-12-30 14:22 545SELECT (CAST((SELECT SUBSTRING( ... -
Microsoft SQL Server, Error:9002
2013-09-25 17:48 1025一般在建立一个database之后,就应该手动设置其日志的增长 ... -
SQL 2005 with(nolock)详解
2013-08-26 15:46 576http://hi.baidu.com/gabriel/ite ... -
EXISTS AND NOT EXISTS
2013-07-16 14:51 455EXISTS或者NOT EXISTS是把主查询的字段传到后边的 ... -
is invalid in the select list because it is not contained in either an aggregate
2013-07-11 10:37 933当select 语句块中出现function与常列时,需要在w ... -
A interesting article for printing statement in sql
2013-07-09 11:57 420http://bytes.com/topic/sql-serv ... -
Good net website blog for Database
2013-07-09 11:53 765http://www.bluegecko.net/mysql/ ... -
how to search a function or sto in database
2013-07-08 14:02 674SELECT * FROM sysobjects WHERE ... -
SQLServer : EXEC和sp_executesql的区别
2013-07-08 11:36 537http://www.cnblogs.com/xbf321/a ... -
Search for a stored procedure
2013-07-08 11:27 623September 3, 2007 by Pinal Dave ... -
TRUNCATE TABLE
2013-06-27 10:43 466默认情况下,IDENTITY_INSER就是off 这种情况下 ... -
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
2013-06-18 14:08 542http://www.cnblogs.com/freshman ... -
安装了SQL以后,编写SQL语句没有提示
2013-06-18 09:55 550安装了SQL以后,编写SQL语句没有提示解决办法: 工具— ... -
局部临时表VS全局临时表
2013-06-13 14:37 3649http://blog.csdn.net/wu_qiongle ...
相关推荐
1,什么是视图? 2,为什么要用视图; 3,视图中的ORDER BY; 4,刷新视图; ...当你查询视图时,无论是获取数据还是更新数据,Sql server都用视图的定义来访问基础表; 视图在我们日常操作也扮演
综上所述,SQL Server中的触发器可以用来自动化复杂的业务逻辑,特别是当需要跨多个表进行数据更新时。在本例中,通过触发器可以实现在更新`XINXIN_TAB`或`FENSHU_TAB`时自动维护`ZHONGHE_TAB`的综合分数信息,从而...
在 SQL Server 2008 中,修改视图是通过使用 Alter View 语句来实现的。下面将详细介绍修改视图的语法、实例和注意事项。 修改视图语法 修改视图的基本语法格式为: Alter View <视图名> [<列名>[, …]] As 语句>...
1. **系统表和视图的变化**:随着版本的更新,SQL Server 2005引入了新的系统表和视图,以提供更强大的功能和支持更多的数据库对象。因此,在编写查询时需要考虑使用哪些最新的系统表和视图。 2. **语法兼容性**:...
在SQL Server 2000中,引入了索引视图的概念,使得视图不仅可以作为数据的安全访问机制和逻辑展示方式,还可以通过创建唯一群集索引和非群集索引来优化查询效率。 传统的视图在运行时会被临时实体化,即每次查询...
在SQL Server数据库管理中,有时由于项目的持续优化和升级,可能会遗留一些无效的视图或存储过程。这些对象可能由于代码改动、表结构调整或者不再被引用而变得无用,但它们依然存在于数据库中,占用资源并可能导致...
sqlsever 刷新(更新)数据库中的所有的视图,用于表添加字段,但是视图还是没有字段
sqlserver系统视图与存储过程应用说明,自己总结的,方便查看进程和表字段的注释
在SQL Server中,视图是一种虚拟表,它是由SQL SELECT语句创建的,可以用来封装复杂的查询逻辑,简化数据访问,并提供一定程度的数据安全性。视图并不实际存储数据,而是当查询视图时,根据其定义的SELECT语句动态...
视图 sql server
本资源主要介绍了在 SQL Server 2008 中使用 SQL 语句创建视图的方法和语法结构。视图是从一个或多个表中导出的虚拟表,通过视图可以简化复杂的查询操作,提高数据访问效率和安全性。 创建视图语法 ------------- ...
Sql Server 2005 打开 Sql Server 2008 mdf 文件数据库转换是指将 Sql Server 2008 中的数据库文件(mdf 文件)转换为 Sql Server 2005 可以识别的格式,以便在 Sql Server 2005 中使用。这种转换过程需要使用 Sql ...
解密SQL SERVER 2005加密存储过程,视图、函数.sql
Delphi创建SQLserver数据库视图的例子,使用create View语句来生成视图,当然本程序创建好视图后,也可删除视图,下面是详细的代码: //创建一个视图: procedure TForm1.Button1Click(Sender: TObject); ...
在SQL Server数据库管理系统中,存储过程、函数和视图是三个重要的数据库对象,它们在数据库设计和数据操作中起着核心作用。以下是对这些概念的详细说明: **存储过程(Stored Procedure)** 存储过程是一组预编译...
在SQL Server 2008中,视图是数据库对象的一种,它提供了对数据的另一种访问方式,可以将复杂的查询结果或者多个表的数据组合成一个简单的视图,方便用户使用。视图的删除是一个常见的数据库管理操作,尤其当视图...
Sql Server 2014 安装包 SQL Server 2014是微软推出的一款关系型数据库管理系统,它在企业级数据管理和分析领域扮演着重要的角色。此安装包包含两个主要组件:SQL Management Studio和SQL Server Express。 1. **...
SQL server2005 创建视图视频 SQL\创建视图(上).exe