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
'데이터베이스(DB) > SQLD' 카테고리의 다른 글
[SQLD 2-2-7] SQL 활용 - PIVOT 절과 UNPIVOT 절 (33) | 2024.06.15 |
---|---|
[SQLD 2-2-6] SQL 활용 - 계층형 질의와 셀프 조인 (2) | 2024.06.14 |
[SQLD 2-2-4] SQL 활용 - 윈도우 함수 (30) | 2024.06.12 |
[SQLD 2-2-3] SQL 활용 - 그룹 함수 (37) | 2024.05.29 |
[SQLD 2-2-2] SQL 활용 - 집합 연산자 (37) | 2024.05.27 |