sql分页 Mysql Oracle SqlServer

来源:互联网 发布:火车票网络订单号查询 编辑:程序博客网 时间:2024/06/05 14:30

 假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql、Oracle和SQL Server分页查询student表。

1、Mysql的分页查询: 

1 SELECT2     *3 FROM4     student5 LIMIT (PageNo - 1) * PageSize,PageSize;

理解:(Limit n,m)  =>从第n行开始取m条记录,n从0开始算。

2、Oracel的分页查询:

复制代码
 1 SELECT 2     * 3 FROM 4     ( 5         SELECT 6             ROWNUM rn ,* 7         FROM 8             student 9         WHERE10             Rownum <= pageNo * pageSize11     )12 WHERE13     rn > (pageNo - 1) * pageSize
复制代码

理解:假设pageNo = 1,pageSize = 10,先从student表取出行号小于等于10的记录,然后再从这些记录取出rn大于0的记录,从而达到分页目的。ROWNUM从1开始。

3、SQL Server分页查询:

复制代码
 1 SELECT 2     TOP PageSize * 3 FROM 4     ( 5         SELECT 6             ROW_NUMBER () OVER (ORDER BY id ASC) RowNumber ,* 7         FROM 8             student 9     ) A10 WHERE11     A.RowNumber > (PageNo - 1) * PageSize
复制代码

 理解:假设pageNo = 1,pageSize = 10,先按照student表的id升序排序,rownumber作为行号,然后再取出从第1行开始的10条记录。


二,集中高效的sql语句

.几种典型的分页sql,下面例子是每页50条,198*50=9900,取第199页数据。

复制代码
--写法1,not in/top
select top 50 * from pagetest
where id not in (select top 9900 id from pagetest order by id)
order by id


--写法2,not exists
select top 50 * from pagetest
where not exists
(select 1 from (select top 9900 id from pagetest order by id)a where a.id=pagetest.id)
order by id

--写法3,max/top
select top 50 * from pagetest
where id>(select max(id) from (select top 9900 id from pagetest order by id)a)
order by id

--写法4,row_number()
select top 50 * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber>9900

select * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber>9900 and rownumber<9951

select * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber between 9901 and 9950

--写法5,在csdn上一帖子看到的,row_number() 变体,不基于已有字段产生记录序号,先按条件筛选以及排好序,再在结果集上给一常量列用于产生记录序号
select *
from (
select row_number()over(order by tempColumn)rownumber,*
from (select top 9950 tempColumn=0,* from pagetest where 1=1 order by id)a
)b
where rownumber>9900
 
 
复制代码

分别在1万,10万(取1990页),100(取19900页)记录集下测试。

测试sql:

复制代码
declare @begin_date datetime
declare @end_date datetime
select @begin_date = getdate()

<.....YOUR CODE.....>

select @end_date = getdate()
select datediff(ms,@begin_date,@end_date) as '毫秒'

原创粉丝点击