728x90
반응형
TOP N QUERY
- 페이징 처리를 효과적으로 수행하기 위해 사용
- 전체 결과에서 특정 N개 추출
- 예) 성적 상위자 3명
TOP-N 행 추출 방법
- ROWNUM
- RANK
- FETCH
ROWNUM
- 출력 된 데이터 기준으로 행 번호 부여
- 절대적인 행 번호가 아닌 가상의 번호이므로 특정 행을 지정할 수 없고, 연산이 불가능함
- 첫 번째 행이 증가한 이후 할당되므로 '>' 연산 사용 불가 (0은 가능)
- 크다 조건 전달 불가능
- 항상 불변하는 절대적인 번호가 아니므로 '=' 연산자 단독 전달 불가능
- WHERE절에 의해 먼저 5개 추출 후 결과 집합에 대해 정렬 수행하므로 상위 5명 출력 안됨
-> 해결 방법
서브쿼리를 사용하여 (Inline view: 인라인 뷰) SAL에 대해 내림차순 정렬을 한 뒤 상위 5개를 가져옴.
즉 ROWNUM이 결정되기 전에 먼저 데이터 정렬 순서를 바꿔놓는 방법을 사용
ROUWNUM 시작값(1)이 정의되지 않았으므로 1을 건너뛰고 그 다음 행 번호에 대한 추출 불가
-> 인라인 뷰에서 각 행마다의 순위를 직접 부여
서브쿼리를 통해 얻은 결과에 ROUNUM을 부여한 뒤 새로운 테이블인 것처럼 사용 (Inline view)
RANK
-> 윈도우 함수의 RANK 사용
FETCH
- 출력될 행의 수를 제한하는 절
- ORACLE 12C 이상부터 제공되는 기능
- 이전 버전에는 ROWNUM을 주로 사용
- SQL-Server 사용 가능
- ORDER BY절 뒤에 사용
- 내부 파싱 순서도 ORDER BY절 뒤에 수행
- OFFSET
- 건너 뛸 행의 수
- 예) 성적 높은 순 1등 제외, 나머지 3명
- 건너 뛸 행의 수
- N
- 출력할 행의 수
- FETCH
- 출력할 행의 수를 전달하는 구문
- FIRST
- OFFSET을 쓰지 않았을 때 처음부터 N 행 출력 명령
- NEXT
- OFFSET을 사용했을 경우 제외한 행 다음부터 N행 출력 명령
- ROW | ROWS
- 행의 수에 따라 하나일 경우 단수형/여러 값이면 복수형 (특별히 구분하지 않아도 됨)
반응형
'[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 |