1. Top N 쿼리란 무엇인가?
Top N 쿼리는 특정 기준으로 정렬한 뒤 상위 N개의 데이터만 조회하는 SQL 패턴이다.
예시:
- 급여 상위 5명
- 조회수 상위 10개 게시글
- 최신 등록 데이터 3개
정렬 + 제한 조회가 핵심이다.
-- 급여 상위 5명
SELECT *
FROM EMP
ORDER BY SAL DESC;
여기서 상위 5개만 가져오는 것이 Top N 쿼리이다.
2. ROWNUM을 이용한 Top N 쿼리
1) ROWNUM의 개념
ROWNUM은 조회된 결과에 순서 번호를 붙이는 의사 컬럼이다. (Oracle 기준)
특징:
- 조회된 순서대로 번호가 붙는다
- ORDER BY 전에 ROWNUM이 먼저 부여된다 (중요)
SELECT ROWNUM, ENAME, SAL
FROM EMP;
2) 잘못된 Top N 작성 방식 (시험에 자주 나옴)
SELECT ROWNUM, ENAME, SAL
FROM EMP
WHERE ROWNUM <= 5
ORDER BY SAL DESC;
이 쿼리는 논리적으로 틀린 방식이다.
왜 틀린가? SQL 실행 순서 때문이다.
| 실행 순서 | 단계 |
| 1 | FROM |
| 2 | WHERE (ROWNUM 적용) |
| 3 | SELECT |
| 4 | ORDER BY (나중에 실행) |
먼저 5개를 뽑고 → 그 5개만 정렬됨 → 진짜 상위 5개가 아니다.
3) 올바른 ROWNUM Top N 작성법 (정석)
정렬을 먼저 수행해야 한다.
그래서 서브쿼리를 사용한다.
SELECT *
FROM (
SELECT ENAME, SAL
FROM EMP
ORDER BY SAL DESC
)
WHERE ROWNUM <= 5;
핵심 구조:
- 서브쿼리: 정렬 수행
- 메인쿼리: ROWNUM으로 상위 N 제한
이 방식이 교재에서 말하는 정석 Top N 패턴이다.
3. 윈도우 함수 기반 Top N (실무에서 더 중요)
실무에서는 ROWNUM보다 윈도우 함수를 더 많이 사용한다.
대표 함수:
- RANK()
- DENSE_RANK()
- ROW_NUMBER()
4. RANK() 함수
1) 개념
정렬 기준으로 순위를 매기는 함수이다.
동점이면 같은 순위를 부여한다.
SELECT ENAME, SAL,
RANK() OVER (ORDER BY SAL DESC) AS RANK
FROM EMP;
특징:
- 공동 1등 존재 가능
- 다음 순위가 건너뜀 (1, 1, 3)
2) RANK로 Top N 추출
SELECT *
FROM (
SELECT ENAME, SAL,
RANK() OVER (ORDER BY SAL DESC) AS RANK
FROM EMP
)
WHERE RANK <= 5;
장점: 진짜 순위 기준 Top N 가능, 동점 처리 가능
5. DENSE_RANK() 함수
1) 개념
RANK와 유사하지만 동점 이후 순위를 건너뛰지 않는다.
함수 결과 예시
| 함수 | 결과 예시 |
| RANK | 1, 1, 3 |
| DENSE_RANK | 1, 1, 2 |
SELECT ENAME, SAL,
DENSE_RANK() OVER (ORDER BY SAL DESC) AS D_RANK
FROM EMP;
2) DENSE_RANK Top N
SELECT *
FROM (
SELECT ENAME, SAL,
DENSE_RANK() OVER (ORDER BY SAL DESC) AS D_RANK
FROM EMP
)
WHERE D_RANK <= 5;
동점까지 포함한 상위 N 조회에 적합하다.
6. ROW_NUMBER() 함수 (가장 실무적)
1) 개념
무조건 고유한 순번을 부여한다.
동점이어도 순번이 다르게 나온다.
SELECT ENAME, SAL,
ROW_NUMBER() OVER (ORDER BY SAL DESC) AS RNUM
FROM EMP;
특징:
- 무조건 1, 2, 3, 4 순차 증가
- 정확히 N개만 자를 때 가장 적합
2) ROW_NUMBER Top N (실무 추천)
SELECT *
FROM (
SELECT ENAME, SAL,
ROW_NUMBER() OVER (ORDER BY SAL DESC) AS RNUM
FROM EMP
)
WHERE RNUM <= 5;
실무에서 가장 많이 쓰는 Top N 방식이다.
7. 시험 핵심 포인트
문제 핵심: Top N 쿼리 작성 시 사용 불가능한 방법은?
정답 개념: 하나의 SELECT문에서 ORDER BY + WHERE ROWNUM 동시 사용
이 방식은 틀린 방법이다.
이유:
- WHERE가 ORDER BY보다 먼저 실행됨
- 순위가 제대로 계산되지 않음
8. ROWNUM vs RANK vs ROW_NUMBER 차이 (완벽 비교)
| 함수 | 동점 처리 | 순위 건너뜀 | 실무 사용도 |
| ROWNUM | 없음 | 없음 | 낮음 (구식) |
| RANK | 동점 동일 | 건너뜀 | 중간 |
| DENSE_RANK | 동점 동일 | 안 건너뜀 | 중간 |
| ROW_NUMBER | 동점 무시 | 없음 | 매우 높음 |
9. 실무 기준 Top N 선택 전략
1) 정확히 N개만 필요할 때 → ROW_NUMBER()
ROW_NUMBER() OVER (ORDER BY 컬럼 DESC)
2) 공동 순위까지 포함할 때 → RANK() 또는 DENSE_RANK()
3) Oracle 구버전 시스템 → ROWNUM + 서브쿼리
10. 핵심 정리 (면접 / 시험 대비 요약)
- Top N 쿼리는 정렬 후 상위 N개 조회하는 패턴이다
- ROWNUM은 ORDER BY보다 먼저 적용된다 (치명적 함정)
- 올바른 ROWNUM Top N은 반드시 서브쿼리를 사용해야 한다
- 윈도우 함수 (ROW_NUMBER, RANK)가 실무 표준이다
- 단일 SELECT에서 WHERE ROWNUM + ORDER BY는 잘못된 방식이다
실무에서는 ROWNUM보다 ROW_NUMBER() 기반 Top N 쿼리가 가장 표준적이고 정확한 방식이다.
'SQLD 시험 대비' 카테고리의 다른 글
| SQLD PIVOT / UNPIVOT (0) | 2026.03.03 |
|---|---|
| SQLD 계층형 질의와 셀프 조인 (0) | 2026.03.02 |
| SQLD 윈도우 함수 (0) | 2026.02.28 |
| SQLD 고급 그룹함수 (0) | 2026.02.27 |
| SQLD 집합연산자 (0) | 2026.02.27 |