Web develop/SQL

[SQL/ORACLE] TOP-N 사용 예제

ForA 2019. 6. 15. 20:42
728x90
  • ROWID: 주소로서 row가 실제로 저장되어있는 공간을 표시
  • ROWNUM: 번호로서 row의 주소 순서대로 출력되어짐.
  • 출력되는 행에 대해 첫 행부터 순차적인 번호를 부여 (1,2,3,...)
    SELECT empno, ename, sal, rownum FROM emp; 
    SELECT empno, ename, rownum FROM emp WHERE rownum <= 3;
    -- 문제) 가장 많은 급여를 받는사람 
    SELECT empno, ename, sal  --실행 3
    FROM emp                  --실행 1
    WHERE ROWNUM <=3          --실행 2
    ORDER BY sal DESC;        --실행 4
    /* 
    ORDER BY로 내림차순 해주었으나 ORDER BY는 마지막에 실행되기에 
    오름차순된 결과에서 ROWNUM이 출력된다 
    */

    -- 쿼리문 사용으로 다시 실행
    SELECT empno, ename, sal  --실행 2
    FROM( SELECT empno, ename, sal FROM emp ORDER BY sal DESC) --실행 1
    WHERE rownum BETWEEN 1 AND 3; --실행 3

    -- 문제) 가장 오래된 사원 3명
    SELECT empno, ename, hiredate 
    FROM (SELECT empno, ename, hiredate FROM emp ORDER BY hiredate ASC)
    WHERE rownum BETWEEN 1 AND 3;

    -- 문제) 급여를 4번째로 많이받는 사원부터 6번째까지 
    SELECT empno, ename, sal 
    FROM (SELECT empno, ename, sal FROM emp ORDER BY sal desc) 
    WHERE rownum BETWEEN 4 AND 6; 
    --> 조회결과 없음. rownum은 항상 1부터 1씩 증가하는 값을 카운트해야함 

    --> 해결: rownum을 먼저 1부터 출력하게 하고 그 결과에서 중간번호(1아닌 값)을 조회
    SELECT empno, ename, sal
    FROM (SELECT empno, ename, sal, rownum rb 
        FROM (SELECT empno, ename, sal
            FROM emp ORDER BY sal desc) --1차: 정렬
    ) --2차: 출력된 행에 1부터 순차적인 번호를 부여
    WHERE rb BETWEEN 4 AND 6;
    -- 별명 부여시 
    WHERE salNum.rownum BETWEEN 4 AND 6;