Oracle

[ORACLE] 오라클 ORDER BY 적용 후 원하는 수만큼 조회하기 (ROWNUM)

Jutudy 2021. 4. 20. 23:30
ID NAME AGE
1 A 30
2 B 20
3 C 25

위와 같은 테이블(SAMPLE)이 있을 때, 나이 순으로 정렬하여 나이가 적은 순서대로 2명만 조회를 하고 싶다.

MySQL

SELECT *
FROM SAMPLE
ORDER BY AGE
LIMIT 2

MySQL의 경우 ORDER BY 절 이후 LIMIT 키워드를 사용하여 조회하면 된다. LIMIT는 ORDER BY까지 모두 적용된 결과에서 N개를 조회하여 보여준다.

조회결과

ID NAME AGE
2 B 20
3 C 25

ORACLE

그런데 오라클은 LIMIT 키워드가 없다. 비슷한 역할을 하는 ROWNUM이 있는데 이 키워드는 WHERE절에서 사용하는 키워드이다.

SELECT *
FROM SAMPLE
WHERE ROWNUM <= 2
ORDER BY AGE

위와 같이 MySQL과 비슷한 쿼리를 짜서 수행하면 기대했던 것과 전혀 다른 결과를 조회하게 된다.

조회결과

ID NAME AGE
2 B 20
1 A 30

전체 데이터에서 2개의 ROW만 조회한 후에 AGE로 정렬하여 보여주기 때문이다.

오라클 쿼리 실행 순서

FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY

쿼리 실행순서를 보면 ORDER BY 전에 WHERE 절이 먼저 실행된다.

그래서 ROWNUM <= 2가 먼저 적용되고, ORDER BY AGE가 적용된다.

결과적으로, 전체 데이터에서 2개의 ROW를 조회한 후에, 2개에 대해서만 정렬을 하는 것이다.

그럼 어떻게 해야 MySQL에서 LIMIT를 적용한 것과 동일한 결과를 얻을 수 있을까?

서브쿼리로 정렬을 미리 수행한 후에, ROWNUM <= 2를 통해 원하는 개수의 데이터를 얻어야한다.

SELECT *
FROM
(
    SELECT *
    FROM SAMPLE
    ORDER BY AGE
)
WHERE ROWNUM <= 2

위와 같이 쿼리를 실행하면 원하는 결과를 얻을 수 있다.