主流常见关系数据库分页sql语句写法。MySQL、PostgreSQL、SQLite、Oracle、DB2、SQL Server。limit、offset、fetch、rownum
  06PagLd5y8mb 2023年11月02日 88 0


前言

1.分页sql

  • 逻辑:每页10条,取第3页。即取第21~30条数据

1.1.MySQL/SQLite/PostgreSQL

select * from demo limit 10 offset 20;
select * from demo limit 20, 10;         -- PostgreSQL不支持该写法

1.2.Oracle12C+

  • Oracle11g之前很难用,Oracle12C+与MySQL用法格式一样了,只是语法关键字不一样,而且比较啰嗦
  • 语法
  • OFFSET是偏移量,常数,不写默认为0,常用于分页。
  • FETCH NEXT 1 ROWS 等同于 FETCH FIRST 1 ROW。
  • only只返回指定的量,with ties 返回和最后一条数据相同的数据。
[OFFSET offset ROWS] FETCH NEXT [ row_count | percent PERCENT ] ROWS [ ONLY | WITH TIES ]
select * from demo offset 20 rows fetch next 10 rows only;
select * from demo                fetch next 10 rows only;

1.3.Oracle11g之前

  • 写法一比写法二性能高。详见

1.3.1.标准写法一(性能高)

-- 套2层,这样可以不影响原始sql
select * from                               -- 套第2层,用rownum分页
    (
    select rownum as rn, tmp.* from         -- 套第1层,获取rownum。注意rownum必须起别名,因为rownum本质实时生成的
        ( select * from demo ) tmp          -- 原始sql
    where rownum <= 30
    )
where rn > 20;

1.3.2.标准写法二(性能低)

select * from                               -- 套第2层,用rownum分页
    (
    select rownum as rn, tmp.* from         -- 套第1层,获取rownum。注意rownum必须起别名,因为rownum本质实时生成的
        ( select * from demo ) tmp          -- 原始sql
    )
where rn <= 30 and rn > 20;

1.3.3.取前n条简化写法

select * from demo where rownum <= 10;

1.3.4.错误写法

  • 查不到任何数据,详见
-- 注意:如下所示是错误的,不会查到记录。因为 rownum 是从1开始,永远不会大于2,where 条件永不成立,因为没有结果查询出来,所以 rownum 也不能加一,永远是1
select * from demo where rownum > 10;
select * from demo where rownum = 10;
select * from demo where rownum >= 10;
-- 原理同上,不等于10,只能取到前9条记录
select * from demo where rownum != 10;


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
06PagLd5y8mb