본문 바로가기
오라클

[오라클] ROW_NUMBER() 완벽 정리(ROWNUM과 차이)

by devlog93 2026. 1. 12.

오라클에서 데이터를 조회하다 보면 순번을 매기고 싶다는 생각을 할 것이다. 상위 N건만 가져오고 싶다 그리고 페이징 처리를 하고 싶다 같은 요구사항이 나온다. 이때 많은 사람들이 처음 접하는 것이 ROWNUM이지만 실무에서는 대부분 ROW_NUMBER() 분석 함수를 사용한다. 알아보자...!!!


1. ROW_NUMBER()란?

ROW_NUMBER()는 결과 집합에 순번을 매겨주는 분석 함수이다..!! SELECT결과에 대해 정렬된 기준을 바탕으로 1부터 순차적으로 번호를 부여한다. 기본 문법을 알아보자..!

  • OVER() 안의 ORDER BY가 핵심이다. 이 ORDER BY기준으로 순번이 결정된다..!
ROW_NUMBER() OVER(ORDER BY 컬럼명)

2. 기본적인 예

사원 급여 순으로 순번 매기기

SELECT EMPNO
     , ENAME
     , SAL
     , ROW_NUMBER() OVER(ORDER BY SAL DESC) AS ROW_NUM
  FROM EMP;

실행 결과 예시

ROW_NUM EMPNO ENAME SAL
1 7839 KING 5000
2 7788 SCOTT 3000
3 7902 FORD 3000

3. ROWNUM과의 차이

❌ ROWNUM 사용 시 흔한 실수

  • 결과가 급여 상위 3명이 아닐 수 있다. 이유는 ROWNUM은 ORDER BY보다 먼저 부여되기 때문에...!!
SELECT EMPNO
     , ENAME
     , SAL
  FROM EMP
 WHERE ROWNUM <= 3
 ORDER BY SAL DESC;

✅ ROW_NUMBER() 사용

  • 정렬 후 순번을 매기기 때문에 정확하다.
SELECT *
   FROM (
         SELECT EMPNO
              , ENAME
              , SAL
              , ROW_NUMBER() OVER(ORDER BY SAL DESC) AS ROW_NUM
           FROM EMP
         )
  WHERE ROW_NUM <= 3;

4. PARTITION BY와 함께 사용하기

PARTITION BY를 사용하면 그룹별로 순번을 다시 매길 수 있다.

부서별 급여 순위 구하기

  • 부서가 바뀔 때마다 순번이 1부터 다시 시작됨...!
SELECT EMPNO
     , ENAME
     , DEPTNO
     , SAL
     , ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS ROW_NUM
  FROM EMP;

5. 페이징 처리에서 ROW_NUMBER()

실무에서 많이 쓰이는 예제이다.

SELECT *
  FROM (
        SELECT EMPNO
             , ENAME
             , SAL
             , ROW_NUMBER() OVER(ORDER BY EMPNO) AS ROW_NUM
          FROM EMP
        )
  WHERE ROW_NUM BETWEEN 1
                AND 10;

6. ROW_NUMBER() 사용 시 주의사항

  • 반드시 OVER(ORDER BY)가 필요하다.
  • WHERE절에서 직접 사용이 불가능하다.
  • 순번은 조회 시점마다 다시 계산된다.
  • 인덱스와 직접적인 연관은 없다.

마무리

ROW_NUMBER()는 단순히 조회 결과에 번호를 붙이는 기능처럼 보이지만 실제로는 정렬을 책임진다. 오라클을 처음 접하는 단계에서는 ROWNUM과의 차이 때문에 혼동이 올 수 있다. 이 둘의 실행 순서차이를 한번 이해하면 SQL작성이 수월해질 것이다... ROW_NUMBER()는 서브쿼리 구조안에서 순번이 어떻게 매겨지는지 보이고 이후 조건 BETWEEN과 결합해도 예측이 가능하다. 실무에서는 페이징 처리, 상위 N건 조회, 최신 데이터 조회 같은 기능을 구현할 때 사용한다. PARTIOTION BY사용으로 그룹별 순번도 매기는 게 가능하니 알아두자...! 감사합니다. (_ _)