SqlServer 2005 T-SQL Query 学习笔记(3)

AD HOC PAGING

就是指用页面的序号和页面的大小请求一个单独的页面。下面是例子。

DECLARE @pagesize AS INT, @pagenum AS INT;
SET @pagesize = 5;
SET @pagenum = 2;

WITH SalesCTE AS
(
SELECT ROW_NUMBER() OVER(ORDER BY qty, empid) AS rownum,
empid, mgrid, qty
FROM dbo.Sales
)
SELECT rownum, empid, mgrid, qty
FROM SalesCTE
WHERE rownum > @pagesize * (@pagenum-1)
AND rownum <= @pagesize * @pagenum
ORDER BY rownum;


 
说明:在上个例子中,其实SQL只审视了10行(2*5),也就是说,查看N页的话,SQL只查到N的页的数据,N页后面的数据一概不查看。
 
另外,每当移动一页,都会把这页放进缓存里,因此每次查询,就是逻辑查询(缓存)+物理查询的过程。物理查询只需要查询新请求的页即可,其他全部在缓存里执行,这样大大加快了查询速度。
 
 

MULTIPAGE ACCESS:

如果结果集不是很大,而且分了多个请求页面,请求也不向前移动,那么这是一个好的方案:首先在一个表里使用ROW_NUMBER具体化所有的页,然后创建一个群集索引。下面是例子。

首先创建按ROW_NUMBER把列编好,

SELECT ROW_NUMBER() OVER(ORDER BY qty, empid) AS rownum, empid, mgrid, qty INTO #SalesRN FROM dbo.Sales;

CREATE UNIQUE CLUSTERED INDEX idx_rn ON #SalesRN(rownum);

然后直接按ROWNUM查询,

DECLARE @pagesize AS INT, @pagenum AS INT; SET @pagesize = 5; SET @pagenum = 2;
SELECT rownum, empid, mgrid, qty FROM #SalesRN WHERE rownum BETWEEN @pagesize *
(@pagenum-1) + 1 AND @pagesize * @pagenum ORDER BY rownum;

RANK & DENSE RANK

这2个函数和ROW_NUMBER的区别是:ROW_NUMBER在ORDER BY的条件里有重复行存在的话,是把这些重复行也按INDEX排列的,但是RANK和DENSE RANK总是确定的,即只要是ORDER BY重复的行,他们是统一INDEX的。

RANK和DENSE_RANK的区别是,RANK是如果上级的INDEX和下级的INDEX有可能不是+1关系,是按下级真正处于列里的位置进行INDEX,而DENSE_RANK是按照跟上级的INDEX+1的关系进行的编码。

比如:

SELECT empid, qty, RANK() OVER(ORDER BY qty) AS rnk, DENSE_RANK() OVER(ORDER BY qty) AS drnk FROM dbo.Sales ORDER BY qty;
 

NTILE

NTILE的用法和其他的RANK函数一样,只不过它可以传入一个参数,用来决定最大的INDEX是多少:它会按行数进行除法,然后平均分配行数进行INDEX的标示。

比如,如果有11列,那么首先11/3=3,3列一组作为一个INDEX,然后,11%3=2,这2列会分别加在前面的2组上。

比如,

SELECT empid, qty,
CASE NTILE(3) OVER(ORDER BY qty, empid)
WHEN 1 THEN 'low'
WHEN 2 THEN 'medium'
WHEN 3 THEN 'high'
END AS lvl
FROM dbo.Sales
ORDER BY qty, empid;

(0)

相关推荐

  • SqlServer 2005 T-SQL Query 学习笔记(4)

    比如,我要建立一个1,000,000行的数字表: CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY); DECLARE @max AS INT, @rc AS INT; SET @max = 1000000; SET @rc = 1; INSERT INTO Nums VALUES(1); WHILE @rc * 2 <= @max BEGIN INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums; S

  • SqlServer 2005 T-SQL Query 学习笔记(1)

    Select字句在逻辑上是SQL语句最后进行处理的最后一步,所以,以下查询会发生错误: SELECT YEAR(OrderDate) AS OrderYear, COUNT(DISTINCT CustomerID) AS NumCusts FROM dbo.Orders GROUP BY OrderYear; 因为group by是在Select之前进行的,那个时候orderYear这个列并没有形成. 如果要查询成功,可以像下面进行修改: SELECT OrderYear, COUNT(DIST

  • SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)

    当我们需要批量删除数据库中的表时,对于单个删除一些表是否感到烦躁,厌倦,干脆写个脚本用得了. 本脚本使用游标循环删除,对于数量比较小,用游标暂不会造成恶劣影响. 复制代码 代码如下: DECLARE @tablename VARCHAR(30),@sql VARCHAR(500)DECLARE cur_delete_table CURSOR READ_ONLY FORWARD_ONLY FORSELECT name FROM sysobjects WHERE name LIKE 'PUB%' A

  • 如何在SQL Server 2008下轻松调试T-SQL语句和存储过程

    今天突然有同事问起,如何在sqlserver中调试存储过程(我们公司使用的是sqlserver 2008 R2),猛地一看,和以前使用sqlserver 2000真的有很大的不同,我真晕了. 于是琢磨了一下.SQLSERVER 2005中不知因何去掉了很重要的DEBUGGER功能,要调试,必须要安装VS2005专业版或者更高版本.非常不方便. 还好,SQLSERVER 2008中这个很重要而且方便的功能又回来了. 不过,SQLSERVER 2008的调试功能和SQL2000的方法差别很大.SQL

  • SQL Server中的T-SQL的基本对象

    1.常量 常量是一个包含文字与数字,十六进制或数字常量.一个字符串常量包含单引号('')或双引号("")字符集中的一个或多个字符. 如果想在单引号分隔的字符串中用到单独的引号,可以在这个字符中用户连续的单引号(即用两个单引号表示单引号).十六进制的常量表示不可打印的字符或者是其他二进制数据.每个十六进制常量都以0x开头,后面附带有字符或者数字. 有效字符常量举例: "abc" "ab .c" "123" 'i don''t'

  • T-sql语句修改SQL Server数据库逻辑名、数据库名、物理名的方法

    本文实例讲述了T-sql语句修改SQL Server数据库逻辑名.数据库名.物理名的方法.分享给大家供大家参考,具体如下: 更改MSSQL数据库物理文件名Sql语句的写法 注意:要在活动监视器里面确保没有进程连接你要改名的数据库!!!!!!!!!!!!!!!!!!!! Sql语句如下 USE master --改逻辑名 ALTER DATABASE YQBlog MODIFY FILE(NAME='YQBlogAA',NEWNAME='YQBlog') -- GO ALTER DATABASE

  • SqlServer 2005 T-SQL Query 学习笔记(2)

    SQL2005增加了4个关于队计算的函数:分别是ROW_NUMBER,RANK,DENSE_RANK,NTILE. 注意:这些函数只能出现在SELECT和ORDER BY的查询中.语法如下: ranking_function over([partition by col_list] order by col_list) ROW_NUMBER:在排序的基础上对所有列进行连续的数字进行标识. 执行顺序:为了计算列值,优化器首先需要把数据在分区列上进行排序,然后在对这些列进行编码. SQL2005之前

  • SQL Server 数据库管理常用的SQL和T-SQL语句

    1. 查看数据库的版本 select @@version 2. 查看数据库所在机器操作系统参数 exec master..xp_msver 3. 查看数据库启动的参数 sp_configure 4. 查看数据库启动时间 select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1 查看数据库服务器名和实例名 print 'Server Name...............: ' + conve

  • SQLServer 2008 新增T-SQL 简写语法

    1.定义变量时可以直接赋值 DECLARE @Id int = 5 2.Insert 语句可以一次插入多行数据 INSERT INTO StateList VALUES(@Id, 'WA'), (@Id + 1, 'FL'), (@Id + 2, 'NY') 3.支持+=操作符 SET StateId += 1 完整示例如下: 复制代码 代码如下: CREATE TABLE StateList(StateId int, StateName char(2)) GO -- Declare varia

  • SQL Server学习笔记之事务、锁定、阻塞、死锁用法详解

    本文实例讲述了SQL Server学习笔记之事务.锁定.阻塞.死锁用法.分享给大家供大家参考,具体如下: 1.事务 隐式事务 /*================================================================== 当以create,drop, fetch,open, revoke,grand, alter table,select,insert,delete,update,truncate table 语句首先执行的时候,SQL Server会话

  • SqlServer 2005 T-SQL Query 学习笔记(3)

    AD HOC PAGING: 就是指用页面的序号和页面的大小请求一个单独的页面.下面是例子. DECLARE @pagesize AS INT, @pagenum AS INT; SET @pagesize = 5; SET @pagenum = 2; WITH SalesCTE AS ( SELECT ROW_NUMBER() OVER(ORDER BY qty, empid) AS rownum, empid, mgrid, qty FROM dbo.Sales ) SELECT rownu

  • JSP经典学习笔记(包含各种入门常用语法)

    本文介绍了JSP经典学习笔记.分享给大家供大家参考.具体如下: JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例--JSP页面有系统编译成Servlet,Servlet再负责响应用户请求. 1.JSP注释 <%--注释内容--%> ,与HTML注释<!--注释内容-->不同的是,编译后的HTML页面无法查看到JSP注释内容. 2.JSP声明 JSP声明用于声明变量和方法.JSP声明将会转换成Servlet中的成员变量或成员方法,因此,JSP声明依然符合

  • java学习笔记之DBUtils工具包详解

    DBUtils工具包 一.介绍 DBUtils是Apache组织开源的数据库工具类. 二.使用步骤 ①.创建QueryRunner对象 ②.调用update()方法或者query()方法执行sql语句 三.构造方法及静态方法 QueryRunner类 1.构造方法 ①.无参构造 QueryRunner qr =new QueryRunner(); 使用无参构造的时候,调用update方法和query方法时就需要使用带Connection 类型参数的重载形式 ②.有参构造 QueryRunner

  • 从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解

    本文实例讲述了从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记.分享给大家供大家参考,具体如下: 用tp3.2.3做了不少项目,但是毕竟要与时代接轨,学习一些新的框架,比如tp5 以下记录一些学习中遇到的问题及解决办法,还有tp3.2和tp5.0的一些区别,适合给用过tp3没用过tp5的童鞋做个参考. 随着学习不断更新...... +++++++++++++++++++++++分割线总是要有的+++++++++++++++++++++++ 首先到tp官网下载了一个最新的Think

  • MySQL处理重复数据的学习笔记

    MySQL 处理重复数据 有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据. 本章节我们将为大家介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据. 防止表中出现重复数据 你可以在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性. 让我们尝试一个实例:下表中无索引及主键,所以该表允许出现多条重复记录. CREATE TABLE person_tbl

  • DB2 UDB V8.1管理学习笔记(一)

    正在看的db2教程是:DB2 UDB V8.1管理学习笔记(一). DB2 基本概念 在DB2中由上至下的几个概念: 实例(Instance), 数据库(Database), 表空间(TableSpace), 容器(Container) 在一个操作系统中,DB2数据服务可以同时运行多个实例(有别于Oracle在一个系统内只能起一个实例). 数据库定义在实例中,一个实例可以包含多个数据库.在同一个实例中的不同数据库是完全独立的,分别拥有自己独立的系统编目表. 表空间有2种管理方式: DMS(Dat

随机推荐