SQLD 시험 대비

SQLD Top N 쿼리

_김영인 2026. 3. 1. 22:55

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;

 

핵심 구조:

  1. 서브쿼리: 정렬 수행
  2. 메인쿼리: 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