본문 바로가기
자격증/SQLD

[SQLD] 4-6: Top N 쿼리 (Top N Query)

by rnasterofmysea 2025. 2. 21.
728x90
반응형

SQLD Chapter 4-6: Top N 쿼리 (Top N Query)


1. Top N 쿼리란?

Top N 쿼리는 데이터에서 상위 또는 하위 N개의 행을 조회하는 방법을 의미합니다. 일반적으로 가장 높은 급여를 받는 직원, 가장 많이 판매된 제품, 최근 주문된 항목 등을 찾을 때 사용됩니다.

각 데이터베이스 관리 시스템(DBMS)마다 Top N을 구현하는 방식이 다릅니다.

1.1 주요 DBMS별 Top N 쿼리 방식

Oracle FETCH FIRST N ROWS ONLY, ROWNUM, ROW_NUMBER()
MySQL LIMIT
PostgreSQL LIMIT, FETCH FIRST N ROWS ONLY
SQL Server TOP

 

 


2. DBMS별 Top N 쿼리 작성법

EMPLOYEES 테이블 (예제 데이터)

EMPLOYEE_ID  EMPLOYEE_NAME  DEPARTMENT_ID  SALARY
1 홍길동 10 6000
2 김철수 10 5000
3 이영희 20 7000
4 박민수 20 8000
5 최민호 20 7000

2.1 Oracle: FETCH FIRST N ROWS ONLY (추천 방식)

SELECT EMPLOYEE_NAME, SALARY
FROM EMPLOYEES
ORDER BY SALARY DESC
FETCH FIRST 3 ROWS ONLY;

결과

EMPLOYEE_NAME  SALARY
박민수 8000
이영희 7000
최민호 7000

설명: ORDER BY로 정렬 후 상위 3개 행만 반환


2.2 Oracle: ROWNUM 활용 (구버전 방식)

SELECT EMPLOYEE_NAME, SALARY
FROM EMPLOYEES
WHERE ROWNUM <= 3
ORDER BY SALARY DESC;

🚨 주의: ORDER BY보다 ROWNUM이 먼저 적용되어 예상한 결과가 나오지 않을 수 있음

 

정확한 결과를 얻으려면 서브쿼리 사용

SELECT * FROM (
    SELECT EMPLOYEE_NAME, SALARY
    FROM EMPLOYEES
    ORDER BY SALARY DESC
)
WHERE ROWNUM <= 3;

2.3 MySQL & PostgreSQL: LIMIT 사용

SELECT EMPLOYEE_NAME, SALARY
FROM EMPLOYEES
ORDER BY SALARY DESC
LIMIT 3;

설명: LIMIT N을 사용하여 상위 N개 행만 조회


2.4 SQL Server: TOP 사용

SELECT TOP 3 EMPLOYEE_NAME, SALARY
FROM EMPLOYEES
ORDER BY SALARY DESC;

설명: TOP N을 사용하여 상위 N개 행을 반환

 

 

📌 WITH TIES 옵션 (SQL Server)

WITH TIES는 TOP N을 사용할 때, N번째 행과 동일한 값을 가진 추가 행도 포함하는 옵션이다.

SELECT TOP 5 * 
FROM employees 
ORDER BY salary DESC WITH TIES;
  • 상위 5개 행을 가져오되, 5번째 행과 동일한 salary 값을 가진 행도 함께 포함됨.

 

3. Top N과 PARTITION BY 활용 (부서별 상위 N명 조회)

ROW_NUMBER() 또는 RANK()를 사용하면 각 부서별로 상위 N명을 조회할 수 있습니다.

 

EMPLOYEES 테이블 (예제 데이터)

EMPLOYEE_ID  EMPLOYEE_NAME  DEPARTMENT_ID  SALARY
1 홍길동 10 6000
2 김철수 10 5000
3 이영희 20 7000
4 박민수 20 8000
5 최민호 20 7000

 

3.1 Oracle, SQL Server: ROW_NUMBER() 활용

SELECT EMPLOYEE_NAME, DEPARTMENT_ID, SALARY
FROM (
    SELECT EMPLOYEE_NAME, DEPARTMENT_ID, SALARY,
           ROW_NUMBER() OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC) AS RANKING
    FROM EMPLOYEES
)
WHERE RANKING <= 2;

 

결과 (부서별 상위 2명)

EMPLOYEE_NAME  DEPARTMENT_ID  SALARY
홍길동 10 6000
김철수 10 5000
박민수 20 8000
이영희 20 7000

설명:

  • PARTITION BY DEPARTMENT_ID → 부서별 그룹화
  • ORDER BY SALARY DESC → 급여 순 정렬
  • ROW_NUMBER() <= 2 → 각 부서별 상위 2명만 선택

4. 성능 최적화 및 주의사항

4.1 인덱스 활용

  • ORDER BY가 포함된 Top N 쿼리는 인덱스를 활용하면 성능을 최적화할 수 있음
  • SALARY DESC 정렬 시 SALARY 컬럼에 인덱스(INDEX) 설정 권장

4.2 대용량 데이터 최적화

  • MySQL의 LIMIT을 사용할 경우 OFFSET이 클수록 성능 저하 가능
  • SQL Server에서는 TOP N WITH TIES를 사용하여 동순위 포함 가능
SELECT TOP 3 WITH TIES EMPLOYEE_NAME, SALARY
FROM EMPLOYEES
ORDER BY SALARY DESC;

설명: 동순위(같은 급여)를 포함하여 상위 N명 조회


5. ORDER SIBLINGS BY (계층형 데이터 정렬)

ORDER SIBLINGS BY는 계층형 데이터를 정렬할 때 사용합니다. ORDER BY와 다르게 특정 계층 구조 내에서만 정렬됩니다.

예제: 계층형 데이터 정렬

SELECT EMPLOYEE_ID, EMPLOYEE_NAME, MANAGER_ID, SALARY
FROM EMPLOYEES
START WITH MANAGER_ID IS NULL
CONNECT BY PRIOR EMPLOYEE_ID = MANAGER_ID
ORDER SIBLINGS BY SALARY DESC;

설명:

  • CONNECT BY PRIOR EMPLOYEE_ID = MANAGER_ID → 계층적 관계 정의
  • START WITH MANAGER_ID IS NULL → 최상위 관리자부터 시작
  • ORDER SIBLINGS BY SALARY DESC → 같은 계층 내에서 SALARY 기준으로 정렬

🚀 기존 ORDER BY와 차이점

  • ORDER BY는 전체 행을 기준으로 정렬
  • ORDER SIBLINGS BY는 동일한 부모(계층) 내에서만 정렬

6. 성능 최적화 및 주의사항

6.1 인덱스 활용

  • ORDER BY가 포함된 Top N 쿼리는 인덱스를 활용하면 성능을 최적화할 수 있음
  • SALARY DESC 정렬 시 SALARY 컬럼에 INDEX 설정 권장

6.2 대용량 데이터 최적화

  • MySQL의 LIMIT을 사용할 경우 OFFSET이 클수록 성능 저하 가능
  • SQL Server에서는 TOP N WITH TIES를 사용하여 동순위 포함 가능
SELECT TOP 3 WITH TIES EMPLOYEE_NAME, SALARY
FROM EMPLOYEES
ORDER BY SALARY DESC;

설명: 동순위(같은 급여)를 포함하여 상위 N명 조회


7. 마무리

이번 장에서는 각 DBMS별 Top N 쿼리 (LIMIT, FETCH FIRST, ROWNUM, TOP)와 부서별 상위 N명 조회하는 방법, 그리고 계층형 데이터 정렬을 위한 ORDER SIBLINGS BY를 학습했습니다.

📌 Top N 쿼리는 순위별 데이터 조회 시 필수적인 기능이며, ORDER BY와 함께 사용될 때 성능 최적화를 고려해야 합니다.

💡 도움이 되셨다면 댓글과 공감 부탁드립니다! 😊
📌 더 많은 알고리즘 풀이와 프로그래밍 자료는 블로그에서 확인하세요!
✉️ 문의나 피드백은 댓글이나 이메일로 남겨주세요.

 
 
 
728x90
반응형