본문 바로가기
데이터베이스(DB)/SQLD

[SQLD 2-2-5] SQL 활용 - Top N 쿼리

by 송기동 2024. 6. 13.
728x90

TOP N QUERY

- 페이징 처리를 효과적으로 수행하기 위해 사용

- 전체 결과에서 특정 N개 추출

예) 성적 상위자 3명

 

TOP-N 행 추출 방법

1. ROWNUM

2. RANK

3. FETCH

 

# ROWNUM

- 출력된 데이터 기준으로 행 번호 부여

- 절대적인 행 번호가 아닌 가상의 번호이므로 특정 행을 지정할 수 없음(= 연산 불가)

- 첫번째 행이 증가한 이후 할당되므로 '>' 연산 사용 불가(0 은 가능)

 

# 예) 상위 3개의 급여를 가진 직원을 선택할 시
SELECT *
FROM (
    SELECT ROWNUM, name, salary
    FROM employees
    ORDER BY salary DESC
)
WHERE ROWNUM <= 3;

결과 : 
ROWNUM	name	salary
1	Alice	7000
2	Steve	6500
3	Rachel	6200

 

ROWNUM은 정렬된 결과에 번호를 매기기 전에 번호를 할당하므로,

서브쿼리로 먼저 데이터를 정렬한 후 ROWNUM을 사용하는 것이 중요

 

# FETCH 절

- 출력될 행의 수를 제한하는 절

- ORACLE 12C 이상부터 제공(이전버전에는 ROWNUM 주로 사용)

- SQL-Server 사용 가능

- ORDER BY 절 뒤에 사용(내부 파싱 순서도 ORDER BY 뒤)

# FETCH 절 기본 구조
SELECT 컬럼
FROM 테이블
ORDER BY 컬럼
OFFSET N {ROW | ROWS}
FETCH {FIRST | NEXT} N {ROW | ROWS} ONLY;

 

 

- OFFSET : 건너뛸 행의 수

- N : 출력할 행의 수

- FETCH : 출력할 행의 수를 전달하는 구문

- FIRST : OFFSET 을 쓰지 않았을 때 처음부터 N 행 출력 명령

- NEXT : OFFSET 을 사용했을 경우 제외한 행 다음부터 N 행 출력 명령

- ROW | ROWS : 행의 수에 따라 하나일 경우 단수, 여러값이면 복수형(특별히 구분하지 않아도 됨)

 

# 예제 1: 상위 3개의 행 선택
SELECT *
FROM employees
ORDER BY salary DESC
FETCH FIRST 3 ROWS ONLY;

# 이 쿼리는 급여가 가장 높은 상위 3명의 직원 데이터를 가져옵니다.

결과 :
id	name	salary
8	Eva	7200
4	Alice	7000
5	Steve	6500

 

# 예제 2: 특정 위치부터 특정 개수의 행 선택 (페이징)
# 예를 들어, 두 번째 페이지의 데이터를 가져오려면 다음과 같이 할 수 있습니다. (페이지 크기를 3으로 가정)
SELECT *
FROM employees
ORDER BY salary DESC
OFFSET 3 ROWS
FETCH NEXT 3 ROWS ONLY;

# 이 쿼리는 급여를 기준으로 내림차순 정렬 후, 4번째 행부터 6번째 행까지의 데이터를 가져옵니다.
결과 : 
id	name	salary
6	Rachel	6200
2	Jane	6000
3	Bob	5500

 

 

 

728x90