插件窝 干货文章 分页查询sql语句Oracle

分页查询sql语句Oracle

SELECT 使用 WHERE ORDER 480    来源:    2025-04-23

Oracle 分页查询 SQL 语句

在 Oracle 数据库中实现分页查询有几种常见方法,以下是主要的实现方式:

1. 使用 ROWNUM 实现分页(Oracle 传统方式)

-- 第一页,每页10条
SELECT *
FROM (
    SELECT a.*, ROWNUM rn
    FROM (
        SELECT * FROM your_table 
        ORDER BY some_column  -- 必须有排序
    ) a
    WHERE ROWNUM <= 10  -- 页大小 × 页码
)
WHERE rn > 0;  -- 页大小 × (页码-1)

-- 第二页示例
SELECT *
FROM (
    SELECT a.*, ROWNUM rn
    FROM (
        SELECT * FROM your_table 
        ORDER BY some_column
    ) a
    WHERE ROWNUM <= 20
)
WHERE rn > 10;

2. 使用 ROW_NUMBER() 分析函数(Oracle 12c 之前版本)

SELECT *
FROM (
    SELECT t.*, 
           ROW_NUMBER() OVER (ORDER BY some_column) AS rn
    FROM your_table t
)
WHERE rn BETWEEN 11 AND 20;  -- 第二页,每页10条

3. 使用 FETCH FIRST/NEXT 语法(Oracle 12c 及以上版本)

-- 第一页,每页10条
SELECT * FROM your_table
ORDER BY some_column
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;

-- 第二页
SELECT * FROM your_table
ORDER BY some_column
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

4. 使用 RANK() 或 DENSE_RANK() 函数(适用于有相同排序值的情况)

SELECT *
FROM (
    SELECT t.*, 
           DENSE_RANK() OVER (ORDER BY some_column) AS rnk
    FROM your_table t
)
WHERE rnk BETWEEN 11 AND 20;

参数化分页查询示例(在应用程序中使用)

-- 使用绑定变量
SELECT *
FROM (
    SELECT a.*, ROWNUM rn
    FROM (
        SELECT * FROM your_table 
        ORDER BY :sort_column :sort_direction
    ) a
    WHERE ROWNUM <= :page_size * :page_number
)
WHERE rn > :page_size * (:page_number - 1);

性能优化建议

  1. 确保 ORDER BY 的列上有索引
  2. 对于大数据量分页,考虑使用物化视图或缓存中间结果
  3. 避免在分页查询中使用 SELECT *,只查询需要的列
  4. 对于深度分页(如第1000页),考虑使用其他导航方式或优化策略

选择哪种方法取决于您的 Oracle 版本和具体需求,Oracle 12c 及以上版本推荐使用 OFFSET-FETCH 语法,它更简洁且性能良好。