본문 바로가기

[DB]DataBase/[SQL]

[SQLD] Top N 쿼리

728x90
반응형

TOP N QUERY

  • 페이징 처리를 효과적으로 수행하기 위해 사용
  • 전체 결과에서 특정 N개 추출
    • 예) 성적 상위자 3명

 

TOP-N 행 추출 방법

  1. ROWNUM
  2. RANK
  3. FETCH

ROWNUM

  • 출력 된 데이터 기준으로 행 번호 부여
  • 절대적인 행 번호가 아닌 가상의 번호이므로 특정 행을 지정할 수 없고, 연산이 불가능함
  • 첫 번째 행이 증가한 이후 할당되므로 '>' 연산 사용 불가 (0은 가능)
    • 크다 조건 전달 불가능
    • 항상 불변하는 절대적인 번호가 아니므로 '=' 연산자 단독 전달 불가능

ROWNUM 예시
ROWNUM 잘못 사용 예1

  • WHERE절에 의해 먼저 5개 추출 후 결과 집합에 대해 정렬 수행하므로 상위 5명 출력 안됨

-> 해결 방법

서브쿼리를 사용하여 (Inline view: 인라인 뷰) SAL에 대해 내림차순 정렬을 한 뒤 상위 5개를 가져옴.

즉 ROWNUM이 결정되기 전에 먼저 데이터 정렬 순서를 바꿔놓는 방법을 사용

 

ROWNUM 잘못 사용 예2

ROUWNUM 시작값(1)이 정의되지 않았으므로 1을 건너뛰고 그 다음 행 번호에 대한 추출 불가

-> 인라인 뷰에서 각 행마다의 순위를 직접 부여

서브쿼리를 통해 얻은 결과에 ROUNUM을 부여한 뒤 새로운 테이블인 것처럼 사용 (Inline view)

 

RANK

-> 윈도우 함수의 RANK 사용

 

FETCH

  • 출력될 행의 수를 제한하는 절
  • ORACLE 12C 이상부터 제공되는 기능
    • 이전 버전에는 ROWNUM을 주로 사용
  • SQL-Server 사용 가능
  • ORDER BY절 뒤에 사용
    • 내부 파싱 순서도 ORDER BY절 뒤에 수행

FETCH절 문장

  • OFFSET
    • 건너 뛸 행의 수
      • 예) 성적 높은 순 1등 제외, 나머지 3명
  • N
    • 출력할 행의 수
  • FETCH
    • 출력할 행의 수를 전달하는 구문
  • FIRST
    • OFFSET을 쓰지 않았을 때 처음부터 N 행 출력 명령
  • NEXT
    • OFFSET을 사용했을 경우 제외한 행 다음부터 N행 출력 명령
  • ROW | ROWS
    • 행의 수에 따라 하나일 경우 단수형/여러 값이면 복수형 (특별히 구분하지 않아도 됨)

EMP에서 SAL 순서대로 상위 5명 출력
EMP 테이블에서 급여가 높은 순서대로 4~6번째 해당하는 직원 정보 출력

 

반응형

'[DB]DataBase > [SQL]' 카테고리의 다른 글

[SQLD] PIVOT 절과 UNPIVOT 절  (0) 2024.05.20
[SQLD] 계층형 질의와 셀프 조인  (0) 2024.05.19
[SQLD] 윈도우 함수  (0) 2024.05.16
[SQLD] 그룹 함수  (0) 2024.05.09
[SQLD] 집합 연산자  (0) 2024.05.06