前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL Server使用常见问题

SQL Server使用常见问题

作者头像
编程随笔
发布2022-04-29 12:27:10
1.2K0
发布2022-04-29 12:27:10
举报
文章被收录于专栏:后端开发随笔

SQL Server使用常见问题

普通分页查询

三种方式:

  1. Top Not IN 方式:查询靠前的数据较快
  2. ROW_NUMBER() OVER()方式:查询靠后的数据速度比上一种较快,在老版本的SQL Server中最常使用
  3. offset fetch next方式:速度优于前两者,限制Sql2012以上可以使用

Top Not IN 方式

语法格式:

代码语言:javascript
复制
select top 条数 *  from tablename
where Id not in (select top pageSize*(pageIndex-1)  Id from tablename)

示例:

代码语言:javascript
复制
SELECT TOP 2  * FROM Users
WHERE Id NOT IN (SELECT TOP 2 Id FROM Users)

ROW_NUMBER() OVER()方式

语法格式:

代码语言:javascript
复制
SELECT * FROM (SELECT *,
ROW_NUMBER() OVER(Order by Id ) AS RowNumber from tablename ) as b
where RowNumber between pageIndex-1*pageSize and pageIndex*pageSize

示例:

代码语言:javascript
复制
SELECT * FROM (SELECT *,
ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber FROM Users ) as b
where RowNumber BETWEEN 0 and 3

offset fetch next方式

语法格式:

代码语言:javascript
复制
select * from tablename
order by Id offset pageIndex row fetch next pageSize row only

示例:

代码语言:javascript
复制
select * from Users order by Id offset 2 row fetch next 5 row only

带GROUP BY子句查询

1.当存在GROUP BY子句时,查询结果中的列和排序条件中的列必须使用聚合函数或者作为分组条件,否则将报错:

代码语言:javascript
复制
选择列表中的列 'xxxx' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

示例:

代码语言:javascript
复制
SELECT 
bizId, contentId, sum(click) as click
from pushhotres with(nolock) 
where is_del=0 
AND publishtime >= '2022-03-15' 
AND publishtime <= '2022-04-07'
GROUP BY bizId,contentId
ORDER BY click DESC

2.当存在GROUP BY子句时,如果此时需要进行分页处理,分页查询和总数查询都需要特别处理。

(1)带GROUP BY子句的分页查询

当查询语句中带GROUP BY子句时,分页查询需要借助于临时表进行处理,否则很容易报错。 存在GROUP BY子句时,分页查询的大致语法:

代码语言:javascript
复制
WITH query AS (
SELECT ROW_NUMBER() OVER (ORDER BY 排序列) as __row_number__, * FROM (
SELECT TOP 100 PERCENT 查询列
from 表名 with(nolock)
where 条件
GROUP BY 分组列
ORDER BY 排序列) as TT
) SELECT * FROM query WHERE __row_number__ BETWEEN 当前页起始索引 AND 当前页结束索引 ORDER BY __row_number__

示例:

代码语言:javascript
复制
WITH query AS (
SELECT ROW_NUMBER() OVER (ORDER BY click DESC) as __row_number__, * FROM (
SELECT TOP 100 PERCENT 
bizId, contentId, sum(click) as click
from res with(nolock)
where is_del=0
AND publishtime >= '2022-03-15'
AND publishtime <= '2022-04-07'
GROUP BY bizId,contentId
ORDER BY click DESC) as TT
) SELECT * FROM query WHERE __row_number__ BETWEEN 1 AND 30 ORDER BY __row_number__

(2)带GROUP BY子句的总数查询

当查询语句中带GROUP BY子句时,查询总数需要使用一点技巧,不能直接使用select count()。 存在GROUP BY子句时,查询记录总数大致语法:

代码语言:javascript
复制
SELECT count(1) from
(
SELECT 1 as C from 表名 with(nolock)
where 条件
GROUP BY 分组列
) as TT

示例:

代码语言:javascript
复制
SELECT count(1) from
(
SELECT 1 as C from res with(nolock)
where is_del=0
AND publishtime >= '2022-03-15'
AND publishtime <= '2022-04-07'
GROUP BY bizId,contentId
) as TT

除法计算结果为0的处理

现象:当除数小于被除数时,除法运算结果不保留小数位,直接取整为0。 原因:SQL Server会自动根据除数与被除数的最大精度去对运算结果取精度,如果除数和被除数都是整数,所以得到的结果也是整数。 解决:只要除数与被除数之中有一个是小数,得到的结果也会是小数。手动给被除数加上0.00,即:

代码语言:javascript
复制
select 3/4    -- 结果:0
select 3.0/4  -- 结果:0.750000

【参考】 https://www.jianshu.com/p/d1ae74bda1c5 三种SQLServer分页查询语句笔记 https://blog.csdn.net/wh445306/article/details/118567103 sql 除法计算一直 为0原因及解决方案 https://www.cnblogs.com/printn/p/6725026.html 选择列表中的列……无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SQL Server使用常见问题
    • 普通分页查询
      • Top Not IN 方式
      • ROW_NUMBER() OVER()方式
      • offset fetch next方式
    • 带GROUP BY子句查询
      • 除法计算结果为0的处理
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档