[SQL] TOP-N 쿼리란? ROWNUM 3중 쿼리 vs OFFSET/FETCH
by 우와한개발자
[ TOP-N 쿼리 ]
- 상위 N개의 행만 조회하는 쿼리
1. 3중 쿼리와 ROWNUM 방식
- 내부쿼리(정렬) → 중간쿼리(ROWNUM 부여) → 외부쿼리(범위 필터)
SELECT * -- 외부 쿼리
FROM (
SELECT tb.*, ROWNUM rnum -- 중간쿼리
FROM (
SELECT 컬럼들 -- 내부쿼리
FROM 테이블
ORDER BY 기준컬럼 DESC
) tb
WHERE ROWNUM <= N
)
WHERE rnum >= M;
--급여 높은 순 6~10번째 조회
SELECT *
FROM (
SELECT tb.*, ROWNUM rnum
FROM (
SELECT * -- (1) 급여 높은 순으로 정렬
FROM emp
ORDER BY salary DESC
) tb
WHERE ROWNUM <= 10 -- (2) 1~10등까지만 먼저 자름
)
WHERE rnum >= 6; -- (3) 그중 6~10등만 출력
2) ROWNUM 주의사항
SELECT * FROM emp WHERE ROWNUM >= 6;
-- 아무것도 조회되지 않음
-- ROWNUM은 1부터 시작하는데, 첫 행이 ROWNUM=1이라 >= 6 조건을 절대 만나지 못하기 때문
3) ROWNUM vs RANK 비교표
| 비교 | ROWNUM | RANK() |
| 동점자 처리 | ❌ 그냥 잘림 | ✅ 포함 가능 |
| 성능 | 빠름 | 상대적으로 느림 |
| 복잡도 | 3중 쿼리 필요 | 서브쿼리 1개 |
| 사용 DB | Oracle 전용 | 대부분 DB 지원 |
2. OFFSET과 FETCH 방식
- OFFSET → 몇 개 건너뛸지
- FETCH → 몇 개 가져올지
SELECT 컬럼명
FROM 테이블명
[WHERE 조건]
[ORDER BY 정렬조건]
OFFSET n ROWS
FETCH NEXT m [PERCENT] ROWS {ONLY | WITH TIES};
| 구문 | 의미 |
| ORDER BY 정렬조건 | 정렬 기준 (❗ 필수처럼 생각) |
| OFFSET n ROWS | 앞에서 n개 행 건너뜀 |
| FETCH NEXT m ROWS | 다음 m개 행 조회 |
| PERCENT | 전체의 m% 조회 |
| ONLY | 지정한 개수만 조회 |
| WITH TIES | 마지막 값과 같은 값까지 추가 조회 |
1). DB 별 TOP-N 쿼리 방식
| DB | 방식 |
| Oracle (12c 이상) | OFFSET / FETCH, ROWNUM |
| PostgreSQL | OFFSET / FETCH |
| SQL Server | OFFSET / FETCH |
| MySQL | LIMIT |
| MariaDB | LIMIT |
--급여 높은 순 6~10번째 조회
SELECT *
FROM emp
ORDER BY salary DESC
OFFSET 5 ROWS
FETCH NEXT 5 ROWS ONLY;
--1행부터 5행까지 출력하는데 이후 행(6행~)들이5행과 같은 급여면 포함
SELECT *
FROM emp
ORDER BY salary DESC
FETCH NEXT 5 ROWS WITH TIES;
--전체의 10% 조회
SELECT *
FROM emp
ORDER BY sal DESC
FETCH NEXT 10 PERCENT ROWS ONLY;
'데이터베이스 > SQL' 카테고리의 다른 글
블로그의 정보
우와한개발자 님의 블로그
우와한개발자