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
위와 같이 쿼리를 실행하면 원하는 결과를 얻을 수 있다.