✅ROWNUM 和 ROW_NUMBER() 的区别是什么?
典型回答
ROWNUM 和 ROW_NUMBER() 都是oracle中获取系统顺序分配为从查询返回的行的编号的,返回的第一行分配的是1,第二行是2,依此类推。
**ROWNUM**** 是一个伪列**,用来为查询结果中的每一行分配一个唯一的、递增的行号。** 她返回的行号是按照查询结果的顺序分配的,而不依赖于特定的排序。**它是在从数据库中提取数据时计算的,并且会在查询返回结果时就分配给每一行。
- 如果在没有使用
ORDER BY的情况下使用ROWNUM查询数据,,返回的行号是根据数据在数据库中的物理存储顺序自动分配的。 - 如果使用
ROWNUM与ORDER BY结合使用,ROWNUM只会按查询返回的顺序分配行号,而不是按排序的结果分配。
**ROW_NUMBER()**** 是一个窗口函数**,它根据指定的排序规则为查询结果集中的每一行分配一个唯一的、递增的行号。 返回的行号是按照指定的排序顺序生成的。它是在结果集返回之前计算的,并且是基于 ORDER BY 子句中指定的排序规则分配的。
ROW_NUMBER()会根据ORDER BY子句明确指定的列来分配行号,因此行号的顺序严格按照ORDER BY的顺序来。
当使用 ROWNUM 时,常常会遇到一个常见的误区:很多人会以为它是按 ORDER BY 排序后的行号进行分配,但实际 ROWNUM 是在排序前分配的,因此需要小心。
如果需要使用 ROWNUM 和 ORDER BY 配合,通常会遇到想要从一个有排序的结果中选取前 N 行的需求,正确的写法通常需要使用子查询:
SELECT * FROM (
SELECT employee_name, salary
FROM employees
ORDER BY salary DESC
)
WHERE ROWNUM <= 10;而ROW_NUMBER() 允许你根据排序规则分配唯一的行号。如果需要按照某个特定的规则来分配行号或者进行分组并排序,ROW_NUMBER() 也是更合适的选择。