当我们查询数据库的时候最简单的做法就是
SELECT *
FROM emp;
这种查询方式在早期学习数据库的时候没有什么问题,可以让我们以最快的速度看到一个数据库的完整信息。但是随着开发的项目越来越庞大,数据量也越来越大。当一个表中有十万条代码的时候,每次查询全部,既不好显示,也会是项目性能下降。这时候我们就需要将查询后的结果分页显示。
问题:如何以五条数据为一组,按组依次查询?
既然是查询特定的几条数据,那我们就想到ORACLE提供的伪列ROWNUM,这个伪列可以显示每一条数据,在数据库中的第几行。
SELECT ROWNUM,empno,ename,sal,job,hiredate
FROM emp;
当我们在SELECT子句中查询ROWNUM之后,ORACLE自动为我们的每条数据自动添加一个行号。那么我们是否可以利用这个伪列,作为查询条件进行查询呢?
SELECT ROWNUM,empno,ename,job,sal,hiredate
FROM emp
WHERE ROWNUM BETWEEN 0 AND 5;
可以看到在我们将ROWNUM作为查询条件放到WHERE子句之中,我们确实成功将前五行数据查询出来,那么我们可以就用此方法完成分页吗?
SELECT ROWNUM,empno,ename,job,sal,hiredate
FROM emp
WHERE ROWNUM BETWEEN 5 AND 10;
很遗憾,我们发现并未查询到任何数据,这是由于我们的ROWNUM伪列是自动生成的,并不固定。所以我们需要改变一下思路。
我们发现ROWNUM作为查询条件只有从0开始查才是有效的,那么我们可以尝试先将目标位置之前的所有数据作为一个临时表先查询出来,然后在这个临时表中再去截取相应的数据。
SELECT *
FROM (
SELECT ROWNUM rm,empno,ename,job,sal,hiredate
FROM emp
WHERE ROWNUM<=10) temp
WHERE temp.rm>5;
可以看到我们在这里利用子查询成功将6到10条数据查询出来,只要改变两个WHERE子句中的数字,就可以查询不同页面中的数据。
我们现在成功实现了查询特定行的数据,但是是使用数字写死的方式编写SQL语句,我们可以发现,这两个数字其实是有规律可寻的。
我们设currentPage表示当前页,pageSize 表示每页显示的数据条数。
SELECT *
FROM (
SELECT ROWNUM rm,empno,ename,job,sal,hiredate
FROM emp
WHERE ROWNUM<=*(currentPage*pageSize) temp
WHERE temp.rm>(currentPage-1)*pageSize;