ROWNUM
오라클에서 지원하는 가상컬럼(Pseudo Column)으로 쿼리의 결과에 가상으로 행번호를 1부터 부여한 순번.
1. 오라클에서만 사용가능
2. 주로 페이징처리, TOP-N QUERY에 사용
ROWNUM 주의사항
ROWNUM은 첫번째 값이 할당 된 이후부터 증가한다.
그러므로 다음과 같은 쿼리는 아무것도 반환하지 않는다
SELECT * FROM EMP WHERE ROWNUM > 1;
ROWNUM은 SELECT 할때 붙여져 나오는 가상컬럼이다.
위 구문을 설명하면, 테이블에서 행을 하나씩 가져오면서 ROWNUM을 부여하는데
첫번째 행을 가져왔을때 ROWNUM은 1이다. 조건에 맞지않기때문에 버려진다.
조건에 맞는 행이 없었기때문에 두번째 행을 가져왔을때도 ROWNUM은 1이다. 역시 조건에 맞지않아서 버려진다.
결국 아무값도 출력되지 않는다.
ROWNUM이 1보다 큰값을 추출하고싶다면
SELECT * FROM (SELECT E.*, ROWNUM R FROM EMP E) WHERE R > 1;
이렇게서브쿼리에서 별칭을 붙여서 가상컬럼인 ROWNUM을 진짜 컬럼으로 만들어줬다.
테이블에서 조건을 판별하기위해 행을 가져올때마다 ROWNUM을 부여하지 않고 서브쿼리가 만들어질때 고정된 값을 가지게된다.
그리고 R이라는 별칭을 부여해서 바깥에서 조건을 걸 수 있게 된다.
그리고 ROWNUM 할당은 WHERE절이 처리된 후에 할당됨.
쿼리에 정렬/그룹 조건이 있다면 이 조건을 수행하기 전에 할당되어서 원하는 값을 얻을 수 없다.
EX)
EMP테이블에서 급여가 높은 상위5명 추출하려면
잘못된 쿼리
SELECT * FROM EMP WHERE ROWNUM <= 5 ORDER BY SAL DESC;
먼저 5개의 행을 추출한 후, 그 5개 중에서 정렬 수행
정상 쿼리
SELECT *
FROM (SELECT * FROM EMP ORDER BY SAL DESC)
WHERE ROWNUM <= 5;
전체 EMP테이블을 조회하고 정렬한 결과에서 상위 5개 추출
'Database > Oracle' 카테고리의 다른 글
Union & Union all (0) | 2018.10.17 |
---|