Oracle SQL에서 상위 N개 데이터만 선택하는 방법 - ROWNUM과 LIMIT의 차이점

Oracle SQL에서 상위 N개 데이터만 선택하는 방법: ROWNUM과 LIMIT의 차이점

서론

데이터가 많아질수록 필요한 정보만 빠르게 조회하는 것이 중요합니다. 예를 들어, 최신 게시물 10개만 가져오거나 매출 상위 5개 제품만 조회해야 하는 경우가 있습니다. 그렇다면 오라클(Oracle) SQL에서 특정 개수만큼 데이터를 제한하는 방법은 무엇일까요?

일반적으로 MySQL이나 PostgreSQL에서는 LIMIT을 사용하여 간단하게 원하는 개수의 데이터를 가져올 수 있습니다. 하지만 오라클에서는 LIMIT을 사용할 수 없으며 대신 ROWNUM이나 FETCH FIRST N ROWS ONLY를 활용해야 합니다. 이번 글에서는 ROWNUM을 중심으로 특정 개수만큼 데이터를 조회하는 다양한 방법을 예제와 함께 설명하겠습니다.

본론

1. ROWNUM을 활용한 상위 10개 데이터 조회

ROWNUM은 오라클에서 제공하는 가상의 컬럼으로, 쿼리 결과에 대한 행 번호를 자동으로 부여합니다. 이를 활용하면 상위 N개 데이터를 쉽게 가져올 수 있습니다.

예제 1: ROWNUM을 사용하여 10개 데이터 가져오기

Sql
SELECT issue FROM ( SELECT issue FROM ym001m GROUP BY issue ORDER BY issue DESC ) WHERE ROWNUM <= 10;

설명

  1. 1

    서브쿼리로 정렬: GROUP BY issueORDER BY issue DESC로 내림차순 정렬합니다.

  1. 2

    ROWNUM <= 10 필터링: 최종적으로 상위 10개만 가져옵니다.

하지만 ROWNUM을 사용할 때 주의할 점이 있습니다. 오라클에서 ROWNUM은 데이터를 가져오는 순서대로 부여되기 때문에, ORDER BY 전에 ROWNUM을 적용하면 정렬이 올바르게 반영되지 않을 수 있습니다. 따라서 반드시 서브쿼리로 정렬을 먼저 수행한 후 ROWNUM을 적용해야 합니다.


2. ROWNUM을 사용할 때 주의해야 할 사항

ROWNUM은 실행 순서에 따라 번호를 부여하기 때문에 WHERE ROWNUM > N과 같은 조건을 사용할 수 없습니다.

예제 2: ROWNUM > 10이 동작하지 않는 경우

Sql
SELECT issue FROM ym001m WHERE ROWNUM > 10;

위 쿼리는 작동하지 않습니다. ROWNUM은 처음부터 증가하며, ROWNUM = 1인 행이 먼저 필터링됩니다. 따라서 WHERE 조건에서 ROWNUM > 10을 사용하면 결과가 나오지 않습니다. 이를 해결하려면 서브쿼리를 활용해야 합니다.

해결 방법:

Sql
SELECT issue FROM ( SELECT issue, ROWNUM AS rnum FROM ( SELECT issue FROM ym001m ORDER BY issue DESC ) ) WHERE rnum > 10;

위 방식처럼 ROWNUM을 별도로 부여한 후 필터링하면 원하는 결과를 얻을 수 있습니다.


3. FETCH FIRST N ROWS ONLY 활용하기

오라클 12c부터는 ROWNUM 대신 FETCH FIRST N ROWS ONLY를 사용할 수 있습니다.

예제 3: FETCH FIRST를 이용한 상위 10개 데이터 조회

Sql
SELECT issue FROM ym001m GROUP BY issue ORDER BY issue DESC FETCH FIRST 10 ROWS ONLY;

FETCH FIRST N ROWS ONLY의 장점

✅ 가독성이 좋고 ORDER BY와 함께 사용할 수 있습니다.

✅ 서브쿼리를 사용할 필요가 없습니다.

OFFSET과 함께 활용하면 페이징(Pagination) 기능도 쉽게 구현할 수 있습니다.

예제 4: OFFSET을 활용한 페이징

Sql
SELECT issue FROM ym001m GROUP BY issue ORDER BY issue DESC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

위 쿼리는 11번째 행부터 20번째 행까지 가져오는 페이징 처리를 수행합니다.

마치며

오라클에서 특정 개수만큼 데이터를 조회하는 방법을 알아보았습니다.

ROWNUM을 활용하면 간단하게 상위 N개 데이터를 가져올 수 있습니다.

✅ 하지만 ROWNUMORDER BY 전에 적용되지 않으므로 반드시 서브쿼리를 활용해야 합니다.

✅ 오라클 12c 이상에서는 FETCH FIRST N ROWS ONLY를 사용하면 더 직관적인 쿼리를 작성할 수 있습니다.

✅ 페이징 처리를 원한다면 OFFSETFETCH NEXT를 조합하면 쉽게 구현할 수 있습니다.

이제 여러분도 ROWNUMFETCH FIRST를 활용하여 원하는 데이터를 정확하게 가져와 보세요! 😊