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개 데이터 가져오기
SELECT issue
FROM (
SELECT issue
FROM ym001m
GROUP BY issue
ORDER BY issue DESC
)
WHERE ROWNUM <= 10;
설명
- 1
서브쿼리로 정렬:
GROUP BY issue
후ORDER BY issue DESC
로 내림차순 정렬합니다.
- 2
ROWNUM <= 10
필터링: 최종적으로 상위 10개만 가져옵니다.
하지만 ROWNUM
을 사용할 때 주의할 점이 있습니다. 오라클에서 ROWNUM
은 데이터를 가져오는 순서대로 부여되기 때문에, ORDER BY 전에 ROWNUM을 적용하면 정렬이 올바르게 반영되지 않을 수 있습니다. 따라서 반드시 서브쿼리로 정렬을 먼저 수행한 후 ROWNUM
을 적용해야 합니다.
2. ROWNUM
을 사용할 때 주의해야 할 사항
ROWNUM
은 실행 순서에 따라 번호를 부여하기 때문에 WHERE ROWNUM > N
과 같은 조건을 사용할 수 없습니다.
예제 2: ROWNUM > 10
이 동작하지 않는 경우
SELECT issue
FROM ym001m
WHERE ROWNUM > 10;
위 쿼리는 작동하지 않습니다. ROWNUM
은 처음부터 증가하며, ROWNUM = 1
인 행이 먼저 필터링됩니다. 따라서 WHERE 조건에서 ROWNUM > 10
을 사용하면 결과가 나오지 않습니다. 이를 해결하려면 서브쿼리를 활용해야 합니다.
해결 방법:
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개 데이터 조회
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
을 활용한 페이징
SELECT issue
FROM ym001m
GROUP BY issue
ORDER BY issue DESC
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
위 쿼리는 11번째 행부터 20번째 행까지 가져오는 페이징 처리를 수행합니다.
마치며
오라클에서 특정 개수만큼 데이터를 조회하는 방법을 알아보았습니다.
✅ ROWNUM
을 활용하면 간단하게 상위 N개 데이터를 가져올 수 있습니다.
✅ 하지만 ROWNUM
은 ORDER BY
전에 적용되지 않으므로 반드시 서브쿼리를 활용해야 합니다.
✅ 오라클 12c 이상에서는 FETCH FIRST N ROWS ONLY
를 사용하면 더 직관적인 쿼리를 작성할 수 있습니다.
✅ 페이징 처리를 원한다면 OFFSET
과 FETCH NEXT
를 조합하면 쉽게 구현할 수 있습니다.
이제 여러분도 ROWNUM
과 FETCH FIRST
를 활용하여 원하는 데이터를 정확하게 가져와 보세요! 😊