三种数据库实现分页

lkq_david 2013-07-03 02:40:06
在查询情况下,最经常的情况就是我们需要查询几条数据,而不是全部的查询出结果,比如最为经典的情况就是在我们写一个查询结果列表的情况,我们希望结果是分页显示,也就是查询出一段记录集。
在不同的数据库当中有不同的用法,下面看看不同的数据库是如何处理的:

SQL Server
在分页查询上,我感觉SQL Server比较费劲,没有一个专门的分页的语句,靠的是一种巧妙的方法实现分页查询:

折叠复制代码
id city country age sex username

1 北京 中国 25 1 小黄
3 广州 中国 26 1 小明
4 深圳 中国 24 1 小李
5 纽约 美国 25 1 Jack
6 华盛顿 美国 23 1 Tom
7 伦敦 英国 19 0 Lela
select * from t_user
select * from (select top 2 * from (select top 6 * from t_user order by id asc ) as aaa order by id desc) as bbb order by id asc

折叠复制代码
1 北京 中国 25 1 小黄
3 广州 中国 26 1 小明
4 深圳 中国 24 1 小李
5 纽约 美国 25 1 Jack
6 华盛顿 美国 23 1 Tom
7 伦敦 英国 19 0 Lela
折叠复制代码
6 华盛顿 美国 23 1 Tom
7 伦敦 英国 19 0 Lela
上面分页查询表示的是从第(6-2)=4条数据开始到第6条数据结束这段结果集。

MySQL
MySQL有个专门针对查询出一段数据的语句limit,使用起来非常的方便。
select * from t_user limit 2,3

折叠复制代码
4 深圳 中国 24 1 小李
5 纽约 美国 25 1 Jack
6 华盛顿 美国 23 1 Tom
上面查询中的2代表从第2条数据之后开始,注意是第2条数据之后,不包含第2条数据。3代表总共查询3条记录。那么limit 2,3代表从第2条(不包含第2条) 数据开始查询出3条记录。

Oracle

Oracle中有个rownum,其含义更加明显,就是第几行的意思,这样我们就可以通过where条件来进行分段查询了。

select * from t_user where rownum>=2 and rownum<=4

注意:oracle上面的语句查不到数据,应该套一层,如下

select * from (select a.*, rownum rn from t_user a where rownum <= 4) where rn >= 2


折叠复制代码
3 广州 中国 26 1 小明
4 深圳 中国 24 1 小李
5 纽约 美国 25 1 Jack
...全文
12881 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
devid 2013-07-05
  • 打赏
  • 举报
回复
--1.创建包,在该包中定义类型sp_test_cursor,是一个游标类型
create or replace package fenye_package is
type fenye_cursor is ref cursor;
end;

--2.编写一个存储过程,要求可以输入当前表名,每页显示数,当前页数,返回总记录数,总页数和按照工资从高到低返回结果集;
create or replace procedure fenye_pro(
sp_tableName in varchar2, --输入表名
sp_pageSize in number,--每页显示的记录数
sp_nowPge in varchar2,--当前页数
sp_countSize out number,--总记录数
sp_countPage out number,--总页数
sp_cursor out fenye_package.fenye_cursor) is
--定义部分
--定义sql语句字符串
v_sql varchar2(1000);
--定义两个变量
v_startSize number:=(sp_nowPge-1)*sp_pageSize+1;
v_endSize number:=sp_nowPge*sp_pageSize;
--执行部分
begin
v_sql:='select * from (select t1.* ,rownum rn from (select *from '||sp_tableName||' order by saldesc) t1 where rownum<='||v_endSize||') where rn>='||v_startSize;
--把游标和sql关联
open sp_cursor for v_sql;
--计算sp_countSize和sp_countPage
v_sql:='select count(*) from '||sp_tableName;
execute immediate v_sql into sp_countSize;
if mod(sp_countSize,sp_pageSize)=0 then
sp_countPage := sp_countSize/sp_pageSize;
else
sp_countPage := sp_countSize/sp_pageSize+1;
end if;
end;
tang_zhao 2013-07-05
  • 打赏
  • 举报
回复
引用 9 楼 u011310162 的回复:
总结的不错,刚好想比较下,谢谢楼主,哈哈……
很高兴帮到你,咱的目的达到了
tang_zhao 2013-07-05
  • 打赏
  • 举报
回复
总结的不错,刚好想比较下,谢谢楼主,哈哈……
lkq_david 2013-07-04
  • 打赏
  • 举报
回复
自己顶下,让更多的人接触到
Wentasy 2013-07-03
  • 打赏
  • 举报
回复
刚好以前写过相关文章,是最简单的分页,可以看看。 三种常用数据库(Oracle、MySQL、SQLServer)的分页
linwaterbin 2013-07-03
  • 打赏
  • 举报
回复
引用 5 楼 qq1145174853 的回复:
[quote=引用 4 楼 linwaterbin 的回复:] Oracle 分页函数 row_number() 很好用哈、哪里恶心了 rownum很智能、、、
rownum用起来要注意的,小于和小于等于能直接用rownum的,但是等于,大于和大于等于就不好用了,如下 select * from t_user where rownum <2;//能查到数据 select * from t_user where rownum <=2;//能查到数据 select * from t_user where rownum =2;//查不到数据 select * from t_user where rownum >2;//查不到数据 select * from t_user where rownum >=2;//查不到数据 [/quote] 这不废话嘛 常识哈 > = 能用rownum吗?
lkq_david 2013-07-03
  • 打赏
  • 举报
回复
引用 4 楼 linwaterbin 的回复:
Oracle 分页函数 row_number() 很好用哈、哪里恶心了 rownum很智能、、、
rownum用起来要注意的,小于和小于等于能直接用rownum的,但是等于,大于和大于等于就不好用了,如下 select * from t_user where rownum <2;//能查到数据 select * from t_user where rownum <=2;//能查到数据 select * from t_user where rownum =2;//查不到数据 select * from t_user where rownum >2;//查不到数据 select * from t_user where rownum >=2;//查不到数据
linwaterbin 2013-07-03
  • 打赏
  • 举报
回复
Oracle 分页函数 row_number() 很好用哈、哪里恶心了 rownum很智能、、、
sych888 2013-07-03
  • 打赏
  • 举报
回复
对比分析,不错啊
lkq_david 2013-07-03
  • 打赏
  • 举报
回复
引用 1 楼 u010412956 的回复:
没想到sqlserver的分页和oracle一样恶心、、
用sqlserver很少,哈哈……
u010412956 2013-07-03
  • 打赏
  • 举报
回复
没想到sqlserver的分页和oracle一样恶心、、

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧