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

2016-02-19 10:19 0 1 收藏

今天图老师小编要向大家分享个SqlServer 2005 T-SQL Query 学习笔记(3)教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】

AD HOC PAGING

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)
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, qtyFROM SalesCTEWHERE rownum  @pagesize * (@pagenum-1) AND rownum = @pagesize * @pagenumORDER 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组上。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

比如,

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 lvlFROM dbo.SalesORDER BY qty, empid;

来源:https://www.tulaoshi.com/n/20160219/1594190.html

延伸阅读
一、 只复制一个表结构,不复制数据 select top 0 * into [t1] from [t2] 二、 获取数据库中某个对象的创建脚本 1、 先用下面的脚本创建一个函数 if exists(select 1 from sysobjects where id=object_id('fgetscript') and objectproperty(id,'IsInlineFunction')=0) drop function fgetscript...
CTE是Common Table Expression的简写,翻译成中文就是通用表表达式,它可以在select,insert或者update中使用。 为了说明问题,我们先随便建张表,插入几条数据: if object_id('t','U') is not null --用object_id函数判断表是否在数据库中存在很简洁 drop table t; GO create table t(c1 int,c2 decimal,c3 ...
标签: SQLServer
1. 查看数据库的版本        select @@version        常见的几种SQL SERVER打补丁后的版本号:         8.00.194   Microsoft SQL Server 2000      8.00.384&...
标签: SQLServer
1. 查看数据库的版本     select @@version     常见的几种SQL SERVER打补丁后的版本号:     8.00.194   Microsoft SQL Server 2000   8.00.384   Microsoft SQL Server 2000 SP1   8.00.532   Microsoft SQL Server 2000 SP2   8.00.760   Microsoft SQL Server 200...
首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET STATISTICS TIME这二条被经常忽略的Transact-SQL命令的。 从表面上看,查询性能的调节是一件十分简单的事。从本质上讲,我们希望查询的运行速度能够尽可能地快,...

经验教程

665

收藏

93
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部