본문 바로가기

Database/Oracle

오라클(ORACLE)에서 정렬(ORDERY BY) 후 반환되는 행 수 제한(LIMIT)

오라클(ORACLE) 결과 행 수 제한(LIMIT)

ORACLE(오라클)에서, MariaDB(마리아디비), MySQL(마이에스큐엘), PostgreSQL(포스트그레스큐엘)에서 사용하는 LIMIT절과 같이 조회 조건(WHERE)과 정렬(ORDER BY)이 반영된 결과에서 원하는 행의 수만 반환하는 방법을 알아보자.

MariaDB, MySQL, PostgreSQL의 LIMIT

MariaDB, MySQL, PostgreSQLLIMIT절은 아래의 예와 같이 조건절에 포함되는 조회 조건이 아니라 별도의 절로 동작하며 조회 조건정렬들이 반영된 결과에서 원하는 행의 수만반환하기 위해 사용한다.

SELECT *
FROM MEMBERS
ORDER BY AGE
LIMIT 3

회원 테이블(MEMBERS)에서 나이(AGE)가 적은 순서대로 3명을 조회한 쿼리문 예제이다.

ORACLEROWNUM

ORACLE조회 조건정렬 결과에서 원하는 수의 행만을 반환하는 기능을 하는 키워드는 존재하지 않는다. 비슷한 기능을 하는 ROWNUM이 있으나 이는 WHERE절에서 사용하는 키워드이며 LIMIT와는 다르게 동작한다.

SELECT *
FROM MEMBERS
WHERE ROWNUM <= 3
ORDER BY AGE

MariaDB, MySQL, PostgreSQLLIMIT절은 조회 조건정렬적용한 결과에서 지정한 행 수를 반환하는 반면, ORACLEROWNUM의 경우 전체 데이터에서 지정한 행 수만 조회한 후에 정렬수행한다.

ROWNUM <= 3 조건이 먼저 실행되고, ORDER BY AGE가 적용되므로, 전체 데이터에서 3개의 행을 조회한 후 3개의 행에 대해서만 정렬을 하게된다.

MariaDB, MySQL, PostgreSQLLIMITORACLEROWNUM은 전혀 다를 결과를 반환하게 될 것이다.

ORACLE에서 MySQL의 LIMIT절과 같은 결과를 얻는 방법

서브쿼리(SubQuery)로 정렬(`ORDER BY`)을 미리 수행한 후 `ROWNUM` 조건(`WHERE`)을 적용하여 정렬이 적용된 결과에서 지정한 행의 수를 얻을 수 있다.

SELECT *
FROM
(
	SELECT *
    FROM MEMBERS
    ORDER BY AGE
)
WHERE ROWNUM <= 3

ORACLE에서 위 서브쿼리를 실행하면 MariaDB, MySQL, PostgreSQL에서 LIMIT절을 사용한 것과 같은 결과를 얻을 수 있다.