limit offset
mysql里分页一般用limit来实现
- 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(或其他数据库的等效功能)可能会影响性能,特别是当你不使用索引或其他优化手段时。
确保你了解你正在使用的数据库的特性,并始终检查执行计划以确保查询的性能。如果你遇到具体的性能问题或其他问题,请提供更多详细信息,我会尽量帮助你解决。
*/