您好,欢迎来到九壹网。
搜索
您的当前位置:首页数据库分页技术大全(超级经典)

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

来源:九壹网
数据库分页技术

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 * from tablename 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 个记录行 //换句话说,LIMIT n 等价于 LIMIT 0,n。 2.sql server

--假设id是相应表的主键字段 --排序后选出第3行到第5行

(1)select top \"+newsNum+\" * from bookInfo where bookId not in (select top \"+pageNum+\" bookId from bookInfo)

(2)select * from ( select top 3 * from ( select top 5 * from wen3 order by id asc ) a order by id desc ) b order by id asc ; --以下也是对的,而且更加直观简洁,但是在sql server2000中不支持,但是在sql server 2005以上版本支持,顺便说一下,oracle中已经没有except,取而代之的是minus

select top 5 * from wen3 order by id except

select top 2 * from wen3 order by id ;

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

select top 5 a.* from ( select top 5 * from wen3 order by id asc ) a where id not in( select top 2 id from wen3 order by id ) order by id; 3.oracle

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

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

select * from (select a.*, 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 (select a.*, rownum rn from (select * from table1 t order by id ) a )b where b.rn between 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 (select aid,aname,row_number() over(支持order by 子句) as id from 表名) as t where 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 t order 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) ss where 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 (select top pages id from 表名 order by id) order by id 第二种分页方法

pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 pages=pageSize*(pageNumber-1)+1

select top pageSize * from 表名 where id>=(select max(id) from (select top pages id from 表名 order by id asc ) 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.numint 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 pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 pages=pageSize*(pageNumber-1)+1 SQL语句

select top pageSize * from 表名 where id>=(select max(id) from (select top pages id from 表名 order by id asc ) t )

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务