본문 바로가기
스터디/SQL

[정리노트] 데이터분석 IT자격증 SQLD 2024년 개정판 - TOP N QUERY

by 견습생L 2024. 8. 27.

[정리노트] 데이터분석 IT자격증 SQLD 2024년 개정판 - TOP N QUERY


TOP N QUERY

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

TOP-N 행 추출 방

  1. ROWNUM
  2. RANK
  3. FETCH

ROWNUM

  • 출력된 데이터 기준으로 행 번호 부여
  • 절대적인 행 번호가 아닌 가상의 번호이므로 특정 행을 지정할 수 없음(=연산 불가)
  • 첫 번째 행이 증가한 이후 할당되므로 ‘>’ 연산 사용 불가 (0은 가능) ← >= 또는 <= 사용 가능

 ex) ROWNUM을 출력 형태

SELECT ROWNUM, EMP.*
  FROM EMP
 WHERE SAL >= 1500;

ex) ORDER BY를 사용한 예 

SELECT *
  FROM (SELECT *
            FROM EMP
           ORDER BY SAL DESC)
 WHERE ROWNUM <= 5
 ORDER BY SAL DESC;

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

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

SELECT *
  FROM (SELECT ROWNUM AS RN, A.*
          FROM (SELECT *
                  FROM EMP
                 ORDER BY SAL DESC) A) B
 WHERE RN BETWEEN 4 AND 6
 ORDER BY SAL DESC;

→ 서브쿼리를 통해 얻은 결과에 ROWNUM을 다시 부여하여 새로운 테이블인 것처럼 사용(인라인 뷰)

** 윈도우 함수 RANK 사용

SELECT *
	FROM (SELECT EMP.*,
            RANK() OVER(ORDER BY SAL DESC) AS RN
            FROM EMP) A
 WHERE RN BETWEEN 4 AND 6
 ORDER BY SAL DESC;


FETCH 절

  • 출력될 행의 수를 제한하는 절
  • Oracle 12C 이상부터 제공(이전버전에는 ROWNUM 주로 사용)
  • SQL Server 사용 가능
  • ORDER BY 절 뒤에 사용 (내부 파싱 순서도 ORDER BY 뒤)
  • 문법
SELECT
	FROM
 WHERE
 GROUP BY
HAVING
 ORDER BY
OFFSET N { ROW | ROWS }
 FETCH { FIRST | NEST } N { ROW | ROWS } ONLY
  • OFFSET: 건너뛸 행의 수 ex) 성적 높은 순 1등 제외, 나머지 3명
  • N: 출력할 행의 수
  • FETCH: 출력할 행의 수를 전달하는 구문
  • FIRST : OFFSET을 쓰지 않았을 때 처음부터 N 행 출력 명령
  • NEXT : OFFSET을 사용했을 경우 제외한 행 다음부터 N행 출력 명령
  • ROW | ROWS : 행의 수에 따라 하나일 경우 단수, 여러 값이면 복수형(특별히 구분하지 않아도 됨)

ex) EMP에서 SAL 순서대로 상위 5명 (19C 에서 실행)

SELECT EMPNO, ENAME, JOB, SAL
	FROM EMP
 ORDER BY SAL DESC FETCH FIRST 5 ROWS ONLY;

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

SELECT EMPNO, ENAME, JOB, SAL
	FROM EMP
 ORDER BY SAL DESC
OFFSET 3 ROW
 FETCH FIRST 2 ROW ONLY;
  • 출력될 행의 수를 제한하는 절
  • Oracle 12C 이상부터 제공(이전버전에는 ROWNUM 주로 사용)
  • SQL Server 사용 가능
  • ORDER BY 절 뒤에 사용 (내부 파싱 순서도 ORDER BY 뒤)
  • 문법
SELECT
	FROM
 WHERE
 GROUP BY
HAVING
 ORDER BY
OFFSET N { ROW | ROWS }
 FETCH { FIRST | NEST } N { ROW | ROWS } ONLY
  • OFFSET: 건너뛸 행의 수 ex) 성적 높은순 1등 제외, 나머지 3명
  • N: 출력할 행의 수
  • FETCH: 출력할 행의 수를 전달하는 구문
  • FIRST : OFFSET을 쓰지 않았을 때 처음부터 N 행 출력 명령
  • NEXT : OFFSET을 사용했을 경우 제외한 행 다음부터 N행 출력 명령
  • ROW | ROWS : 행의 수에 따라 하나일 경우 단수, 여러 값이면 복수형(특별히 구분하지 않아도 됨)

ex) EMP에서 SAL 순서대로 상위 5명 (19C 에서 실행)

SELECT EMPNO, ENAME, JOB, SAL
	FROM EMP
 ORDER BY SAL DESC FETCH FIRST 5 ROWS ONLY;

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

SELECT EMPNO, ENAME, JOB, SAL
	FROM EMP
 ORDER BY SAL DESC
OFFSET 3 ROW
 FETCH FIRST 2 ROW ONLY;

 

반응형