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