ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TOP N 쿼리
    데이터베이스 2021. 5. 15. 16:10

    ROWNUM / TOP N / ROW LIMITING 의 사용

     

    1. ROWNUM

    ORACLE 에서 가져오고자하는 행 수를 제한할 때 ROWNUM < 2 와 같이 사용할 수 있다.

     

    그런데 ORDER BY 로 정렬된 순의 데이터를 출력하고자 하는 의도는 ROWNUM을 잘못 사용 하는 것이다.

    아래 ORDER BY 는 급여 순으로 정렬하고 위에 3개 행을 결과로 출력하는 것을 원했다면 원하는 결과가 나오지 않는다.

    랜덤으로 데이터롤 3개 뽑은 후 그 데이터를 정렬해서 출력한다.

    ORDER BY 는 결과에 영향을 주지 않는다. 

    SELECT ENAME, SAM FROM EMP
    WHERE ROWNUM < 4
    ORDER BY SAL DESC;    

     

    ORDER BY 가 없다면 ORACLE 의 ROWNUM 조건과 SQL SERVER 의 TOP 절은 같은 결과를 보인다.

    ORDER BY 절이 사용되는 경우 ORACLE 은 ROWNUM 조건을 ORDER BY 절보다 먼저 처리되는 WHERE 절에서 

    처리하므로, 정렬 후 원하는 데이터를 얻기 위해 인라인 뷰에서 먼저 데이터를 정렬한 후 메인 쿼리에서 ROWNUM 을 사용해야한다.

    SELECT ENAME, SAL
    	FROM ( SELECT ENAME, SAL
        	FROM EMP 
            ORDER BY SAL DESC
            )
    WHERE ROWNUM <=3;        

     

    2. TOP 절 

    결과 집합으로 나오는 행의 수를 제한할 수 있다.

    TOP (N) WITH TIES 로 동일 수치의 데이터는 추가로 더 추출할 수 있다.

    SELECT TOP(2) WITH TIES 
    	ENAME,SAL
        FROM EMP
    ORDER BY SAL DESC;

     

    3. ROW LIMITING 절 

    ORDER BY 절 다음에 기술하며, ORDER BY 와 함께 수행된다. 

    ROW와 ROWS 의 구분은 없다.

     

    [ FETCH { FIRST | NEXT } [ { rowcount | percent PERCENT } ] { ROW | ROWS } { ONLY | WITH TIES } ]

    FETCH : 반환할 행의 개수나 백분율을 지정한다.

    ONLY : 지정된 행의 개수나 백분율만큼 행을 반환한다.

    WITH TIES : 마지막 행에 대한 동순위를 포함해서 반환한다.

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

     

    [ OFFSET offset { ROW | ROWS } ]

    OFFSET offset : 건너뛸 행의 개수를 지정한다.

    SELECT EMPNO, SAL
    FROM EMP
    ORDER BY SAL,
    EMPNO OFFSET 5 ROWS;

    출처

    SQL 전문가 가이드 - 한국데이터산업진흥원

    반응형

    '데이터베이스' 카테고리의 다른 글

    PIVOT , UNPIVOT  (0) 2021.05.16
    계층형 질의  (0) 2021.05.16
    윈도우 함수  (0) 2021.05.15
    그룹함수  (0) 2021.05.11
    집합연산자  (0) 2021.05.11
Designed by Tistory.