mysql、oracle分页查询数据库

一、mysql分页查询

select * from tableName where id limit (当前页码-1)*页面容量 , 页面容量

第一个参数:数据偏移量,当前页码从1开始。
第二个参数:每页的数据量。

二、oracle分页查询

SELECT *
  FROM (SELECT t2.*, ROWNUM AS rowno
          FROM (SELECT *
                   FROM emp t1
                   WHERE id > 10 ORDER BY id DESC) t2
         WHERE ROWNUM <= 20) t3
 WHERE t3.rowno >= 10;

这里是三层嵌套写法:select A(select B(select C))。这种写法在实际中比较实用,我们将外层的两层嵌套改写成固定的分页头和分页尾,而中间的部分则为正真的业务SQL,与分页处理进行分离,这样多个表都可以公用这段分页头和尾。

分页头:
SELECT *
  FROM (SELECT t2.*, ROWNUM AS rowno
          FROM (
分页尾:
) t2
    WHERE ROWNUM <= 页尾) t3
        WHERE t3.rowno >= 页头;

还有一种两层的写法,这种写法比上面的效率要高一点,因为他少查询了一遍,但是两层写法不便于将分页代码分离出来,不利于维护。在数据量不是特别庞大的时候还是建议用三层写法,只有数据量特别大时才会有比较明显的效率区别。两层写法如下所示:

SELECT *
  FROM (SELECT ROWNUM AS rowno, t1.*
          FROM emp t1
          WHERE id > 10 AND ROWNUM <= 20 
          ORDER BY id DESC) t2
 WHERE t2.rowno >= 10;

另外补充一点关于ROWNUM 的知识,ROWNUM只能用以上符号(<、<=、!=),(>,>=,=,between..and)经常会查询不到结果或者结果莫名其妙。可以这样理解:ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between…and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值