在Oracle数据库中,rownum和row_number()都是用于对查询结果集进行行计数和排序的函数,但它们在实现和用法上有着很大的不同。接下来我将为您详细讲解它们的使用方法和区别,并附带两个示例说明。
ROWNUM函数
ROWNUM是Oracle的一个伪列,可以用来表示查询结果集中的行号。其运作原理是对于查询结果集中的第一行返回1,第二行返回2,以此类推。 ROWNUM在数据记录被输出前先把所有记录的ROWNUM编号分配好,而不是在输出时再进行计算。
ROWNUM的基本用法
SELECT *
FROM table
WHERE ROWNUM <= 10
上述SQL语句表示从表table中查询出前10条记录,其中ROWNUM是行号,行号从1开始,直到查询结果集的最后一行。
ROWNUM的限制
因为ROWNUM在数据记录输出前就将所有记录的ROWNUM编号分配好,所以它不能对结果集进行排序,在使用分页查询时还需要注意一下偏移量。
示例1:
SELECT *
FROM (
SELECT A.*, ROWNUM RN
FROM (
SELECT *
FROM employees
ORDER BY salary DESC
) A
WHERE ROWNUM <= 10
)
WHERE RN >= 6;
上述SQL语句表示从employees表中查询前10条数据,按照salary字段的降序排序,并返回第6条记录到第10条记录。需要注意的是,查询使用了ROWNUM来限制返回记录的数量,因此SQL语句将内层排序结果赋予ROWNUM分配行号之后再进行条件限制,以保证外层语句查询结果从第6条开始输出。
ROW_NUMBER()函数
ROW_NUMBER()函数也是用于对查询结果集进行排序和分页的函数,它是一个窗口函数。WINDOW FUNCTION关键字是2003ANSI标准的关键字,但是Oracle的窗口函数的实现比较尴尬要写很多的语法,所以Oracle 8.1.6这个版本中就将它们作为扩展的SELECT语句的标准扩展正式引入,Window function就成为了Oracle 8i之后的一个函数。
ROW_NUMBER()函数的基本用法
SELECT ROW_NUMBER() OVER (ORDER BY column_1 DESC)
FROM Table
上述SQL语句表示对Table表中的记录按照column_1字段进行降序排序,并对排序结果进行编号,从1开始。
ROW_NUMBER()函数的限制
ROW_NUMBER()函数的计算是在数据被输出前进行的,而ROWNUM是在数据输出后才进行计算的,因此ROW_NUMBER()可以用于排序和分组统计查询,而ROWNUM则不能。
示例2:
SELECT *
FROM (
SELECT A.*, ROW_NUMBER() OVER (ORDER BY salary DESC) RN
FROM employees A
)
WHERE RN BETWEEN 6 AND 10;
上述SQL语句表示从employees表中查询前10条数据,在查询结果集上按照salary字段进行降序排序,并返回第6条记录到第10条记录。需要注意的是,查询使用了ROW_NUMBER()函数进行排序并赋予每一行一个编号,以保证外层语句查询结果从第6条开始输出。
综上所述,ROWNUM和ROW_NUMBER()这两个函数在Oracle数据库中有着不同的应用场景和使用方法。在使用时需要根据具体场景选择正确的函数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:oracle中rownum和row_number() - Python技术站