Yeonnnnny

[2과목] 2-13. TOP N QUERY 본문

SQLD

[2과목] 2-13. TOP N QUERY

yeonny_do 2024. 3. 7. 09:44

■ TOP N QUERY

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

 

 TOP-N 행 추출 방법

  • ROWNUM
  • RANK
  • FETCH

 

 

 ROWNUM

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

ex) ROWNUM 의 출력 형태

select rownum, emp.*
from emp
where sal>=1500;

 

 

 

ex) ROWNUM의 잘못된 사용

select * 
from emp
where rownum>1;

※ 크다 조건 혹은  '=' 연산자 단독 전달 불가능함

 

 

ex) ROWNUM의 올바른 사용

select empno, ename, deptno, sal
from emp
where rownum<=5;

 

  • EQAUL 비교 시 작다(<)와 함께 사용하면 1부터 순서대로 뽑을 수 있기 때문에 출력 가능함
  • 정렬 순서에 따라 출력되는 ROWNUM이 달라짐

 

ex) emp 테이블에서 급여가 높은 순서대로 상위 5명의 직원 정보 출력

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 | next} n {row | rows} only;
  • offset : 건너뛸 행의 수 (ex) 성적 높은 순 1등 제외, 나머지 3명)
  • n : 출력할 행의 수
  • fetch : 출력할 행의 수를 전달하는 구문
  • first : offset을 쓰지 않았을 때 처음부터 n행 출력 명명
  • next : offset을 사용했을 경우 제외한 행 다음부터 n행 출력 명령
  • row | rows : 행의 수에 따라 하나일 경우는 단수, 여러 값이면 복수형(특별히 구분하지 않아도 됨)

 

ex) emp에서 sal 순서대로 상위 5명

select empno, ename, job, sal
from emp
order by sal desc fetch first 5 rows only;

 

 

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

select *
from emp
order by sal desc 
offset 3 row
fetch next 3 rows only;

'SQLD' 카테고리의 다른 글

[2과목] 2-15. PIVOT과 UNPIVOT  (1) 2024.03.08
[2과목] 2-14. 계층형 질의  (0) 2024.03.07
[2과목] 2-12. 윈도우 함수  (0) 2024.03.07
[2과목] 2-11. 그룹 함수  (1) 2024.03.06
[2과목] 2-10. 집합 연산자  (2) 2024.03.06