当前位置: 首页 > article >正文

MySQL、Oracle、SQL Server 和 PostgreSQL 的分页查询

在不同的数据库中,分页查询是常见的操作,用于从大量数据中获取部分数据集。不同的数据库有不同的分页实现方式。下面是 MySQLOracleSQL ServerPostgreSQL 的分页查询语法介绍。

1. MySQL 分页

在 MySQL 中,可以使用 LIMITOFFSET 子句进行分页查询。LIMIT 用于指定返回的行数,OFFSET 用于指定从哪一行开始返回。

语法:
SELECT column1, column2, ...
FROM table_name
ORDER BY column_name
LIMIT offset, row_count;
  • offset:指定开始返回的行数。
  • row_count:指定返回的记录数。
示例:

假设我们有一个 users 表,包含 idname 字段,想要分页显示第 2 页的数据(每页 10 条数据):

SELECT id, name
FROM users
ORDER BY id
LIMIT 10 OFFSET 10;  -- 从第 11 条记录开始,返回 10 条数据

或者使用更简洁的写法:

SELECT id, name
FROM users
ORDER BY id
LIMIT 10 OFFSET 10;  -- 相同效果

2. Oracle 分页

在 Oracle 中,分页查询可以使用 ROWNUM 或者更常见的 ROW_NUMBER() 窗口函数(自 Oracle 12c 以后)。ROWNUM 更为传统,而 ROW_NUMBER() 是标准的 SQL 方式。

使用 ROWNUM
SELECT * FROM (
    SELECT id, name
    FROM users
    ORDER BY id
)
WHERE ROWNUM BETWEEN start_row AND end_row;
使用 ROW_NUMBER()(推荐):
SELECT id, name
FROM (
    SELECT id, name,
           ROW_NUMBER() OVER (ORDER BY id) AS rownum
    FROM users
)
WHERE rownum BETWEEN start_row AND end_row;
  • start_row 是开始的行号,end_row 是结束的行号。
  • ROW_NUMBER() 会为每一行分配一个唯一的行号,然后你可以基于行号进行分页。
示例:

假设每页显示 10 条记录,想获取第 2 页的数据:

SELECT id, name
FROM (
    SELECT id, name,
           ROW_NUMBER() OVER (ORDER BY id) AS rownum
    FROM users
)
WHERE rownum BETWEEN 11 AND 20;  -- 获取第 2 页(第 11 到 20 条数据)

3. SQL Server 分页

在 SQL Server 中,从 2005 版本开始,分页通常使用 ROW_NUMBER() 函数。SQL Server 2012 版本以后,提供了 OFFSET-FETCH 子句,它简化了分页操作。

使用 OFFSET-FETCH(推荐):
SELECT id, name
FROM users
ORDER BY id
OFFSET start_row ROWS FETCH NEXT row_count ROWS ONLY;
示例:

假设每页显示 10 条记录,想获取第 2 页的数据:

SELECT id, name
FROM users
ORDER BY id
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;  -- 从第 11 条开始,获取 10 条数据
使用 ROW_NUMBER()
WITH paged AS (
    SELECT id, name,
           ROW_NUMBER() OVER (ORDER BY id) AS rownum
    FROM users
)
SELECT id, name
FROM paged
WHERE rownum BETWEEN start_row AND end_row;

4. PostgreSQL 分页

PostgreSQL 的分页查询与 MySQL 类似,使用 LIMITOFFSET 来实现分页。

语法:
SELECT column1, column2, ...
FROM table_name
ORDER BY column_name
LIMIT row_count OFFSET offset;
示例:

假设每页显示 10 条记录,想获取第 2 页的数据:

SELECT id, name
FROM users
ORDER BY id
LIMIT 10 OFFSET 10;  -- 从第 11 条记录开始,返回 10 条数据

总结:

数据库分页方式语法
MySQLLIMITOFFSETSELECT * FROM table LIMIT 10 OFFSET 10;
OracleROWNUMROW_NUMBER()SELECT * FROM (SELECT id, ROW_NUMBER()...) WHERE rownum BETWEEN 11 AND 20;
SQL ServerOFFSET-FETCHROW_NUMBER()SELECT * FROM users ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
PostgreSQLLIMITOFFSETSELECT * FROM users LIMIT 10 OFFSET 10;
参考:
  • MySQL:通过 LIMITOFFSET 控制分页,适合快速查询少量数据。
  • Oracle:使用 ROWNUMROW_NUMBER() 可以更灵活地控制分页,尤其是对复杂查询的分页处理。
  • SQL ServerOFFSET-FETCH 更加简洁,ROW_NUMBER() 提供了更多的灵活性,适合复杂的分页需求。
  • PostgreSQL:与 MySQL 相似,使用 LIMITOFFSET 来实现分页。

这些分页方法可以根据不同的业务需求进行选择。如果你在复杂查询中需要对数据进行排序或聚合,推荐使用支持窗口函数(如 ROW_NUMBER())的分页方法。


http://www.kler.cn/a/422015.html

相关文章:

  • 堆叠的简析
  • 主持人婚礼司仪知识点题库300道;大型免费题库;大风车题库
  • Linux 权限管理:用户分类、权限解读与常见问题剖析
  • 基于 MVC 架构的 SpringBoot 高校行政事务管理系统:设计优化与实现验证
  • Android 使用OpenGLES + MediaPlayer 获取视频截图
  • 【Spring】介绍一下 Spring 的 xml 标签以及 Bean 的常用配置
  • Dxf2Map:跨平台 BIM、GIS、CAD 和 AR 应用程序
  • 故障诊断 | Transformer-GRU-Adaboost组合模型的故障诊断(Matlab)
  • 语言模型测试系列【11】
  • Springfox迁移到 Springdoc OpenAPI 3
  • 基于智能语音交互的智能呼叫中心工作机制
  • C语言标准的演进与应用:C89与C99的比较
  • yolo辅助我们健身锻炼
  • WPF软件花屏的解决方法
  • 基于云模型和遗传算法的建设工程风险决策多目标优化研究
  • (译)提示词工程指南:如何写出让AI更听话的提示词(Prompt)?| 附完整示例和小学生版本
  • 安装使用Ubuntu18.04超级大全集最初版(anaconda,pycharm,代理,c/c++环境)
  • 我的创作纪念日—128天的坚持|分享|成长
  • vue+uniapp+echarts的使用(H5环境下echarts)
  • JVM 之垃圾回收器
  • 大数据量接口的异步处理方案详解
  • git lfs 上传超大文件
  • 【SpringBoot】整合篇
  • 第一部分:基础知识 4. 约束 --[MySQL轻松入门教程]
  • 深度学习——损失函数与BP算法
  • C#里怎么样快速判断一个数是否为2多少次方的数?