우와한 개발자

[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;

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기