mysql、oracle 分页查询

在web开发中,若我们从数据库中拿到的数据过多,则我们常常会想到分页。
分页不但可以保持展示数据的页面的整洁性和可控性,也同样降低了数据库的I/O压力(需要时才查询),可谓是一举两得。下面我们来谈谈,MySQL和ORACLE数据库如何进行分页。


——————Mysql分页——————
一般对MySQL数据库分页,我们都会使用到其自带的limit函数。
Limit函数语法格式:

SELECT [DISTIN|UNIQUE](*,columname[AS alias],…)
FROM table
WHERE …
ORDER BY …
LIMIT offset,rows

offset:指定要返回的第一行的偏移量(就是指定从第几条数据开始查),选项可选,默认的偏移量是0(第一条数据)
rows:指定返回数据的行数,必须填写

假如我有这样一张表:
mysql、oracle 分页查询_第1张图片

当我执行:
select t.* from chat_user t limit 5;
则会出现以下结果(从第一条数据开始,获取5条记录):
mysql、oracle 分页查询_第2张图片

select t.* from chat_user t limit 3,5;
从第3条数据(不包含第3条)开始,取5条记录
mysql、oracle 分页查询_第3张图片

select t.* from chat_user t limit 5,5;
从第5条数据(不包含第5条)开始,取5条记录
mysql、oracle 分页查询_第4张图片

由上面执行的结果来看,对于offset和rows两个参数的定义,大家应该也已经了解了,但是在真正的应用开发中,我们肯定不能这样写的。举个例子吧,我要每次查找5行记录,那么,第一页就是1-5,第二页就是6-10,以此类推。你总不能每次都将offset都传进去吧?
所以,前人总结了一条公式,以便应用在开发中,公式为offset=(page-1)*rows,这个page就是分页的页数,比如第一页,代入公式那就是从offset就是0,从第一条数据开始取。第二页,代入公式那就是rows,从第rows条数据开始取。这就刚好对应了我上面所说的1-5,6-10这些记录。

获取总页数:
实现分页的程序中,需要获取分页后的总页数,原本总页数可以根据“总记录数/每页显示的记录数”来计算,但是,这样难免会有余数出现,所以为了解决出现余数仍能正确获得页数,我们也得出了一个公式:总页数=(总记录数-1)/每页显示的记录数+1。
比如我上面的截图中总记录数为12,我每页要显示5条记录,那么带入里面,总页数就是3,这是正确的。


——————ORACLE分页——————

对于oracle的分页,并没有像mysql那样,有一个limit函数专门供给分页查询。其实说白了,oracle的分页查询,就是给要查询的表中定义一个ROWNUM,然后对他进行范围限定,起到分页查询的效果。
假如我有下面这一张表:
mysql、oracle 分页查询_第5张图片

那么我要查询,行号在5-10之间的记录,所以,我可以像这样写:
mysql、oracle 分页查询_第6张图片

那我要查询日期小于等于2017.03.01并且行号在1-10之间的记录,我可以这样写:
mysql、oracle 分页查询_第7张图片

有 order by 条件限制的时候,你可以这样写
mysql、oracle 分页查询_第8张图片


——————Hibernate的HQL分页——————
hibernate对于mysql还是oracle,都封装好了分页的写法,我们只需要对setFirstResult和setMaxResult进行设定查询,具体代码如下:

org.hibernate.Query q = “form User”;
q.setFirstResult(int offset);
q.setMaxResult(int rows);

hibernate对mysql以及oracle封装的底层代码,有兴趣的同学可以点击下面博文地址进去学习,做一件事要刨根问底才能铭记于心。

博文链接:
http://blog.csdn.net/davidmr_001/article/details/1587593

好啦!今天的博文就写到这,学无止境,生生不息。

你可能感兴趣的:(数据库)