오라클에서 데이터를 조회하다 보면 순번을 매기고 싶다는 생각을 할 것이다. 상위 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사용으로 그룹별 순번도 매기는 게 가능하니 알아두자...! 감사합니다. (_ _)
'오라클' 카테고리의 다른 글
| [오라클] ALTER 문 완벽 정리 (0) | 2026.01.14 |
|---|---|
| [오라클] CREATE 문 완벽 정리 (0) | 2026.01.13 |
| [오라클] WITH절(Subquery Factoring) 완벽 정리 (1) | 2026.01.10 |
| [오라클] SELECT 서브쿼리 SELECT, FROM, WHERE 완벽 정리(서브쿼리, 스칼라 서브쿼리, 인라인 뷰) (0) | 2026.01.09 |
| [오라클] EXISTS와 IN 함수 차이 비교 완벽 정리 (0) | 2026.01.08 |