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 可以声明一个块级作用域的局部变量,简 ...
随机推荐
- flex的http URL转码与解码
private function httpEncoding(param:String):String{ //转码 return encodeURIComponent(param); } ...
- 创建型模式(前引)简单工厂模式Simple Factory
一引出的原因(解决下面的问题) 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式. 在简单工厂模式 ...
- Windows Phone Foreground Toast
Basically ToastPrompt is an UI component that derives from the Coding4Fun toolkit's abstract PopUp&l ...
- mysql中一些简单但是新手容易犯的错误
一.概述 本人近期使用mysql,由于是新手,常常碰到一些问题,因此,在这里做了一个错误备忘录. 二.错误罗列 1.MySQL 记录不存在时插入 记录存在则更新的实现方法 http://www.cnb ...
- thinkphp 的create()非法数据解决办法
是因为create()方法默认是使用post传值的,把from表单的传值方法改成post就行了,默认是get.
- C# 文件和文件夹操作
一.文件操作 1.File类的常用静态方法: void AppendAllText(string path, string contents),将文本contents附加到文件path中 bool E ...
- bzoj1150: [CTSC2007]数据备份Backup--贪心+优先队列维护堆
题目大意:将k对点两两相连,求最小长度 易证得,最优方案中,相连的办公楼一定是取相邻的比取不相邻的要更优 然后就可以用贪心来做这道题了.. 之前向CZL大神学习了用堆来贪心的做法orz 大概思路就是将 ...
- SQL Server 2008 下载及安装教程
sql server 2008 是微软公司开发的一套数据库管理系统.是目前大型数据库中常用数据库之一.性能稳定,功能强大,是面向中大型企业的一款数据库解决方案.我们安装SqlServer2008的时候 ...
- 使用 mock.js 让前端开发与后端独立
直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- 使用方法:mail_sendmail($params)
使用方法:mail_sendmail($params) 类构造函数,$params是一个关联数组,你可以设定sendmail的参数,目前只有sendmail_path是有效的,用来设置sendmail ...