• Oracle的三层分页指的是在进行分页查询时,使用三种不同的方式来实现分页效果,
  • 分别是使用ROWNUM、使用OFFSETFETCH、使用ROW_NUMBER() OVER()

使用ROWNUM

  • ROWNUM是Oracle中一个伪列,它用于表示返回的行的序号。
  • 使用ROWNUM进行分页查询的方法是在SELECT语句中加入WHERE子句,并在WHERE子句中指定ROWNUM的取值范围,例如:
SELECT *
FROM (
  SELECT a.*, ROWNUM r
  FROM my_table a
  WHERE ROWNUM <= 30
)
WHERE r >= 20;
  • 上述查询语句的意思是查询my_table表中的前30条记录,然后在这30条记录中取出第20到第30条记录作为结果返回。
  • 使用ROWNUM进行分页查询的优点是简单易懂,缺点是在查询大量数据时性能较差

使用OFFSET和FETCH

  • OFFSET和FETCH是Oracle 12c引入的语法,它们可以更方便地实现分页查询。
  • 使用OFFSET和FETCH进行分页查询的方法是在SELECT语句中加入OFFSET和FETCH子句,例如:
SELECT *
FROM my_table
ORDER BY my_column
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
  • 上述查询语句的意思是对my_table表按照my_column列进行排序,然后取出从第21条记录开始的10条记录作为结果返回。
  • 使用OFFSET和FETCH进行分页查询的优点是简单方便,缺点是只有在Oracle 12c及以上版本中才能使用。

使用ROW_NUMBER() OVER()

  • ROW_NUMBER() OVER()是Oracle中一种用于计算行号的函数。
  • 使用ROW_NUMBER() OVER()进行分页查询的方法是在SELECT语句中加入ROW_NUMBER() OVER()函数,
  • 并在WHERE子句中指定ROW_NUMBER() OVER()的取值范围,例如:
SELECT *
FROM (
  SELECT a.*, ROW_NUMBER() OVER (ORDER BY my_column) r
  FROM my_table a
)
WHERE r BETWEEN 21 AND 30;
  • 上述查询语句的意思是对my_table表按照my_column列进行排序,然后取出第21到第30条记录作为结果返回。
  • 使用ROW_NUMBER() OVER()进行分页查询的优点是灵活性高,可以实现各种不同的分页方式,缺点是语法较为复杂。