Web/DB

[Oracle] ROWNUM 사용법

돈기법 2022. 3. 25. 15:42

MySql → limit으로 페이징 처리

Oracle → rownum을 사용해 원하는 순서의 데이터 출력

 

오라클의 ROWNUM은 쿼리가 실행될 때 결과 값에 가상의 번호를 부여해준다.

ROWNUM은 where절이 먼저 실행되고 그 조건에 맞는 리스트를 먼저 검색 후 해당 리스트에 번호를 매긴다.

 

따라서 ROWNUM 함수는 ORDER BY 함수와 같이 사용하면 순번이 뒤죽박죽 됨.

==> 순번을 매기고 난 뒤 ORDER BY 정렬을 하기 때문

 

정렬 - 순번 매기기 순으로 진행해야 함. → 서브쿼리에 먼저 정렬(Order by) 후 순번 매기기(Rownum)

 

1. Top-N Query (상위 N개의 데이터를 보여주는 쿼리)

- 상위 5개의 데이터를 출력한다.

SELECT empno, ename, sal
FROM (
        SELECT * FROM emp ORDER BY sal DESC
         )
WHERE rownum <= 5;

 

- 6~10까지의 데이터를 출력한다.

SELECT b.* 
FROM (
     SELECT rownum AS rn, a.*
     FROM (
            SELECT *
            FROM emp
            ORDER BY sal DESC
           ) a
     ) b
WHERE rn BETWEEN 6 AND 10;

 

2. Row Limiting Clause (오라클 12c 버전부터 사용 가능)

ORDER BY절 이후에 실행되는 절로 몇 개의 데이터를 어디서부터 볼지 중복여부와 함께 출력 가능

 

OFFSET : 첫 번째 데이터로부터 얼마나 떨어져 있는지

FETCH : 몇개의 데이터를 볼건지

 

- 0부터 5개 데이터만 출력한다.

SELECT empno, ename, sal
FROM emp
ORDER BY sal DESC
OFFSET 0 ROWS FECTH FIRST 5 ROWS ONLY; --첫 번째부터 출력하면 OFFSET은 생략 가능

 

 

- 6부터 5개 데이터만 출력한다.

SELECT empno, ename, sal
FROM emp
ORDER BY sal DESC
OFFSET 6 ROWS FECTH FIRST 5 ROWS ONLY;

 

- ONLY | WITH TIES 옵션

SELECT empno, ename, sal
FROM emp
ORDER BY sal DESC
FETCH FISRT 9 ROWS [ONLY | WITH TIES]; -- ONLY : 중복 X | WITH TIES : 중복 O