본문 바로가기

데이터베이스

[데이터베이스] 오라클 RONUM

오라클에선 ROWNUM 으로 행에 번호를 매길 수 있다.

SELECT ROWNUM, PLAYER.*  FROM PLAYER
WHERE ROWNUM < 11;

이런 식으로 출력하면 테이블에 있는 데이터에 위에서 부터 번호를 매겨 10 번째 행까지 출력이 된다. 

참고로 정렬된 값들은 아니다. (당연히 정렬을 시키지 않았으니깐)

 

이렇게 테이블에서 행 단위로 출력을 할 수 있는데 정렬을 하고 출력하고 싶은 경우가 있을 수 도 있다. 

하지만, 

SELECT ROWNUM, PLAYER.*  FROM PLAYER
WHERE ROWNUM < 11

ORDER BY PLAYER_ID;

이런 식으로 ORDER BY 로 정렬하지 말아야 한다. 

 

왜냐하면 ROWNUM 은 테이블이 실행 될 경우 조건에 맞으면 FLAG값을 1을 부여하고 조건에 맞지 않으면 버리는 방식으로 진행을 한다. 따라서 그냥 테이블에 저장 된 순서로 행 번호를 매기기 때문에 ORDER BY로 정렬 시 원하는 결과를 얻지 못하는 것이다.  

 

 

해결방법: 정렬 후 ROUNUM 사용

그래서 이 경우 서브쿼리로 전체 테이블을 정렬 시킨 뒤에 정렬된 테이블에 ROWNUM을 부여하면 원하는 결과를 얻을 수 있다.

SELECT ROWNUM, P.* 
FROM (
	SELECT *  FROM PLAYER
    // HEIGHT는 NULL을 포함시키기 때문에 NULL을 제외시켜주었다.
	WHERE HEIGHT IS NOT NULL
    ORDER BY PLAYER.HEIGHT DESC   
) P
WHERE ROWNUM <= 10;

 

정리

  • rownum은 테이블 행에 순번을 매겨준다. 단, 테이블에 저장된 순서대로
  • 정렬된 테이블에서 몇 n번째 행 까지 뽑으려면 서브쿼리로 정렬된 테이블을 만든 다음에 rownum으로 출력한다. 

 

 

 

Reference