日度归档:2019年6月29日

mssql sqlserver 使用sql获取指定行数据及行总数的两种方法分享


摘要:
下文讲述不使用存储过程,只使用单一sql语句获取分页数据及复合条件的总行数的方法分享,如下所示:
实验环境:sql server 2008 R2


在平常的分页写法中,我们常常使用两条sql脚本,一条返回复合条件的数据,一条返回符合条件的总行数,
下文讲述使用单条sql语句实现以上需求的方法

返回符合条件的第60行到第70行的数据


方法1:使用开窗函数,返回分页数据和总条数

SELECT *,count(*) as [总行数]
FROM
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY [排序字段] ) AS [序号],
          info FROM [maomao365.com] 
          WHERE  ----查询条件
    )   as tmp 
WHERE [序号] between 60 and 70


方法2:使用子查询的方式,返回分页数据和总条数

SELECT *
FROM
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY [排序列]) AS [序号], info,
        (SELECT COUNT(*) FROM [maomao365.com] WHERE ---查询条件
         ) AS [总行数]
         FROM [maomao365.com] WHERE   ---查询条件
    )   as tmp 
WHERE [序号] between 60 and 70

mssql sqlserver null值带来的危害


摘要:
下文将讲述平时在数据库中遇见数据值为null的可能带来的陷阱分享给大家,如下所示:
实验环境:sql server 2008 R2



1.数值比对

当一个值为null时,我们进行if比对时,会出现unkown的返回值,稍不注意会出现null漏掉或比对错误的现象发生
例1:
select * from [maomao365.com]
where [列A] <> [列B]
—以上sql脚本不会显示出 [列A] 为null [列B]为其它任意值的数据
不会显示出 [列B] 为null [列A]为其它任意值的数据

例2:
SELECT * FROM [maomao365.com] where [列A] !=’测试信息’
—以上sql语句无法查询出 [列A] 为null的值


对null值的判断,必须使用 is null 作为判断
—错误写法
if @a =null
begin
—*
end
—正确写法:
if @a is null
begin
print ‘null正确判断方法’
end



2.数据统计

select count([列A]) from [maomao365.com]
—以上统计脚本会自动忽略掉[列A]所占用的行

mssql sqlserver 数据行中存在null值如何匹配呢?


摘要:
下文通过实例的方式讲述数据行中null值的匹配方法,如下所示:
实验环境:sql server 2008 R2


今天在编写左连接的时候,发现数据表中存在null值的无法匹配显示

   select * from [maomao365.comA] a 
    left join   [maomao365B] b on a.keyId = b.keyId 
    where 1=1 
    /*
    当a表和b表中的keyId都为null时的数据行,并不会匹配出来 
   下文通过改进相应的sql写法,即可实现数据行为null的匹配显示
   */
    
   select * from [maomao365.comA] a 
    left join   [maomao365B] b on isnull(a.keyId,0) = isnull(b.keyId,0) 
    where 1=1