Skip to content

面试速答(先看这里)

**一句话结论:**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() 也是更合适的选择。