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와 함께 사용될 때 성능 최적화를 고려해야 합니다.
💡 도움이 되셨다면 댓글과 공감 부탁드립니다! 😊
📌 더 많은 알고리즘 풀이와 프로그래밍 자료는 블로그에서 확인하세요!
✉️ 문의나 피드백은 댓글이나 이메일로 남겨주세요.
'자격증 > SQLD' 카테고리의 다른 글
[SQLD] 4-8: PIVOT 절과 UNPIVOT 절 (0) | 2025.02.21 |
---|---|
[SQLD] 4-7: 계층형 질의와 셀프 조인 (0) | 2025.02.21 |
[SQLD] 4-5: 윈도우 함수 (Window Functions) 와 윈도우 프레임(Window Frame) (0) | 2025.02.17 |
[SQLD] 4-4 : 그룹(소계) 함수 및 집계 연산자 (0) | 2025.02.17 |
[SQLD] 4-3: 집합 연산자 (Set Operators) (0) | 2025.02.17 |