[SQLD] TOP N QUERY

yurinnn·2024년 6월 26일

DB

목록 보기
8/9
  • 페이징 처리를 효과적으로 수행하기 위해 사용한다.
  • 전체 결과에서 특정 N 개 추출한다.
  • 윈도우 함수를 사용하여 상위 N 개에 대한 값을 추출할 수 있으나 단일 쿼리로 표현이 불가하다.
    • 윈도우 함수의 결과를 서브쿼리로 사용하여 필터링해야 한다.

ROWNUM (oracle)

  • 정렬을 먼저 하고 나서 ROWNUM 을 수행해야 한다.
  • 출력된 데이터 기준으로 행 번호 부여
  • 절대적인 행 번호가 아닌 가상의 번호이므로 특정 행을 지정할 수 없음 ( ‘=’ 연산 불가)
    • 출력되는 결과에 따라 바뀐다. 실제로는 존재하지 않는 가짜 컬럼이다.
  • 첫번째 행이 증가한 이후 할당되므로 ‘>’ 연산 사용 불가 → 1을 포함해야 한다 (> 0 은 가능, ≥ 1 가능)
    • 항상 < 조건이나 <= 조건으로 사용해야 한다.

예시 1) 급여가 높은 순서대로 상위 5 명의 직원 정보 출력

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

예시 2) 급여가 높은 순서대로 상위 4~6 번째 직원 정보 출력 (ROWNUM 은 1 을 포함해야 한다)

방법 1.

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;

방법 2.

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;

TOP ( )

  • SQL Server는 TOP 조건을 사용하게 되면 별도 처리 없이 관련 Order By 절의 데이터 정렬 후 원하는 일부 데이터만 쉽게 출력할 수 있다.

  • WITH TIES 옵션은 ORDER BY 절의 조건 기준으로 TOP N 의 마지막 행으로 표시되는 추가 행의 데이터가 같을 경우 N+ 동일 정렬 순서 데이터를 추가 반환하도록 지정하는 옵션이다.

-- 사원 테이블에서 급여가 높은 2명을 내림차순으로 출력 
SELECT TOP(2) ENAME, SAL
FROM EMP
ORDER BY SAL DESC;

-- 사원 테이블에서 급여가 높은 2명을 내림차순으로 출력하는데 같은 급여를 받는 사원이 있으면 같이 출력
SELECT TOP(2) WITH TIES ENAME, SAL
FROM EMP
ORDER BY SAL DESC;

FETCH 절

  • 출력될 행의 수를 제한하는 절
  • 단일 쿼리로도 정렬 순서대로의 상위 N 개에 대한 값을 추출할 수 있다.
  • ORACLE 12 C 이상부터 제공, SQL server 지원
  • ORDER BY 절 뒤에 사용
    ORDER BY 컬럼 OFFSET N {ROW | ROWS} -- OFFSET : 건너뛸 행의 수 
    	FETCH {FIRST | NEXT} N {ROW | ROWS} ONLY 
    • FIRST : OFFSET 을 쓰지 않았을 때는 처음부터 N 행 출력
    • NEXT : OFFSET 을 사용할 경우 제외한 행 다음부터 N 행 출력

예시 1 ) SAL 순서대로 상위 5명

SELECT EMPNO, ENAME, JOB, SAL FROM EMP
	ORDER BY SAL DESC FETCH FIRST 5 ROWS ONLY; -- NEXT 와도 상관 없음 

예시 2 ) SAL 순서대로 상위 4 ~ 6 번째

SELECT EMPNO, ENAME, JOB, SAL FROM EMP
	ORDER BY SAL DESC 
		OFFSET 3 ROW 
		FETCH FIRST 2 ROW ONLY; -- NEXT 와도 상관 없음 
profile
슬기로운 개발 생활

0개의 댓글