TOP N 쿼리는 주어진 조건에 따라 상위 N개의 행(Row)만 조회하는 SQL 쿼리를 의미합니다.
예를 들어, 급여가 가장 높은 직원 5명을 조회하거나, 가장 많이 판매된 상품 10개를 조회하는 경우가 이에 해당합니다.
FETCH FIRST N ROWS ONLY 사용 (권장)Oracle 12c부터는 SQL 표준인 FETCH FIRST N ROWS ONLY 구문을 지원하여 간단하게 TOP N 쿼리를 작성할 수 있습니다.
SELECT *
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS ONLY; ✅ ORDER BY salary DESC를 사용하여 급여가 높은 순서대로 정렬한 후, 상위 5개 행만 가져옵니다.
윈도우 함수 기능이 점점 좋아지고 12C부터는 Row Limiting도 지원 하지만, 인덱스 활용이 중요한 온라인성 쿼리에서 ‘Top N Stopkey’ 알고리즘이 잘 동작하지 않는 경우가 있어서 실행계획을 잘 보고 사용해야한다.
ROWNUM 사용Oracle 11g 이하에서는 ROWNUM을 사용하여 상위 N개 행을 제한할 수 있습니다.
단, ORDER BY보다 ROWNUM이 먼저 적용되므로 서브쿼리가 필요합니다.
SELECT *
FROM (
SELECT *
FROM employees
ORDER BY salary DESC
)
WHERE ROWNUM <= 5; ✅ 서브쿼리를 사용하여 정렬된 후 ROWNUM을 적용해야 합니다.
ROW_NUMBER() 사용 (정확한 방식, 권장)ROW_NUMBER() 함수는 정렬된 데이터를 기준으로 각 행에 고유한 순번을 부여하므로, 정확한 TOP N 결과를 얻을 수 있습니다.
SELECT *
FROM (
SELECT employees.*, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
FROM employees
)
WHERE rn <= 5; ✅ ROW_NUMBER()를 사용하면 중복 값이 있어도 정확한 상위 N개 데이터를 가져올 수 있습니다.
RANK() 또는 DENSE_RANK() 사용 (동점 포함)만약 급여가 같은 경우에도 동일한 순위를 부여하고 싶다면 RANK()나 DENSE_RANK()를 사용할 수 있습니다.
SELECT *
FROM (
SELECT employees.*, RANK() OVER (ORDER BY salary DESC) AS rank_num
FROM employees
)
WHERE rank_num <= 5; ✅ RANK()는 동점자가 있을 경우 순위를 건너뛰며, DENSE_RANK()는 순위를 연속적으로 부여합니다.
만약 상위 10~20위 데이터만 가져오고 싶다면, OFFSET ... FETCH를 사용할 수 있습니다.
SELECT *
FROM employees
ORDER BY salary DESC
OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY; ✅ OFFSET 5 ROWS로 처음 5개 행을 건너뛰고, FETCH NEXT 5 ROWS ONLY로 그다음 5개 행을 가져옵니다.
➡ 페이징 처리(Pagination)에 유용
| 방법 | 지원 버전 | 장점 | 단점 |
|---|---|---|---|
FETCH FIRST N ROWS ONLY | Oracle 12c 이상 | 간결하고 빠름 | Oracle 11g 이하에서는 사용 불가 |
ROWNUM | 모든 버전 | 간단함 | 정확한 정렬을 위해 서브쿼리 필요 |
ROW_NUMBER() | 모든 버전 | 정확한 순번 부여 | 성능이 다소 느릴 수 있음 |
RANK() | 모든 버전 | 동점자를 포함한 순위 지정 가능 | 동일 순위 이후 건너뜀 |
DENSE_RANK() | 모든 버전 | 동점자를 포함하면서 순위 건너뛰지 않음 | 일반적인 TOP N 쿼리보다 다소 복잡 |
✅ Oracle 12c 이상 → FETCH FIRST N ROWS ONLY 사용
✅ Oracle 11g 이하 → ROW_NUMBER() 사용 (정확한 순위 필요)
✅ 동점자를 고려해야 한다면? → RANK() 또는 DENSE_RANK() 사용
이제 상황에 맞는 TOP N 쿼리를 선택해서 사용하면 됩니다! 🚀
1. 타입스크립트 개요 타입스크립트(TypeScript)는 마이크로소프트(Microsoft)가 개발한 자바스크립트(JavaScript)의 상위 집합(Superset) 언어입니다.즉, 자바스크립트에 정적 타입(Static Type)을 추가하고,…
윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…
안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…
1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…