---
title: "分页查询 - OceanBase 数据库 V4.6.0 | OceanBase 文档中心"
description: 分页查询 本文将向您介绍如何在 OceanBase 数据库 Oracle 模式下进行分页查询操作。 前提条件 您已连接 OceanBase 数据库 Oracle 模式租户。更多有关连接数据库的操作信息，请参见 连接方式概述 。 您已拥有 SELECT 权限。更多查看当前用户权限的相关操作信息，请参见 查看用户权限 。…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.6.0

# 分页查询

更新时间：2026-07-15 15:27:38

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.6.0/zh-CN/300.develop/200.application-development-of-oracle-mode/500.read-data-of-oracle-mode/600.pagination-query-of-oracle-mode.md)  

本文将向您介绍如何在 OceanBase 数据库 Oracle 模式下进行分页查询操作。

## 前提条件

- 您已连接 OceanBase 数据库 Oracle 模式租户。更多有关连接数据库的操作信息，请参见 [连接方式概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005682578)。
 - 您已拥有 `SELECT` 权限。更多查看当前用户权限的相关操作信息，请参见 [查看用户权限](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685761)。如果不具备该权限，请联系管理员为您授权，有关用户授权的相关操作信息，请参见 [直接授予权限](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685760)。

## 概述

在 OceanBase 数据库 Oracle 模式下，您可以使用 `Row_Limiting_Clause` 来实现分页查询。`Row_Limiting_Clause` 用于限制 `SELECT` 查询返回的行数，常用于分页操作。

`Row_Limiting_Clause` 的语法结构如下：

```sql
[ OFFSET offset { ROW | ROWS } ]
[ FETCH { FIRST | NEXT } [ { rowcount | percent PERCENT } ]
    { ROW | ROWS } { ONLY | WITH TIES } ]

```

**参数说明：**

| 参数 | 说明 |
| --- | --- |
| OFFSET offset | 指定要跳过的行数。`offset` 必须是一个非负整数。 |
| ROW \| ROWS | `ROW` 和 `ROWS` 是同义词，可以互换使用。 |
| FETCH | 指定要返回的行数或百分比。 |
| FIRST \| NEXT | `FIRST` 和 `NEXT` 是同义词，可以互换使用。 |
| rowcount | 要返回的行数，必须是一个正整数。使用方式：`FETCH FIRST rowcount ROWS ONLY`。 |
| percent PERCENT | 要返回的行数百分比。`percent` 是百分比数值参数，`PERCENT` 是关键字。使用方式：`FETCH FIRST percent PERCENT ROWS ONLY`。 |
| ONLY | 只返回指定的行数，不包含并列的行。 |
| WITH TIES | 返回指定的行数，如果最后一行有并列值，则包含所有并列的行。 |

#### 注意

**分页查询必须使用 `ORDER BY` 子句**，这是 Oracle 数据库的标准规范。如果不使用 `ORDER BY`，分页查询的结果顺序是不确定的，可能导致不同查询返回不同的结果，出现数据重复或遗漏的问题。

## 创建测试表并添加测试数据

1. 创建表 `employee_info`。

   ```sql
   CREATE TABLE employee_info(
       employee_id NUMBER(10,0),
       employee_name VARCHAR2(50),
       department_id NUMBER(10,0),
       salary NUMBER(10,2),
       hire_date DATE,
       CONSTRAINT pk_employee PRIMARY KEY(employee_id)
   );

   ```
 2. 向表 `employee_info` 中插入测试数据。

   ```sql
   INSERT INTO employee_info VALUES
   (1001,'Smith',10,8000.00,DATE'2020-01-15'),
   (1002,'Allen',20,9500.00,DATE'2019-03-20'),
   (1003,'Jones',10,12000.00,DATE'2018-06-10'),
   (1004,'Blake',30,7500.00,DATE'2021-02-28'),
   (1005,'Scott',20,11000.00,DATE'2019-11-05'),
   (1006,'Ford',10,9000.00,DATE'2020-08-12'),
   (1007,'King',30,8500.00,DATE'2020-05-18'),
   (1008,'Turner',20,10000.00,DATE'2019-09-25'),
   (1009,'Adams',10,10500.00,DATE'2020-12-01'),
   (1010,'Miller',30,9200.00,DATE'2021-01-10');

   ```

## 使用 ORDER BY 分页

**分页查询必须使用 `ORDER BY` 子句**。如果不使用 `ORDER BY`，数据库不保证查询结果的顺序，可能导致：

- 不同时间执行相同查询返回不同的结果顺序
 - 分页查询出现数据重复或遗漏
 - 分页结果不稳定，影响用户体验

```sql
SELECT employee_id, employee_name, department_id, salary
FROM employee_info
ORDER BY employee_id
OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;

```

## 使用唯一字段排序

**您必须使用唯一字段（如主键）进行排序**，以确保分页结果的唯一性和稳定性。

如果 `ORDER BY` 使用的字段不是唯一的，对于具有相同排序值的行，它们的顺序是不确定的，可能导致分页查询时出现数据重复或遗漏。例如，如果按 `department_id` 排序，多个员工在同一个部门时，这些员工的相对顺序是任意的。

```sql
SELECT employee_id, employee_name, department_id, salary
FROM employee_info
ORDER BY department_id, employee_id
OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;

```

#### 注意

如果必须按非唯一字段排序，您要在 `ORDER BY` 子句中添加唯一字段作为次要排序条件。例如：`ORDER BY department_id, employee_id`，这样可以确保排序结果的唯一性和稳定性。

## 使用 FETCH 限制返回行数

查询前 3 条员工信息。

```sql
SELECT employee_id, employee_name, department_id, salary
FROM employee_info
ORDER BY employee_id
FETCH FIRST 3 ROWS ONLY;

```

## 使用 OFFSET 跳过指定行数

查询从第 4 行开始的所有员工信息。

```sql
SELECT employee_id, employee_name, department_id, salary
FROM employee_info
ORDER BY employee_id
OFFSET 3 ROWS;

```

## 使用 OFFSET 和 FETCH 实现分页

你可以使用 `OFFSET` 和 `FETCH` 实现分页查询。

查询第 2 页数据（每页 3 条）：

```sql
SELECT employee_id, employee_name, department_id, salary
FROM employee_info
ORDER BY employee_id
OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY;

```

## 使用百分比分页

除了使用固定行数进行分页外，您还可以使用 `PERCENT` 关键字按百分比返回数据。

### 查询前 30% 的数据

```sql
SELECT employee_id, employee_name, department_id, salary
FROM employee_info
ORDER BY salary
FETCH FIRST 30 PERCENT ROWS ONLY;

```

### 使用 WITH TIES 包含并列行

`WITH TIES` 选项会在返回指定行数的同时，如果最后一行有并列值，则包含所有并列的行。

```sql
SELECT employee_id, employee_name, department_id, salary
FROM employee_info
ORDER BY salary
FETCH FIRST 3 ROWS WITH TIES;

```

## 使用 ROWNUM 进行分页

在 Oracle 模式中，您也可以使用 `ROWNUM` 伪列进行分页查询，但这种方式相对复杂，需要配合子查询使用。建议您优先使用 `Row_Limiting_Clause` 进行分页查询，语法更简洁清晰。

### 使用 ROWNUM 查询前 N 条数据

查询前 3 条员工信息。

```sql
SELECT employee_id, employee_name, department_id, salary
FROM employee_info
WHERE ROWNUM <= 3
ORDER BY employee_id;

```

### 使用 ROWNUM 实现分页查询

使用 `ROWNUM` 实现分页查询需要配合子查询。查询第 2 页（每页 3 条）的数据。

```sql
SELECT * FROM (
    SELECT employee_id, employee_name, department_id, salary, ROWNUM rn
    FROM (
        SELECT employee_id, employee_name, department_id, salary
        FROM employee_info
        ORDER BY employee_id
    )
    WHERE ROWNUM <= 6
)
WHERE rn > 3;

```

#### 注意

使用 `ROWNUM` 进行分页查询时， `ROWNUM` 是在数据返回后才分配的，您不能直接在 `WHERE` 子句中使用 `ROWNUM > N` 条件。因此，您要使用子查询来实现分页。

## 相关文档

- 更多有关 `SELECT` 语法的信息，请参见 [SIMPLE SELECT](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005688259)。
 - 更多有关单表查询的详细信息，请参见 [单表查询](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005682569)。
 - 更多有关查询优化的详细信息，请参见 [查询改写概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005686946)。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
