`
suiliangxiang
  • 浏览: 69060 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL Server 视图创建点滴

阅读更多

 

 

视图在数据库开发过程中是非常重要的,对提高查询速度有很大的提高。因此我们的学会创建视图,并且有效的使用视图。
(1)表准的SQL视图
        标准视图比较简单,大家也都在使用,在此就不垒述了。
(2)使用动态视图
        标准视图有一个严重的局限性,那就是标准视图不支持参数。俗话说“法网恢恢,疏而不漏”,呵呵,我们也可以变通的使用带参数的视图。实现方法是我们把一个用户定义的表值函数当作支持参数的动态视图使用:
        CREATE FUNCTION fnTestView (@m_id int)
        RETURNS TABLE
        AS
        RETURN  (select * from 视图名称 where 条件=@m_id)
这样可以在Select语句的From子句中引用他们,用法:
        Select * from fnTestView(2)

(3)使用索引视图
        我们在使用视图的时候有时想怎么能给视图加索引呢,其实,视图和普通的表一样可以添加索引,当SQL Server必须联合很多表时,这项技术可以大大提高Select语句的性能。
        当在视图上创建一个唯一聚集索引(unique clusterd index)时,SQL Server将物化这个视图。看下面的例子:
        CREATE VIEW dbo.vtUsers
        WITH SCHEMABINDING 
        AS
        SELECT dbo.tUsers.userid, dbo.tUsers.username, dbo.tUsers.password, 
              dbo.tUsers.question, dbo.tUsers.answer, dbo.tUsers.email, dbo.tUsers.realname, 
              dbo.tUsers.sex, dbo.tUsers.birthday, dbo.tUsers.country, dbo.tUsers.city, 
              dbo.tUsers.address, dbo.tUsers.zip, dbo.tUsers.tele, dbo.tUsers.exdate, 
              dbo.tUsers.totalfund, dbo.tUsers.ordertotal, dbo.tUsers.jifen, dbo.tUsers.pid, 
              dbo.tUsers.agentid, dbo.tUsers.agentid2, dbo.tUsers.agentid3, dbo.tUsers.status, 
              dbo.tUsers.checkmod, dbo.tUsers.account, dbo.tUsers.bank, dbo.tUsers.logip, 
              dbo.tUsers.sitename, dbo.tUserInfo.siteurl
        FROM dbo.tUsers INNER JOIN
              dbo.tUserInfo ON dbo.tUsers.userid = dbo.tUserInfo.userid 
        WHERE dbo.tUserInfo.UserID >20

        CREATE UNIQUE CLUSTERED INDEX idxvtUser
        ON vtUsers(userid)

        尽管这个索引只引用了列的一个子集,但是这个索引包含叶级别节点中的所有列(每个聚集索引也都是这样)。
        和标准视图一样索引视图的创建和使用也都是有限制的。一个标准视图转换为一个索引视图必须遵守以下规则:
A.视图必须使用With Schemabinding选项来创建;
B.在这个视图中不能使用其他视图、导出表、行集函数或自查询,也就是说只能使用表;
C.视图所用到的基本表必须和视图属于同一个所有者;
D.视图只能链接同一个数据库中的表;
E.视图不能包含一个外部链接或自链接,也就是说在链接表时只能使用INNER JOIN并且INNER JOIN前后不能使同一个表,不能使用LEFT(RIGHT) JOIN 或者 LEFT (RIGHT) OUTER JOIN ;看下面的例子:
比如说创建了下面的视图(自链接):
        CREATE VIEW dbo.vtUsers
        WITH SCHEMABINDING 
        AS
        SELECT dbo.tUsers.userid, dbo.tUsers.username, dbo.tUsers.password, 
              dbo.tUsers.question, dbo.tUsers.answer, dbo.tUsers.email, dbo.tUsers.realname
        FROM dbo.tUsers Inner join
              dbo.tUsers as t ON dbo.tUsers.userid = t.userid
 这个视图是可以创建的,但是在创建索引时CREATE UNIQUE CLUSTERED INDEX idxvtUser  ON vtUsers(userid) 就会出错了;
再看下面的视图(外部连接):
        CREATE VIEW dbo.vtUsers
        WITH SCHEMABINDING 
        AS
        SELECT dbo.tUsers.userid, dbo.tUsers.username, dbo.tUsers.password, 
              dbo.tUsers.question, dbo.tUsers.answer, dbo.tUsers.email, dbo.tUsers.realname
        FROM dbo.tUsers LEFT OUTER JOIN
              dbo.tUserInfo ON dbo.tUsers.userid = dbo.tUserInfo.userid
        在创建索引时也会出错的。
F. 视图不能包含UNION子句、TOP子句、ORDER BY子句、Having子句、Rollup子句、Cube子句、compute子句、Compute By子句或Distinct关键字;
G. 视图不允许使用某些集合函数,如:Count(*)可以使用count_big(*)代替、avg()、max()、min()、stdev()、stdevp()、var()或varp()等;
H. 视图不能使用Select * 这样的语句,也就是说视图的所有字段都必须显示指定;
I. 视图不能包含Text、ntext、image类型的列;
J. 如果视图包含一个Group By子句,那么他必须在Select列中包含count_big(*);
K. 视图中的所有标和用户自定义的函数都必须使用两段式名来引用,即所有者.表或函数名称;
L. 所有的基本表和视图都必须使用 Set Ansi_Nulls On 创建;
M. 在创建索引时或创建索引后执行IUD时,必须显示或隐式地执行:
        Set ANSI_NULLS ON
        SET ANSI_PADDING ON
        SET ANSI_WARNINGS ON
        SET ARITHABORT ON
        SET CONCAT_NULL_YIELDS_NULL ON
        SET QUOTED_IDENTIFIER ON
        SET NUMERIC_ROUNDABORT OFF
       各个选项的有关信息或意义,可以查阅SQL Server的联机丛书,这里就不再介绍了;
N. 索引视图只有在SQL Server2000的企业版或开发版或者更高的版本中才能创建。
        如果一个视图可以添加唯一聚集索引,那么在添加了唯一聚集索引之后,该视图也可以像数据库表一样添加非聚集索引,CREATE INDEX  idxvtUsers ON  vtUsers(username,realname)。

文章出处:http://fineboy.cnblogs.com/archive/2005/09/14/236731.html 

分享到:
评论
2 楼 gray 2010-12-02  
刚才没有看完,不支持,3Q。
1 楼 gray 2010-12-02  
请问,使用外连接的查询创建的视图,能使用索引视图吗?

create view view1
as
select a.id from a left join b on a.id = b.id

先谢谢了

相关推荐

    C#实例之自动点滴管理系统

    在数据库方面,可能使用了关系型数据库管理系统,如SQL Server,来存储点滴记录、患者信息、药品库存等数据。C#提供了ADO.NET库,使得开发者可以方便地操作数据库,执行SQL语句,实现数据的CRUD(创建、读取、更新、...

    Oracle点滴积累

    expimp导出导入工具的使用.doc,Oracle 单记录函数.doc,...SQLServer和Oracle常用函数对比.doc,关系型数据库及其设计方法.doc,视图、同义词和序列.doc,索引与约束.doc,详细讲述Oracle中的to_date参数含义.doc

    程序员最好的SQL编辑助手

    此外,SqlEditPlus支持多数据库连接,包括但不限于MySQL、Oracle、SQL Server、PostgreSQL等主流数据库系统,这意味着无论你使用哪种数据库,都可以在统一的环境中进行操作。它还提供了数据库对象浏览功能,允许用户...

    BLOG.zip_博客

    《.NET + SQL Server 开发博客系统详解》 在当今互联网时代,个人和企业都倾向于拥有自己的博客平台,用于分享观点、技术知识或生活点滴。本文将深入探讨如何使用.NET框架与SQL Server数据库来构建一个功能完备的...

    个人信息管理数据库.doc

    数据库设计包括数据库、数据表、视图、索引和触发器的创建,确保了数据的完整性和一致性。在数据库实施阶段,完成了数据的入库和存储定义,使系统具备了实际运行的基础。 系统的功能模块设计中,通讯录模块可以记录...

    个人博客(ASP.NET)

    【个人博客(ASP.NET)】项目是基于ASP.NET 4.0技术和SQL Server 2005数据库构建的,主要用于展示个人作品、分享技术心得、记录生活点滴的在线平台。这个博客系统具备基本的博客发布、分类管理、评论互动、用户注册...

    asp维文 PJBlog 系统

    它基于经典的ASP(Active Server Pages)技术开发,为用户提供了一个可自定义、功能丰富的博客环境,让用户能够用母语维吾尔语发布文章、分享观点和生活点滴。 一、ASP技术基础 ASP,全称为Active Server Pages,...

    jsp 学生成绩系统

    通常会使用Java Database Connectivity (JDBC) API来连接到如MySQL、Oracle或SQL Server等关系型数据库管理系统。 3. JSP语法:系统中会包含JSP页面,这些页面通过使用指令、脚本元素和表达式语言来处理请求、响应...

    社交网站源代码

    此外,社交网络通常会涉及到数据库的设计,例如使用SQL Server或MySQL等关系型数据库来存储用户信息、好友关系、消息记录等数据。开发人员还需要关注数据安全,包括加密敏感信息、防止SQL注入等,以保护用户隐私和...

    个人网站系统

    ASP.NET与SQL Server或其他数据库系统结合,可以轻松实现数据的增删改查。例如,使用ADO.NET或者Entity Framework作为数据访问层,创建数据上下文,定义实体类,然后通过 LINQ 查询语言来操作数据库。 留言功能则...

    基于ASP的永丫个人博客系统 v1.3.zip

    这个系统可能包含了文章发布、分类管理、评论互动、用户登录注册等功能,帮助用户创建自己的网络日志空间,分享观点和生活点滴。版本号"v1.3"表明这是该系统的第三个迭代版本,通常意味着在前两个版本的基础上进行了...

    snowstop日记本

    数据库文件可能存储了用户的账户信息以及日记内容,通常会使用像Access或SQL Server这样的数据库管理系统。CSS文件则用来控制界面的布局和样式,使得界面美观且易于阅读。图片资源可能包括按钮、图标等界面元素,...

    个人博客管理系统

    在这个系统中,用户可以轻松地创建自己的在线空间,分享知识、观点和生活点滴。本文将深入探讨该系统的组成部分和技术实现,特别关注其核心——MySQL数据库、JSP(JavaServer Pages)和Servlet技术的应用。 首先,...

    .net c#校园微博系统

    在这个页面,用户可以看到关注的人发布的最新微博,系统可以利用ADO.NET或Entity Framework等ORM工具与SQL Server等数据库进行交互,实时获取更新的数据。同时,首页可能还会包含热门话题、推荐好友等个性化信息,这...

    基于ASP.NET的多功能博客blog系统的设计与实现

    这涉及到了数据库操作,使用ASP.NET的数据访问技术如Entity Framework,可以方便地与SQL Server或SQLite等数据库进行交互,存储和检索文章信息。 3. **文章展示**:博客首页通常会展示最新、最热的文章,以及分类和...

    c#日记管理程序

    C#支持多种数据库解决方案,如SQLite、SQL Server Compact Edition或者使用XML文件进行本地存储。考虑到隐私和便利性,本地存储可能是首选,其中XML因其结构化特性,便于程序读取和写入日记数据。 3. 业务逻辑:这...

    jsp设计的同学录

    1. **主题发布**:用户可以创建新的讨论话题,分享生活、工作中的点滴或提出问题寻求解答。 2. **帖子回复**:用户可以在已有的主题下发表回复,进行互动讨论。 3. **论坛分类**:论坛可能设置了不同的板块,如校园...

    .net个人空间网站源码

    通常会使用SQL Server、MySQL、SQLite或MongoDB等关系型或非关系型数据库,通过ADO.NET或其他ORM(对象关系映射)框架进行数据访问。 6. **权限管理**:源码中应包含用户权限管理机制,如角色授权、访问控制列表等...

    Java 日记本系统

    Java Web日记本系统是一个基于Java技术栈开发的在线应用程序,旨在提供一个方便、安全的平台,让用户可以记录、管理和分享他们的日常生活点滴。在这个系统中,用户可以创建、编辑、删除日记条目,并可能包含一些额外...

Global site tag (gtag.js) - Google Analytics