2. 다음 중 SQL의 실행 결과가 다른 것을 고르시오.
(1)
SELECT EMPNO, ENAME
FROM EMP
ORDER BY EMPNO
FETCH FIRST 10 ROWS ONLY
(2)
SELECT EMPNO, ENAME
FROM (SELECT EMPNO, ENAME, ROWNUM RN
FROM EMP
ORDER BY EMPNO)
WHERE RN <= 10
(3)
SELECT EMPNO, ENAME
FROM (SELECT EMPNO, ENAME
FROM EMP
ORDER BY EMPNO)
WHERE ROWNUM <= 10
(4)
SELECT EMPNO, ENAME
FROM (SELECT EMPNO, ENAME
, ROW_NUMBER() OVER (ORDER BY EMPNO) RN
FROM EMP)
WHERE RN <= 10
정답 : 2
오라클의 Top N 패턴 SQL에 관한 문제이다.
보기 (1),(3),(4)는 모두 EMPNO
를 오름차순으로 정렬했을 때 먼저 출력되는 10개 로우(row)를 조회하는 일반적인 유형이다. 하지만 (2)는 ORDER BY
절의 정렬 처리를 하기 전에 ROWNUM
이 먼저 처리되므로 다른 보기와 출력 결과가 다르다.
실무에서도 매우 많이 사용되는 패턴이므로 확실히 이해하고 가자. 가장 중요한 포인트는 같은 쿼리 블록 내에서 ORDER BY
절과 ROWNUM
을 함께 사용하지 않아야 한다는 것이다.
참고로 FETCH FIRST N ROWS ONLY
문법은 Oracle 12c 부터 지원한다.