数据库分页查询

limit offset

mysql里分页一般用limit来实现

  1. select* from article LIMIT 1,3

2.select * from article LIMIT 3 OFFSET 1

上面两种写法都表示取2,3,4三条条数据

当limit后面跟两个参数的时候,第一个数表示要跳过的数量,后一位表示要取的数量,例如

select* from article LIMIT 1,3 就是跳过1条数据,从第2条数据开始取,取3条数据,也就是取2,3,4三条数据

当 limit后面跟一个参数的时候,该参数表示要取的数据的数量

例如 select* from article LIMIT 3 表示直接取前三条数据,类似sqlserver里的top语法。

当 limit和offset组合使用的时候,limit后面只能有一个参数,表示要取的的数量,offset表示要跳过的数量 。

例如select * from article LIMIT 3 OFFSET 1 表示跳过1条数据,从第2条数据开始取,取3条数据,也就是取2,3,4三条数
————————————————
版权声明:本文为CSDN博主「黄杏波」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weberhuangxingbo/article/details/110181213

示例

 create table t1(c1 int,c2 varchar(20));
 insert into t1 select generate_series(1,10),generate_series(1,10);
--不支持语法: select * from t1 limit 1,3;
--limit获取前3行
qbadmin@10.14.41.157:20158/qianbase> select * from t1 limit 3;
  c1 | c2
-----+-----
   1 | 1
   2 | 2
   3 | 3
(3 rows)

--fetch first获取前3行
qbadmin@10.14.41.157:20158/qianbase> select * from t1 fetch first 3 rows only;
  c1 | c2
-----+-----
   1 | 1
   2 | 2
   3 | 3
(3 rows)


Time: 3ms total (execution 3ms / network 0ms)

qbadmin@10.14.41.157:20158/qianbase> 

Time: 3ms total (execution 3ms / network 0ms)
--limit 3 跳过前1行
qbadmin@10.14.41.157:20158/qianbase> select * from t1 limit 3 offset 1;
  c1 | c2
-----+-----
   2 | 2
   3 | 3
   4 | 4
(3 rows)

--rownum分页查询,rownum查询出来oracle和xtp数据对不上。
--oracle
SELECT *   
FROM (  
    SELECT t1.*, ROWNUM AS rn   
    FROM t1   
    WHERE ROWNUM <= 4  
)   
  7  WHERE rn > 1;

        C1 C2                                               RN
---------- ---------------------------------------- ----------
         2 2                                                 2
         4 4                                                 3
         5 5                                                 4

C##SCOTT@LHRCDB> 
--xtp
qbadmin@10.14.41.157:20158/qianbase> SELECT *
FROM (
    SELECT t1.*, ROWNUM AS rn
    FROM t1
    WHERE ROWNUM <= 4
)
WHERE rn > 1;
  c1 | c2 | rn
-----+----+-----
   2 | 2  |  2
   3 | 3  |  3
   4 | 4  |  4
(3 rows)


Time: 2ms total (execution 2ms / network 0ms)

qbadmin@10.14.41.157:20158/qianbase> 

--fetch 跳过前1行
SELECT * FROM t1
OFFSET 1 ROWS
FETCH NEXT 3 ROWS ONLY;
  c1 | c2
-----+-----
   2 | 2
   3 | 3
   4 | 4
(3 rows)


Time: 4ms total (execution 3ms / network 0ms)

qbadmin@10.14.41.157:20158/qianbase> 

Time: 3ms total (execution 3ms / network 0ms)

qbadmin@10.14.41.157:20158/qianbase> 
--limit 3跳过前5行
qbadmin@10.14.41.157:20158/qianbase> select * from t1 limit 3 offset 5;
  c1 | c2
-----+-----
   6 | 6
   7 | 7
   8 | 8
(3 rows)


Time: 2ms total (execution 2ms / network 0ms)

qbadmin@10.14.41.157:20158/qianbase> 
--oracle支持语法,xtp不支持with ties
--注释:如果指定with ties子句,那么拥有和最后一行相同的排序键值的行都会被fetch。如果指定了with ties子句,那么必须指定order by 。如果没有指定order by,那么不会有附加的行被返回。
C##SCOTT@LHRCDB> select * from t1 order by c1 fetch first 10 rows with ties;

        C1 C2
---------- ----------------------------------------
         1 1
         2 2
         3 3
         4 4
         5 5
         6 6
         7 7
         8 8
         9 9
        10 10
        10 10

11 rows selected.

C##SCOTT@LHRCDB> 

rownum不能直接使用

select * from t1 where rownum >5;  --查询结果会报错
/*
用于从表t1中选择rownum大于5的所有行。代码本身没有问题,

rownum:这是Oracle数据库中的一个伪列,它为结果集中的每一行返回一个数字。但是,使用rownum时有一些特殊的行为需要注意。
直接使用rownum:在Oracle中,你不能直接这样用rownum。这是因为rownum是在查询的结果返回之后被赋值的。因此,直接使用这种查询可能不会得到你期望的结果。你可能需要使用子查询来实现。
例如,如果你想选择t1表中的第6行之后的所有行,你需要这样做:

sql
SELECT *   
FROM (  
    SELECT t1.*, ROWNUM AS rn   
    FROM t1   
    WHERE ROWNUM <= YOUR_MAX_ROW_NUMBER  
)   
WHERE rn > 5;
这里的YOUR_MAX_ROW_NUMBER应该替换为你想查询的最大行数。
3. 适用于其他数据库:请注意,rownum是Oracle特定的。如果你使用的是其他数据库(如MySQL、PostgreSQL等),那么你需要使用其他方式来实现同样的功能。例如,MySQL中使用LIMIT和OFFSET。

性能:对于大的表,使用rownum(或其他数据库的等效功能)可能会影响性能,特别是当你不使用索引或其他优化手段时。
确保你了解你正在使用的数据库的特性,并始终检查执行计划以确保查询的性能。如果你遇到具体的性能问题或其他问题,请提供更多详细信息,我会尽量帮助你解决。
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值