Chinaunix首页 | 论坛 | 博客
  • 博客访问: 356226
  • 博文数量: 102
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 1116
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-29 16:21
文章分类

全部博文(102)

文章存档

2014年(10)

2011年(1)

2008年(2)

2007年(89)

我的朋友

分类: SQLServer

2014-07-01 21:19:41

 

1、有关SQL查询中的连接问题

连接分为内联和外联。

内联又分为等值连接、不等值连接和自然连接,前面两种顾名思义,使用等号和不等号等逻辑来进行筛选,后一种和前面两种的区别就是,自然连接使用具体的列表名称来筛选列,前面两种使用*来筛选列,那么所有的列都会被选择出来,包括多个表中的重复列。语法:select * from a inner join b on ......

外联又分为左联、右联和全连接。

左联返回符合条件的记录并且包括一些行(由左表中的行组成,因为右表没有对应的记录,因此结果行中对应右表的部分都是Null);

右联则与左联相反;

全连接则包括符合记录的行以及左表和右表部分为Null的行。

语法格式:left joinright join full join

交叉连接

返回两个或多个表的笛卡儿积,记录数为两个或多个表的记录数的笛卡儿积 cross join

有关join后面On条件和Where条件的区别

两者在内联情况下是等同的。

2、删除一个表中重复行

一种方法使用临时表,创建一个临时表,create table #temp(identityint,1,1,ID int)

然后将表中的非重复行ID读入临时表,以临时表中的ID为条件删除表中的重复行,最后删除临时表;

另一种方法使用存储过程来实现。Object_id(数据库对象)

3、创建游标

       Create mycursor cursor for

         Select * from table where ......

   使用游标: open mycursor

   循环游标:where @@fetch_status=0

             Begin

 Fetch next from mycursor into @var

                      End

                     Close mycursor

            Deallocation mycursor

4、关于数据分页

      1)使用存储过程

      2)使用select top 10 id from table where id not in (select top n*10 id from table)

3)SQL 2005开始提供了RowNumber关键字,可以直接取值

       Select RowNumber Over (Order by 列名) as id ,...from table where RowNumber>10

                  And RowNumber<20

  Oracle中早就提供了rowidrownum来实现该功能

  Newid函数用来生成guid类型值

5、为表添加identity类型列,不使用存储过程

 Declare @i int;

 Set @i=0;

 Update table set 新增列=@i,@i=@i+1;

数据库中更新顺序,先变量后列,从左至右,列值保持不变;

查询时,为提升性能,将较小的基本表放到最右边,范围过滤的where条件放到最下边,遵循从右至左的顺序访问表,从下至上的顺序用where条件过滤记录

6SQL 2005开始提供自定义数据类型、函数、存储过程等功能

   利用.netCLR来生成程序集,部署到sql server中,

   Create assemly 程序集名 from 文件路径

   Create UDT extern name 程序集.[命名空间.类名]

  根据UDT中使用的数据类型决定实现的接口

  定长数据类型如intcharbigint等,需要实现Inullable接口;

  变长数据类型如string等,需要实现Inullable接口和IbinarySerialize接口,设置maxBytesize决定数据类型的长度;IsByteOrdered决定以二进制格式进行比较;

不管哪种类型,都需要用[Serializable]标记;同时实现4个方法,IsNullToStringParse和缺省构造函数;【非空、字符串、字符串解析和构造】

如果在程序集中使用的是类而不是结构,那么还需要为类添加属性[System.Runtime.InterOperservices.StructLayout],若该类是子类,其基类还需要添加属性[Microsoft.Sqlserver.Server.SqlUserDefindedType].

因为定长数据类型可以在SQL Server中序列化,变长类型需要手动处理序列化问题,这是实现IbinarySerialize接口的目的,ReadWrite方法;

还可以为类型添加验证方法,使用Validation MethodName属性进行设置;关于自定义类型的更多信息,可以查看MSDN帮助

如果更新了数据集,需要使用alter Assemly来重新注册,注册前需要先delete  其中数据类型,重新创建;

其它自定义函数,存储过程的生成和部署过程类似。

阅读(407) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~