您的位置:

Oracle ROWNUM 分页详解

一、ORACLE ROWNUM 简介

ROWNUM是访问数据库表中记录的一个行号,它始终是一个数字,从1开始递增。ROWNUM是在查询结果返回后给记录附加上的一个序列值,默认情况下没有INDEX。

ROWNUM被广泛应用于ORACLE数据库中,特别是在数据分页中。因为ROWNUM是在访问表记录时产生的数字,而不是以数据表所建立的任何一个索引,一定程度上主张了数据查询的灵活性。

二、ORDER BY 进行排序并返回顺序记录

由于ROWNUM是产生在数据库记录返回结果之后,所以在进行分页查询时,必须在查询语句中进行排序后才能正常返回结果。

SELECT *
FROM (
  SELECT *
  FROM TABLE_NAME
  WHERE CONDITION
  ORDER BY SORT_COLUMN ASC/DESC
)
WHERE ROWNUM BETWEEN MIN_ROW AND MAX_ROW;

在执行以上代码后,首先根据CONDITION条件查询数据表中的所有符合QUERY条件的记录,然后根据SORT_COLUMN进行排序(ASC:升序;DESC:降序),返回有序记录。最后再根据MIN_ROW和 MAX_ROW 进行数据的分页查询,以此实现数据的分页返回。

三、WHERE 进行筛选记录

在查询语句中,WHERE用于筛选记录,只有满足指定筛选条件的记录才能返回结果。

SELECT *
FROM (
  SELECT *
  FROM TABLE_NAME
  WHERE CONDITION1 AND/OR  CONDITION2 
  ORDER BY SORT_COLUMN ASC/DESC
)
WHERE ROWNUM BETWEEN MIN_ROW AND MAX_ROW;

在代码中的WHERE条件可以根据实际情况进行变化,同时也可以使用AND或OR进行多条件组合,最终以实现分页查询。

四、优化 ROWNUM 分页查询

在实际项目开发中,ROWNUM 分页查询经常与性能优化相关,最常见的是使用ROW_NUMBER() OVER()函数代替ROWNUM进行分页查询,例如:

SELECT *
FROM (
  SELECT ROW_NUMBER() OVER(ORDER BY SORT_COLUMN ASC/DESC) AS ROW_NUM, *
  FROM TABLE_NAME
  WHERE CONDITION1 AND/OR CONDITION2 
)
WHERE ROW_NUM BETWEEN MIN_ROW AND MAX_ROW; 

以上代码中,在查询FROM子句中使用ROW_NUMBER() OVER()函数,根据SORT_COLUMN列的ASC或DESC进行排序,并为每一列记录生成一行数字。在WHERE子句中,再根据ROW_NUM进行分页查询。

五、总结

今天我们对ORACLE ROWNUM 进行了详细的解释。如果你正需要使用分页查询,那么建议尽量使用ROW_NUMBER() OVER()函数代替ROWNUM进行查询,这样拥有更高的效率和更好的性能表现。同时也可以加入索引或建立排序索引,以此优化查询效率。