--page:当前页 pageNum:每页显示条数 select * from goods e limit 2,2; select * from goods e limit (page-1)*pageNum,pageNum;--MySql分页公式,按照公式来,取值前开后闭:< <=
1. 第一种sql
--公式 --page:当前页 pageNum:每页显示条数 select * from (select stu.*, rownum rn from (select * from stu) stu where rownum <= (page-1)*pageNum+pageNum) where rn > (page-1)*pageNum; --具体例子 select * from (select stu.*, rownum rn from (select * from stu) stu where rownum <= 3) where rn >= 1;
2.第二种oracle
--公式 --page:当前页 pageNum:每页显示条数 select * from (select stu.*, rownum rn from (select * from stu) stu) where rn > (page - 1) * pageNum and rn <= (page - 1) * pageNum + pageNum); --网上这里用Between闭区间,我以为不合适这个公式,这个公式要前开后闭 --具体例子 select * from (select stu.*, rownum rn from (select * from stu) stu) where rn <= 3 and rn > 0;
对比这两种写法,绝大多数的状况下,第一种oracle分页的效率比第二种高得多。对于Oracle推荐第一种优化
这是因为CBO 优化模式下,Oracle能够将外层的查询条件推到内层查询中,以提升内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 3就能够被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。而第二个查询语句,因为查询条件rn <= 3 and rn > 0blog
是存在于查询的第三层,而Oracle没法将第三层的查询条件推到最内层(即便推到最内层也没有意义,由于最内层查询不知道RN表明什么)。所以,对于第二种查询语句,Oracle最内层返回给中间层的是全部知足条件的数据,而中间层返回给最外层的也是全部数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。it