Oracle,SQLserver 分页语句

原创 2016年05月31日 12:06:41

SQL Server,Oracle 常用分页SQL

今天无聊和朋友讨论分页,发现网上好多都是错的。网上经常查到的那个Top Not in 或者Max 大部分都不实用,很多都忽略了Order和性能问题。为此上网查了查,顺带把2000和2012版本的也补上了。

先说说网上常见SQL的错误或者说局限问题

1
2
3
4
5
select top 10 *
from table1
where id not in(
    select top 开始的位置 id
    from table1)

这样的确是可以取到分页数据,但是这是默认排序的,如果要按其中一列排序呢?那order by 加在哪里呢?里外都加,显然不行,外面的Order不起作用,只能嵌套,Oh my god,编程三个Select了,这效率。

为了好用效率高,总体思路还是老老实实的用RowNumber解决,但是SQL2000没有RowNumber,其实我们可以通过临时表自增列搞定,不多说,上例子。

 

SQL 2000 用临时表解决,通过在临时表中增加自增列解决RowNumber。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 14000,@End = 14050
 
 
CREATE TABLE #employees (RowNumber INT IDENTITY(1,1),
LastName VARCHAR(100),FirstName VARCHAR(100),
EmailAddress VARCHAR(100))
 
 
INSERT INTO #employees (LastName, FirstName, EmailAddress)
SELECT LastName, FirstName, EmailAddress
FROM Employee
ORDER BY LastName, FirstName, EmailAddress
SELECT LastName, FirstName, EmailAddress
FROM #employees
WHERE RowNumber > @Start AND RowNumber <= @End
 
 
DROP TABLE #employees
 
 
GO

  


SQL 2005/2008 由于支持了Row_Number于是通过派生表的方式解决(两个嵌套)

1
2
3
4
5
6
7
8
9
10
11
12
DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 14000,@End = 14050
 
 
SELECT LastName, FirstName, EmailAddress
FROM (SELECT LastName, FirstName, EmailAddress,
ROW_NUMBER() OVER (ORDER BY LastName, FirstName, EmailAddress) AS RowNumber
FROM Employee) EmployeePage
WHERE RowNumber > @Start AND RowNumber <= @End
ORDER BY LastName, FirstName, EmailAddress
GO

  


SQL 2005/2008 或者用CTE的方式实现,和派生表一样,就是好看点,执行计划都一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 14000,@End = 14050;
 
 
WITH EmployeePage AS
(SELECT LastName, FirstName, EmailAddress,
ROW_NUMBER() OVER (ORDER BY LastName, FirstName, EmailAddress) AS RowNumber
FROM Employee)
SELECT LastName, FirstName, EmailAddress
FROM EmployeePage
WHERE RowNumber > @Start AND RowNumber <= @End
ORDER BY LastName, FirstName, EmailAddress
GO

  


SQL SERVER 2012 比较给力支持了OFFSET,于是一个Select结束战斗

1
2
3
4
5
SELECT LastName, FirstName, EmailAddress
FROM Employee
ORDER BY LastName, FirstName, EmailAddress
OFFSET 14000 ROWS
FETCH NEXT 50 ROWS ONLY;

Oracle分页(方式一)

1
2
3
4
5
select * from ( 
     select rownum as rn, source.* from ( 
          select   *  from  house 
     ) source      where rownum <= 5)     result where rn >= 1   order by(title) asc;
     

 

Oracle分页(方式二 推荐)

select * from 
                   (select a.*,rownum rn from 
                                                        (select * from house) a
                    )
                       where rn between 1 and 5   order by(ID)
 


版权声明:本文为博主原创文章,未经博主允许不得转载。

《SQLServer》------常用的分页查询语句

前言 在SqlServer中,分页查询是经常用到的查询语句,一个好的分页查询语句,不能能将代码省略,还能提高运行效率,下面我们来探讨一下SQLServer中的分页查询语句。 具体的业务逻辑是这样的,我...
  • u013067402
  • u013067402
  • 2016年10月24日 12:01
  • 5693

总结一些分页查询的方法SQL server,MySQL,oracle数据库及hibernate中

分页查询是数据库查询中经常用到的一项操作,对查询出来的结果进行分页查询可以方便浏览。那么Oracle、SQL Server、MySQL是如何实现查询的呢?本文我们就来介绍这一部分内容。以及hibe...
  • angus_737093684
  • angus_737093684
  • 2016年11月08日 08:29
  • 1080

高效的SQLSERVER分页查询(推荐)

Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID、YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询...
  • qiaqia609
  • qiaqia609
  • 2014年11月24日 14:53
  • 152318

ORACLE分页查询SQL语法——最高效的分页

--1:无ORDER BY排序的写法。(效率最高) --(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT *   FRO...
  • Honey_Potter
  • Honey_Potter
  • 2016年11月02日 22:51
  • 28925

Oracle中的SQL分页查询原理和方法详解

转载请注明出处:http://blog.csdn.net/anxpp/article/details/51534006,谢谢!     本文分析并介绍Oracle中的分页查找的方法。     Or...
  • anxpp
  • anxpp
  • 2016年05月29日 21:26
  • 29549

Oracle分页查询sql语句

1.oracle中的分页查询sql语句基本可以按照如下的模板来改写:SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FR...
  • sinat_27535209
  • sinat_27535209
  • 2016年10月25日 14:43
  • 1112

Oracle、MySql、SQLServer 数据库中分页查询中的关键字总结

(一)、 mysql的分页查询
  • langjian2012
  • langjian2012
  • 2014年10月17日 22:13
  • 6612

mybatis+oracle实现分页查询--非常简单实用

前几天刚学习了mybatis,之后就在我写的某个列子中加上一层mybatis来访问oracle数据库,一般的增删改查经过测试都没有问题,唯一留下oracle的分页查询,一开始自然而然的就想当然的把or...
  • qiulongjiemajianyun
  • qiulongjiemajianyun
  • 2013年09月16日 22:15
  • 5926

ORACLE分页查询SQL语法——最高效的分页

author:XIAOHUI_LIAO   ---from:http://blog.csdn.net/XIAOHUI_LIAO/article/details/1759990   --1:无ORD...
  • chengzhezhijian
  • chengzhezhijian
  • 2014年03月07日 13:03
  • 1252

Oracle ROWNUM用法和分页查询总结

分页查询格式1 在查询的最外层控制分页的最小值和最大值。查询语句如下: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABL...
  • fw0124
  • fw0124
  • 2015年01月15日 13:56
  • 105787
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle,SQLserver 分页语句
举报原因:
原因补充:

(最多只允许输入30个字)