SQL2012新特性一次一个数据块----特殊的查询分页
对于数据库人员来说,在软件项目开发的过程中,或多或少的不可避免的就是经常遇到类似“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新特性一次一个数据块----特殊的查询分页的更多相关文章
- fread 不能读取最后一个数据块
今天遇到一个问题,fread()竟然不能读取文件中的最后一个数据块. 我定义了一个结构体: Persong { char name[10]; char phone[15]; } 以及两个函数: int ...
- JAVA 7新特性——在单个catch代码块中捕获多个异常,以及用升级版的类型检查重新抛出异常
在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常.如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度.下面用一个例子来理解. Java 7之前 ...
- 12.2Data Guard新特性--使用DBMS_DBCOMP.DBCOMP数据比较
Oracle Data Guard会主动对Hot数据(数据正被读取或修改)执行验证, 无论是primary还是standby,但对于那些Cold数据不会做任何检查和校验.所以在12.2版本 ...
- Java12新特性 -- 只保留一个 AArch64 实现
现状 当前 Java 11 及之前版本JDK中存在两个64位ARM端口.这些文件的主要来源位于src/hotspot/cpu/arm 和 open/src/hotspot/cpu/aarch64 目录 ...
- ABAP 7.50 新特性之另一个CORRESPONDING
在ABAP中,存在着一条法则:同样的名称代表的不一定是同样的东西(具体可看最近的相关讨论). 但是如你们所知的,存在着一个很好的例外: 所有涉及到使用CORRESPONDING为结构赋值的关键字的语法 ...
- 向一个文件流写入一个数据块---fwrite
函数原型:int fwrite(const void *buffer,size_t size,size_t count,FILE *stream); 参数说明:buffer:用于写入到文件的数据地址. ...
- 向文件写入一个数据块---write
函数原型:ssize_t write(int fd,const void *buf,size_t count); 参数说明:fd:文件描述符,buf:写入数据的缓冲区,count:写入数据的最大长度. ...
- Atitit.数据库新特性战略规划 mssql sql server 2008 SQL2012 SQL2014
Atitit.数据库新特性 mssql sql server 2008 SQL2012 SQL2014 1. Sql2012 新特性 1 1.1. 增加了Sequence对象. 1 1.2. 新的分页 ...
- 分享ES6中比较常用又强大的新特性
前言 es6有很多新东西,但是感觉常用的并不是很多,这里学习记录了一些我自己认为非常常用又强大的新特性. scoping 实用的块级作用域,let x = xxx 可以声明一个块级作用域的局部变量,简 ...
随机推荐
- nohup命令浅析
要将一个命令放到后台执行,我们一般使用nohup sh command & &都知道是放到后台执行这个命令,那么nohup是做什么的? 这就要从unix的信号说起,unix的信号机制可 ...
- 不错的判断 UITextView 内容不超过20个字符串的方法
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSSt ...
- 无法将Win7安装到GPT分区下解决办法
当出现"您想将windows安装 在何处时",按shift+F10打开命令提示符,输入:diskpartlist disksel disk 0cleanconvert mbr完成转 ...
- DataTable在内存中的使用
DataTable表示一个与内存有关的数据表,可以使用工具栏里面的控件拖放来创建和使用,也可以在编写程序过程中根据需要独立创建和使用,最常见的情况是作为DataSet的成员使用,在这种情况下就需要用在 ...
- python rabbitmq
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @author: zengchunyun ""& ...
- 分模块创建maven项目(一)
maven是一个项目构建和管理的工具. 我们可以通过maven仓库可以实现管理构建(主要是JAR还包括:WAR,ZIP,POM等等). 我们可以通过maven插件可以实现编译源代.产生Javadoc文 ...
- 用atom写LaTeX文档
下载并安装Tex Live: 下载页面 下载并安装atom:下载页面 打开atom File -> Settings -> Install 搜索并安装: language-latex la ...
- jquery ajax传递多个对象或数组到后台
1.js对象创建:因为需要把对象json序列化后,才能传递到后台,后台根据json字符串进行反序列化. 2.Jquery $.ajax方法的配置 针对$.ajax方法的配置参数需要进行修改: 1) ...
- jquery暂停和中断循环
jquery对数组进行循环,如果要求每次循环的时候暂停2秒钟,在.earch循环的时候,无论怎么设置,都不会暂停. setTimeout也只是在第一次执行的时候暂停. 原因猜测: js开始执行多线程? ...
- Log4J简单使用
一.一般会将commons-logging和Log4j一起使用 原因:1.commons-logging功能较弱 2.log4j功能强大. 所需jar: log4j-1.2.16.ja ...