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 쿼리를 선택해서 사용하면 됩니다! 🚀
윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…
안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…
1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…
과적합은 머신러닝에서 학습용데이터를 과하게 학습하여, 실제데이터를 예측하지 못하는 현상을 말합니다. 인공지능(AI)의 학습 방법은 우리가 시험공부를…