오라클에선 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
'데이터베이스' 카테고리의 다른 글
[데이터베이스] 인덱스 개념 (0) | 2023.07.06 |
---|---|
[데이터베이스] 서브쿼리 종류 (0) | 2023.07.05 |
[데이터베이스] 오라클 WITH절 사용방법 (0) | 2023.07.03 |
[데이터베이스]INTERSECT 키워드, CROSS JOIN (0) | 2023.06.30 |
[데이터베이스] DECODE(), CASE문 사용법 (0) | 2023.06.28 |