ORACLE(오라클)에서, MariaDB(마리아디비), MySQL(마이에스큐엘), PostgreSQL(포스트그레스큐엘)에서 사용하는 LIMIT
절과 같이 조회 조건(WHERE
)과 정렬(ORDER BY
)이 반영된 결과에서 원하는 행의 수만 반환하는 방법을 알아보자.
MariaDB, MySQL, PostgreSQL의 LIMIT
MariaDB, MySQL, PostgreSQL의 LIMIT
절은 아래의 예와 같이 조건절에 포함되는 조회 조건이 아니라 별도의 절로 동작하며 조회 조건과 정렬들이 반영된 결과에서 원하는 행의 수만을 반환하기 위해 사용한다.
SELECT *
FROM MEMBERS
ORDER BY AGE
LIMIT 3
회원 테이블(MEMBERS)에서 나이(AGE)가 적은 순서대로 3명을 조회한 쿼리문 예제이다.
ORACLE의 ROWNUM
ORACLE은 조회 조건 및 정렬 결과에서 원하는 수의 행만을 반환하는 기능을 하는 키워드는 존재하지 않는다. 비슷한 기능을 하는 ROWNUM
이 있으나 이는 WHERE
절에서 사용하는 키워드이며 LIMIT
와는 다르게 동작한다.
SELECT *
FROM MEMBERS
WHERE ROWNUM <= 3
ORDER BY AGE
MariaDB, MySQL, PostgreSQL의 LIMIT
절은 조회 조건과 정렬을 적용한 결과에서 지정한 행 수를 반환하는 반면, ORACLE의 ROWNUM
의 경우 전체 데이터에서 지정한 행 수만 조회한 후에 정렬을 수행한다.
ROWNUM <= 3
조건이 먼저 실행되고, ORDER BY AGE
가 적용되므로, 전체 데이터에서 3개의 행을 조회한 후 3개의 행에 대해서만 정렬을 하게된다.
MariaDB, MySQL, PostgreSQL의 LIMIT
와 ORACLE의 ROWNUM
은 전혀 다를 결과를 반환하게 될 것이다.
ORACLE에서 MySQL의 LIMIT절과 같은 결과를 얻는 방법
서브쿼리(SubQuery)로 정렬(`ORDER BY`)을 미리 수행한 후 `ROWNUM` 조건(`WHERE`)을 적용하여 정렬이 적용된 결과에서 지정한 행의 수를 얻을 수 있다.
SELECT *
FROM
(
SELECT *
FROM MEMBERS
ORDER BY AGE
)
WHERE ROWNUM <= 3
ORACLE에서 위 서브쿼리를 실행하면 MariaDB, MySQL, PostgreSQL에서 LIMIT
절을 사용한 것과 같은 결과를 얻을 수 있다.