数据库分页技术大全(超级经典)

1.mysql

--记住mysql中limit后是从零开始的

主体格式如下:

select   *   from   tablename   limit   m,n

--比如要查第6行到第20行

select   *   from   tablename   limit   5,15

右边两种写法等价: select   *   from   table  limit  10

select   *   from   table   limit  0,  10 --都是查询前十行

limit [m,] n

m:为起始行(即从结果集的第几行开始查找),从0开始,且可以省略,即直接写 limit n这是默认从第0行开始

n:为查询条数,不能为负数

例子如下:select * fromtablename limit 2,20

表示从第2行开始,取20条数据

SELECT * FROM table   LIMIT [offset,] rows | rows OFFSET offset

LIMIT 子句可以被用于强制SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定

第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL也支持句法:

LIMIT # OFFSET #。

mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15

//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:

mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.

//如果只给定一个参数,它表示返回最大的记录行数目:

mysql> SELECT * FROM table LIMIT 5;     //检索前 5 个记录行

//换句话说,LIMITn 等价于 LIMIT 0,n。

2.sql server

--假设id是相应表的主键字段

--排序后选出第3行到第5行

select * from ( selecttop 3 * from ( select  top 5 * from wen3order by id asc ) a order by id desc ) b order by id asc ;

--一下也是对的,而且更加直观简洁,但是在sqlserver2000中不支持,但是在sqlserver2005以上版本支持,顺便说一下,oracle中已经没有except,取而代之的是minus

select top 5 * fromwen3 order by id

except

select top 2 * fromwen3 order by id ;

--下面我换另一种方法 因为sql server2000中没有支持except ,可以用notexists,还有not in,<>any等来替代。“except”在关系代数里面就表示“集合的差”。

 

 

 

select top 5 a.* from ( select  top 5 * from wen3 order by id asc ) a whereid not in( select top 2 id  from wen3order by id ) order by id;

3.oracle

--(方法一)这种性能是最好的

select * from (selecta.*, rownum rn from (select * from table1 t order by id ) a where rownum <=8) where rn > 4;

--或者是

select * from (selecta.*, rownum rn from (select * from table1 t order by id ) a where rownum <=8) b where b.rn > 4;

--(方法二)

select a.*,rownum from(select * from table1 t order by id ) a   --记得先排序啊

where rownum <=8

minus

select a.*,rownum from(select * from table1 t order by id ) a

where  rownum <=4 ;

--上面这种方法也很好,而且一般选手想不到哦!

--(方法三)这种性能是最差的

select * from (selecta.*, rownum rn from (select * from table1 t order by id ) a )b where b.rnbetween 5 and 8;  --当然你这里用and可以的

--这个陷阱很多啊,小心分辨哦!

--在使用ROWNUM时,只有当Order By 的字段是主键时,查询结果才会先

--排序再计算ROWNUM

4.DB2

--取前15条记录。

select * from 表名 order by XXX [desc] FETCH FIRST 15 ROWS ONLY

--db2中取第m---n行

select * from (selectaid,aname,row_number() over(支持orderby 子句) as id from 表名) as twhere t.id between m and n

 

 

 

 

 

 

 

 

下面给出Oracle/Sqlserver/MySQL三种数据库先出第m至第n条记录的方法: 

获取按照F1字段升序排序的,从m至n行记录

注意,F1一定要做索引或主键,最好是主键

SqlServer

select t2.* from (Select top n-m t1.* from (Select top n * from Tablename as torder by t.F1) as t1 order by t1.F1 desc) as t2 order by t2.F1

select t2.* from 
(
select top 20 t1.* from 
(
select top 500020 * from dbgen as t order by t.F1

as t1 order by t1.F1 desc
)
as t2 order by t2.F1

Oracle

select * from (select rownum r, t.* from Tablename t where r m and t1.r <= m

select * from (select rownum r, t.* from DBTEST t where rownum<300020) sswhere ss.r > 300000 and ss.r <= 300020

MySQL

最简单
select * from Tablename t order by t.F1 limit n,m-n+1
select * from DBtest t order by t.F1 limit 300000,20 

性能对比:
三者差不多少!
上面实例中的语句在50万条记录的表中选取第50万左右的记录20条,均不超过1秒。

 

 

 

 

 

 

Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理

Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理
最近把平时在项目中常用到的数据库分页sql总结了下。大家可以贴出分页更高效的sql语句。
sqlserver分页 
第一种分页方法
需用到的参数: 
pageSize 每页显示多少条数据 
pageNumber 页数 从客户端传来 
totalRecouds 表中的总记录数 select count (*) from 表名 
totalPages 总页数 
totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1
pages 计算前pages 条数据 
pages= pageSize*(pageNumber-1) 
SQL语句: 
select top pageSize * from 表名 where id not in (selecttop pages id from 表名 order by id) order by id 
第二种分页方法
pageSize 每页显示多少条数据 
pageNumber 页数 从客户端传来
pages=pageSize*(pageNumber-1)+1
select top pageSize * from 表名 where id>=(selectmax(id) from (select top pages id from 表名 order by idasc ) t )

mysql分页 
需用到的参数: 
pageSize 每页显示多少条数据 
pageNumber 页数 从客户端传来 
totalRecouds 表中的总记录数 select count (*) from 表名 
totalPages 总页数 
totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1
pages 起始位置 
pages= pageSize*(pageNumber-1) 
SQL语句: 
select * from 表名 limit pages, pageSize; 
mysql 分页依赖于关键字 limit 它需两个参数:起始位置和pageSize 
起始位置=页大小*(页数-1) 
起始位置=pageSize*(pageNumber -1)

oracle分页
pageSize 每页显示多少条数据 
pageNumber 页数 从客户端传来 
totalRecouds 表中的总记录数 select count (*) from 表名 
totalPages 总页数 
totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1
startPage 起始位置 
startPage= pageSize*(pageNumber-1)+1
endPage=startPage+pageSize
SQL语句
select a.* from 
(
   select rownum num ,t.* from 表名 t where 某列=某值 order by id asc 
)a
where a.num>=startPage and a.num

db2分页
int startPage=1 //起始页
int endPage;     //终止页
int pageSize=5; //页大小
int pageNumber=1 //请求页

startPage=(pageNumber-1)*pageSize+1 
endPage=(startPage+pageSize);


SQL语句
select * from (select 字段1,字段2,字段3,字段4,字段5,rownumber()over(order by 排序字段 asc ) as rowid from 表名 )as a where a.rowid >= startPage AND a.rowid

access分页
pageSize 每页显示多少条数据 
pageNumber 页数 从客户端传来
pages=pageSize*(pageNumber-1)+1
SQL语句
select top pageSize * from 表名 where id>=(selectmax(id) from (select top pages id from 表名 order by idasc ) t )

你可能感兴趣的:(分页)