1、SQL server
现在常用的是:
row_number()
--例如page=1,limit=10 -- // 开始索引 -- int start = (page - 1) * limit + 1;//(1)为2是结果为(11) --// 结束索引 --int end = page * limit;//(10)为2是结果为(20) select * from(select *, ROW_NUMBER() over (order by p.id desc) row from product p ) c
where c.row>=start and c.row<=end
2、Mysql
---语句样式: MySQL中,可用如下方法:
SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M
---适应场景: 适用于数据量多的情况(元组数上万). 最好ORDER BY后的列对象是主键或唯一所以,
使得ORDERBY操作能利用索引被消除但结果集是稳定的(稳定的含义,参见方法1)
---原因: 索引扫描,速度会很快.
但MySQL的排序操作,只有ASC没有DESC(DESC是假的,未来会做真正的DESC,期待...).
方式 1、limit m语句:
select * from product where id>(1*3) ORDER BY id ASC LIMIT 1
#通过ID查找 LIMIT M 后面参数是显示条数
方式 2、limit m,m语句:
select * from product order by id desc limit 4,2; #问题多 数据多的时候 效率十分低下 满足(4+2)后面的参数是返回条数
int start=(page-1)*limit;//开始
List<Product> products = new ArrayList<Product>();
Product product = null;
String sql = "select * from product order by pno limit ?,?";
return getList(sql,new Object[]{start,limit});
方式 3、 优化方式1
例如:每页10条数据,当前是第10页,当前条目ID的最大值是109,最小值是100. 那么跳到第9页: select * from dept where deptno<100 order by desc limit 0,10; 那么跳到第8页: select * from dept where deptno<100 order by desc limit 10,10; 那么跳到第11页: select * from dept where deptno>109 order by asc limit 0,10; 那么跳到第11页: select * from dept where deptno>109 order by asc limit 10,10;
3、sqlite分页方式
select * from (表名) order by (排序字段) limit (返回条数) offset (第几条开始);
4、MariaDB