반응형
Top N 쿼리가 무엇인가요?
반응형

1) ROWNUM(오라클) — “가상 번호(슈도 컬럼)”
(1) 슈도 컬럼이란?
- 테이블에 실제로 저장된 컬럼이 아니라, DB가 실행 과정에서 임시로 만들어 주는 값입니다.
- 오라클 대표 슈도 컬럼: ROWNUM, ROWID, LEVEL, CURRVAL/NEXTVAL(시퀀스)
(2) ROWNUM 특징
- 결과가 만들어질 때 행에 1,2,3… 번호가 붙습니다.
- 그래서 “상위 몇 행”을 자를 때 쓰기 좋습니다.
(3) ROWNUM으로 Top N 하는 기본 패턴(중요)
정렬이 먼저, ROWNUM은 그 다음이어야 합니다.
그래서 보통 “정렬을 서브쿼리로 감싼 뒤” ROWNUM을 붙입니다.
예: 급여(SAL) 높은 순으로 상위 5명
SELECT ROWNUM, empno, ename, sal
FROM (
SELECT empno, ename, sal
FROM emp
ORDER BY sal DESC
)
WHERE ROWNUM <= 5;
왜 이렇게 하냐?
- ROWNUM은 “정렬 결과”에 붙어야 Top N이 정확합니다.
- 정렬 없이 ROWNUM <= 5를 먼저 걸면 “그냥 먼저 잡힌 5개”가 나올 수 있습니다.
2) TOP 절(SQL Server) — “TOP(N)으로 바로 자르기”
SQL Server는 TOP을 SELECT에 직접 씁니다.
예: 20번 부서에서 급여 높은 순 상위 3명
SELECT TOP (3) empno, ename, sal
FROM emp
WHERE deptno = 20
ORDER BY sal DESC;
포인트:
- ORDER BY가 사실상 필수입니다. (정렬 기준이 없으면 “무슨 상위인지”가 불명확)
3) ROW LIMITING(오라클 12c+ 표준 방식) — FETCH FIRST / OFFSET
오라클도 요즘은 표준 문법에 맞춘 FETCH / OFFSET을 씁니다.
(1) 상위 N개
예: 급여 높은 순 상위 5명
SELECT empno, ename, sal
FROM emp
ORDER BY sal DESC
FETCH FIRST 5 ROWS ONLY;
(2) “상위 5개 건너뛰고 다음 5개”(페이지 처리)
예: 급여 높은 순으로 6~10등(= 첫 5개 스킵 후 다음 5개)
SELECT empno, ename, sal
FROM emp
ORDER BY sal DESC
OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;
이게 딱 “페이지네이션”입니다.
- 1페이지(1~5): FETCH FIRST 5
- 2페이지(6~10): OFFSET 5 FETCH NEXT 5
- 3페이지(11~15): OFFSET 10 FETCH NEXT 5
한 줄 요약
- Oracle 구버전: 정렬을 서브쿼리로 하고 바깥에서 ROWNUM <= N
- SQL Server: SELECT TOP (N) ... ORDER BY ...
- Oracle 12c+ / 표준: ORDER BY ... FETCH FIRST N 또는 OFFSET ... FETCH NEXT ...
반응형
'sqld' 카테고리의 다른 글
| self join과 계층형질의 (0) | 2026.02.26 |
|---|---|
| PIVOT에 대해 알아보자 (0) | 2026.02.25 |
| 윈도우함수가 무엇인가? (1) | 2026.02.25 |
| 그룹함수 (0) | 2026.02.24 |
| 집합연산자 (0) | 2026.02.24 |