对于数据库人员来说,在软件项目开发的过程中,或多或少的不可避免的就是经常遇到类似“UI查询结果设计”这样的说法,当听到UI设计的时候,多数人的第一反应是“靠!关我毛事!~这是其他人的问题!”。

然而,UI的设计确实存在一个难点,必须由数据库人员不得不去进行解决的难点:分页

无论最终的查询结果显示在何处,用户界面的可用空间对于显示在屏幕上的无线多的结果都显得过小(尤其是在基于WEB的应用程序中)。

UI设计师目前采用的是分页作为通用的解决方案。解决方案允许先显示排名靠前的10个结果,并允许用户点击按钮[MORE]来获取下一次显示的10个结果!~在多数的情况下,没有任何UI设计师希望能够缓存整个数据集(数据集中可能包含上百万条数据)。

自从在SQL2005种引入排名函数TOP后,人们经常使用这个函数来进行分页。但是实现这种解决方案所需要的SQL语句有一些复杂。在SQL2012中,专门设计了一种新的方法来解决这种复杂性:OFFSET...FETCH

OFFSET: 向SELECT查询表示跳过多少行!

FETCH:  表示从特定的位置开始检索检索多少行!不是截取   

以下代码为例,WEB设计人员请求你协助完成客户持有金钱排名。在其中简单的形式中,该界面只是每页显示10个人员。

基础数据准备

USE MyDB; --当前数据库
IF EXISTS (Select * From sys.objects Where name =N'Custommers' And Type In ('S','U')) --表存在即删除
DROP TABLE Custommers
ELSE
CREATE TABLE Custommers --买家
(
Id INT PRIMARY KEY IDENTITY,--主键ID
CustomName NVARCHAR(10), --买家名称
HadMoney MONEY --买家所持有的金钱
)
/*以上代码执行完成需要刷新下IntelliSence缓存,更新下当前智能提示
*键盘快捷键 Ctrl+Shift+R。
*定义变量i作为循环数据,并进行写入基础测试数据
*@author 系统管理员-咔咔
*@time 2013-11-22
*/
DECLARE @i INT;
SET @i=1;
WHILE(@i<100)
BEGIN
INSERT INTO dbo.Custommers
( CustomName, HadMoney )
VALUES ( N'张三'+CAST(@i AS VARCHAR(5)), -- CustomName - nvarchar(10)
@i -- HadMoney - money
);
SET @i=@i+1;
END

使用下列的SELECT TOP(10)查询可以很方便的检索出第一页的数据

SELECT TOP 10  CustomName,HadMoney
FROM dbo.Custommers
ORDER BY HadMoney

获得如下结果  

CustomName HadMoney
---------- ---------------------
张三1 1.00
张三2 2.00
张三3 3.00
张三4 4.00
张三5 5.00
张三6 6.00
张三7 7.00
张三8 8.00
张三9 9.00
张三10 10.00 (10 行受影响)

真正的难点在于如何获取接下来的第二页的10条数据、第三页、第四页.....可以使用OFFSET.....Fetch完成,以下是代码示例 

SELECT CustomName,HadMoney
FROM dbo.Custommers
ORDER BY HadMoney
offset 10 rows
fetch next 10 Rows Only

 结果如下

CustomName HadMoney   //注意这里的查询结果是进行检索
---------- ---------------------
张三11 11.00
张三12 12.00
张三13 13.00
张三14 14.00
张三15 15.00
张三16 16.00
张三17 17.00
张三18 18.00
张三19 19.00
张三20 20.00 (10 行受影响)
CustomName HadMoney   //注意这里的查询结果是进行检索
---------- ---------------------
张三11 11.00
张三12 12.00
张三13 13.00
张三14 14.00
张三15 15.00
张三16 16.00
张三17 17.00
张三18 18.00
张三19 19.00
张三20 20.00 ( 行受影响)

 关于这个用法的有些的限制需要注意: 

  • 使用OFFSET...FETCH必须进行ORDER BY
  • OFFSET可以单独进行使用,但不能单独使用FETCH
  • 与SELECT TOP 不能一起使用
  • 可以使用算数或变量来表示跳过多少行或获取多少,但是不可以使用标量子查询

 以上代码运行请在SQL2012的180天试用的非EXPRESS版本中运行!

SQL2012新特性一次一个数据块----特殊的查询分页的更多相关文章

  1. fread 不能读取最后一个数据块

    今天遇到一个问题,fread()竟然不能读取文件中的最后一个数据块. 我定义了一个结构体: Persong { char name[10]; char phone[15]; } 以及两个函数: int ...

  2. JAVA 7新特性——在单个catch代码块中捕获多个异常,以及用升级版的类型检查重新抛出异常

    在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常.如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度.下面用一个例子来理解. Java 7之前 ...

  3. 12.2Data Guard新特性--使用DBMS_DBCOMP.DBCOMP数据比较

          Oracle Data Guard会主动对Hot数据(数据正被读取或修改)执行验证, 无论是primary还是standby,但对于那些Cold数据不会做任何检查和校验.所以在12.2版本 ...

  4. Java12新特性 -- 只保留一个 AArch64 实现

    现状 当前 Java 11 及之前版本JDK中存在两个64位ARM端口.这些文件的主要来源位于src/hotspot/cpu/arm 和 open/src/hotspot/cpu/aarch64 目录 ...

  5. ABAP 7.50 新特性之另一个CORRESPONDING

    在ABAP中,存在着一条法则:同样的名称代表的不一定是同样的东西(具体可看最近的相关讨论). 但是如你们所知的,存在着一个很好的例外: 所有涉及到使用CORRESPONDING为结构赋值的关键字的语法 ...

  6. 向一个文件流写入一个数据块---fwrite

    函数原型:int fwrite(const void *buffer,size_t size,size_t count,FILE *stream); 参数说明:buffer:用于写入到文件的数据地址. ...

  7. 向文件写入一个数据块---write

    函数原型:ssize_t write(int fd,const void *buf,size_t count); 参数说明:fd:文件描述符,buf:写入数据的缓冲区,count:写入数据的最大长度. ...

  8. Atitit.数据库新特性战略规划 mssql sql server 2008 SQL2012 SQL2014

    Atitit.数据库新特性 mssql sql server 2008 SQL2012 SQL2014 1. Sql2012 新特性 1 1.1. 增加了Sequence对象. 1 1.2. 新的分页 ...

  9. 分享ES6中比较常用又强大的新特性

    前言 es6有很多新东西,但是感觉常用的并不是很多,这里学习记录了一些我自己认为非常常用又强大的新特性. scoping 实用的块级作用域,let x = xxx 可以声明一个块级作用域的局部变量,简 ...

随机推荐

  1. jquery过滤器之:contains()、.filter()

    :contains 选择器选取包含指定字符串的元素. 该字符串可以是直接包含在元素中的文本,或者被包含于子元素中. 经常与其他元素/选择器一起使用,来选择指定的组中包含指定文本的元素,如: $(&qu ...

  2. Android 图片三级缓存

    图片缓存的原理 实现图片缓存也不难,需要有相应的cache策略.这里采用 内存-文件-网络 三层cache机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference),其实网络不算cac ...

  3. 使用C#向ACCESS中插入数据(仅供参考)

    1.创建并打开一个OleDbConnection对象 string strConn = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source ...

  4. 练习一:SQLite基本操作

    一.基础知识: 运用场景: 1>应用运行需要保存一系列有一定关系有一定结构的数据(文本也可以但是存储效率低) 2>文件类型:.db(一个数据库就是一个.db文件) 3>路径:/dat ...

  5. 启动tomcat,报java.lang.NoClassDefFoundError

    用的Build Path加进来的jar包,没有读取到,应该讲jar包放在lib目录下

  6. oracle中删除表中某字段出现重复的信息 保留其中一条

    记得以前有个同事问过我这个,说是以前面试的时候碰到的问题,下面我介绍三种方法. 首先我们在这里创建一个测试表添加相应的测试数据. create table test  (id number,name ...

  7. Plugins

    Plugins AdminLTE makes use of the following plugins. For documentation, updates or license informati ...

  8. asl 和 lgpl的区别

    按照使用条件的不同,开源软件许可证可以分为三类(严苛程度递减) 1. 使用该开源软件的代码再散布(redistribute)时,源码也必须以相同许可证公开. 代表许可类型:GPL, AGPL 2. 使 ...

  9. Greenplum 集群部署

    最近开始接触Greenplum,线上也在使用了,感觉还不错,本次介绍一下集群的部署方法.那么Greenplum的架构如下: (架构图来源网络) 简单来说GPDB是一个分布式数据库软件,其可以管理和处理 ...

  10. sax解析案例(javabean封装xml文档数据)

    package itcast.sax; import java.io.IOException; import java.util.List; import javax.xml.parsers.Pars ...