主题
面试速答(先看这里)
**一句话结论:**ROWNUM 和 ROW_NUMBER() 都是oracle中获取系统顺序分配为从查询返回的行的编号的,返回的第一行分配的是1,第二行是2,依此类推。
60秒标准回答:
ROWNUM 和 ROW_NUMBER() 都是oracle中获取系统顺序分配为从查询返回的行的编号的,返回的第一行分配的是1,第二行是2,依此类推
ROWNUM 是一个伪列 ,用来为查询结果中的每一行分配一个唯一的、递增的行号。 她返回的行号是按照查询结果的顺序分配的,而不依赖于特定的排序。 它是在从数据库中提取数据时计算的,并且会在查询返回结果时就分配给每一行
ROW_NUMBER() 是一个窗口函数 ,它根据指定的排序规则为查询结果集中的每一行分配一个唯一的、递增的行号。 返回的行号是按照指定的排序顺序生成的 。它是在结果集返回之前计算的,并且是基于 ORDER BY 子句中指定的排序规则分配的
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**ROWNUM 是一个伪列 ,用来为查询结果中的每一行分配一个唯一的、递增的行号。
- **要点2:**ROW_NUMBER() 是一个窗口函数 ,它根据指定的排序规则为查询结果集中的每一行分配一个唯一的、递增的行号。
- **要点3:**当使用 ROWNUM 时,常常会遇到一个常见的误区:很多人会以为它是按 ORDER BY 排序后的行号进行分配,但实际 ROWNUM 是在排序前分配的,因此需要小心。
- **要点4:**如果需要使用 ROWNUM 和 ORDER BY 配合,通常会遇到想要从一个有排序的结果中选取前 N 行的需求,正确的写法通常需要使用子查询:
- **要点5:**而 ROW_NUMBER() 允许你根据排序规则分配唯一的行号。
**记忆锚点:**ROWNUM → ORDER → ROW_NUMBER → ROW_NUMBER() → oracle → 依此类
易错提醒:
- 当使用 ROWNUM 时,常常会遇到一个常见的误区:很多人会以为它是按 ORDER BY 排序后的行号进行分配,但实际 ROWNUM 是在排序前分配的,因此需要小心。
加分表达:
- 如果在没有使用 ORDER BY 的情况下使用 ROWNUM 查询数据,,返回的行号是根据数据在数据库中的物理存储顺序自动分配的。
- 如果使用 ROWNUM 与 ORDER BY 结合使用, ROWNUM 只会按查询返回的顺序分配行号,而不是按排序的结果分配。
- 如果需要使用 ROWNUM 和 ORDER BY 配合,通常会遇到想要从一个有排序的结果中选取前 N 行的需求,正确的写法通常需要使用子查询: 而 ROW_NUMBER() 允许你根据排序规则分配唯一的行号。
追问准备:
- 围绕「ROWNUM」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「ORDER」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「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 行的需求,正确的写法通常需要使用子查询:
plain
SELECT * FROM (
SELECT employee_name, salary
FROM employees
ORDER BY salary DESC
)
WHERE ROWNUM <= 10;而ROW_NUMBER() 允许你根据排序规则分配唯一的行号。如果需要按照某个特定的规则来分配行号或者进行分组并排序,ROW_NUMBER() 也是更合适的选择。