分类: SQLServer
2014-07-01 21:19:41
1、有关SQL查询中的连接问题
连接分为内联和外联。
内联又分为等值连接、不等值连接和自然连接,前面两种顾名思义,使用等号和不等号等逻辑来进行筛选,后一种和前面两种的区别就是,自然连接使用具体的列表名称来筛选列,前面两种使用*来筛选列,那么所有的列都会被选择出来,包括多个表中的重复列。语法:select * from a inner join b on ......
外联又分为左联、右联和全连接。
左联返回符合条件的记录并且包括一些行(由左表中的行组成,因为右表没有对应的记录,因此结果行中对应右表的部分都是Null);
右联则与左联相反;
全连接则包括符合记录的行以及左表和右表部分为Null的行。
语法格式:left join、right join、 full join
交叉连接
返回两个或多个表的笛卡儿积,记录数为两个或多个表的记录数的笛卡儿积 cross join
有关join后面On条件和Where条件的区别
两者在内联情况下是等同的。
2、删除一个表中重复行
一种方法使用临时表,创建一个临时表,create table #temp(identity(int,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中早就提供了rowid和rownum来实现该功能
Newid函数用来生成guid类型值
5、为表添加identity类型列,不使用存储过程
Declare @i int;
Set @i=0;
Update table set 新增列=@i,@i=@i+1;
数据库中更新顺序,先变量后列,从左至右,列值保持不变;
查询时,为提升性能,将较小的基本表放到最右边,范围过滤的where条件放到最下边,遵循从右至左的顺序访问表,从下至上的顺序用where条件过滤记录
6、SQL 2005开始提供自定义数据类型、函数、存储过程等功能
利用.net的CLR来生成程序集,部署到sql server中,
Create assemly 程序集名 from 文件路径
Create UDT extern name 程序集.[命名空间.类名]
根据UDT中使用的数据类型决定实现的接口
定长数据类型如int、char、bigint等,需要实现Inullable接口;
变长数据类型如string等,需要实现Inullable接口和IbinarySerialize接口,设置maxBytesize决定数据类型的长度;IsByteOrdered决定以二进制格式进行比较;
不管哪种类型,都需要用[Serializable]标记;同时实现4个方法,IsNull、ToString、Parse和缺省构造函数;【非空、字符串、字符串解析和构造】
如果在程序集中使用的是类而不是结构,那么还需要为类添加属性[System.Runtime.InterOperservices.StructLayout],若该类是子类,其基类还需要添加属性[Microsoft.Sqlserver.Server.SqlUserDefindedType].
因为定长数据类型可以在SQL Server中序列化,变长类型需要手动处理序列化问题,这是实现IbinarySerialize接口的目的,Read和Write方法;
还可以为类型添加验证方法,使用Validation MethodName属性进行设置;关于自定义类型的更多信息,可以查看MSDN帮助
如果更新了数据集,需要使用alter Assemly来重新注册,注册前需要先delete 其中数据类型,重新创建;
其它自定义函数,存储过程的生成和部署过程类似。