ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Oracle - MySQL의 LIMIT & Oracle의 ROWNUM
    Database/Oracle 2022. 4. 4. 18:02

    MySQL의 LIMIT & Oracle의 ROWNUM

    LIMIT과 ROWNUM

    MySQL이나 PostgreSQL에서 사용하는 LIMIT 절을 Oracle에서 사용하고 싶은 경우가 있다. 하지만, Oracle에서는 LIMIT 절을 사용할 수 없다.

    Oracle에서는 LIMIT 대신 ROWNUM을 사용할 수 있는데, LIMIT과 ROWNUM은 사용법과 용도가 다르기 때문에 사용 시 주의해야 한다.

     

    LIMIT은 쿼리가 ORDER BY 절까지 모두 실행이 된 후 해당 쿼리에서 원하는 행의 데이터를 가져오는 반면에, ROWNUM은 쿼리가 완전히 수행되지 않은 원 데이터의 정렬순서대로 번호를 매기기 때문에 전혀 다른 결과가 출력된다.

     

    처음 구간에서부터의 행 출력

    1. MySQL의 LIMIT

    SELECT *
    FROM EMP
    WHERE JOB = 'SALESMAN'
    ORDER BY ENAME
    LIMIT 2;

    위 코드는 MySQL의 LMIT을 사용해서 사원명(ENAME)을 기준으로 정렬한 후 결과에서 2행을 가져오는 쿼리문이다.

     

     

    쿼리문을 실행하면 위와 같은 결과가 출력된다.

     

    2. Oracle의 ROWNUM

    SELECT *
    FROM EMP
    WHERE JOB = 'SALESMAN' AND ROWNUM <=2
    OEDER BY ENAME;

    Oracle에서는 ROWNUM을 사용해서 2건의 데이터를 가져오는 쿼리문을 작성하였다.

     

     

    하지만, 위 사진에서 알 수 있듯이 MySQL과 다른 결과가 출력되는 것을 확인할 수 있다.

     

    SELECT *
    FROM (
        SELECT *
        FROM EMP
        WHERE JOB = 'SALESMAN'
        ORDER BY ENAME
    )
    WHERE ROWNUM <= 2;

    Oracle엣 LIMIT과 동일한 결과를 얻기 위해서는 SELECT 절로 한번 감싼 후에 ROWNUM으로 조건을 맞춰줘야 한다.

     

     

    결과를 확인해보면 LIMIT과 동일한 결과를 출력하는 것을 확인할 수 있다.

     

    특정 구간에서부터의 행 출력

    1. MySQL의 LIMIT

    SELECT *
    FROM EMP
    ORDER BY ENAME
    LIMIT 6, 3;

    MySQL에서는 LMIT을 사용해서 원하는 구간의 행을 출력할 수 있다. 위 코드는 7번째 행부터 9번째 행까지 3건의 데이터를 출력하는 쿼리문이다. 

     

     

    쿼리 문의 결과를 확인해보면 위와 같은 결과가 나오는 것을 확인할 수 있다.

     

    2. Oracle의 ROWNUM

    SELECT *
    FROM (
        SELECT ROWNUM AS RN, A.*
        FROM (
            SELECT *
            FROM EMP
            ORDER BY ENAME
        ) A
    )
    WHERE RN BETWEEN 7 AND 9;

    Oracle에서 원하는 구간의 행을 출력하기 위해서는 다소 복잡하다. 내부적으로 데이터를 조회한 후 외부에서 WHERE 절을 통해 조건을 거는 방식이다.

    이는 ROWNUM의 특징과 연관이 있다. 위에서도 설명했듯이 MySQL의 LIMIT은 쿼리가 ORDER BY 절까지 모두 실행이 된 후 해당 쿼리에서 원하는 행의 데이터를 가져오는 방식인 반면, ROWNUM은 쿼리가 완전히 수행되지 않은 원 데이터의 정렬순서대로 번호를 매기기 때문에 이런 식으로 쿼리문을 작성해야 하는 것이다.

     

     

    쿼리문을 실행하면, MySQL의 LIMIT과 동일한 결과를 출력하는 것을 확인할 수 있다.

     

    728x90

    'Database > Oracle' 카테고리의 다른 글

    Oracle - BETWEEN AND  (0) 2022.05.02
    Oracle - 조건문(IF, CASE)  (0) 2022.04.27
    Oracle - MERGE INTO  (0) 2022.04.26
    Oracle - 반복문(LOOP, WHILE, FOR)  (0) 2022.04.25
    Oracle - 변수 및 상수 선언  (0) 2022.04.25

    댓글

Designed by Tistory.