Oracle 데이터베이스에서 ROWNUM은 결과 집합 내의 각 행에 대해 고유한 번호를 부여하는 가상 컬럼입니다. 이는 데이터를 제한하거나 특정 조건에 맞는 행을 빠르게 필터링하는 데 사용됩니다.
ROWNUM의 특징
- 결과 집합 생성 순서: ROWNUM은 쿼리가 처리되는 순서에 따라 행 번호를 부여합니다.
- 임시 컬럼: ROWNUM은 실제 데이터베이스 테이블의 컬럼이 아니며, SELECT 쿼리에서만 존재합니다.
- 제약 사항: ROWNUM은 WHERE 절에서 조건으로 사용될 때 동작 방식에 주의가 필요합니다.
기본 구문
SELECT ROWNUM, column1, column2
FROM table_name;
예제 1: 간단한 데이터 제한
테이블에서 상위 5개의 행만 가져오고 싶을 때 사용합니다.
테이블 구조
CREATE TABLE employees (
employee_id NUMBER,
department_id NUMBER,
hire_date DATE,
salary NUMBER
);
데이터
EMPLOYEE_ID | DEPARTMENT_ID | HIRE_DATE | SALARY |
1 | 10 | 2022-01-01 | 5000 |
2 | 10 | 2022-02-01 | 5500 |
3 | 20 | 2022-03-01 | 6000 |
4 | 20 | 2022-04-01 | 6500 |
5 | 10 | 2022-03-01 | 6000 |
쿼리
SELECT ROWNUM, employee_id, salary
FROM employees
WHERE ROWNUM <= 5;
결과
ROWNUM | EMPLOYEE_ID | SALARY |
1 | 1 | 5000 |
2 | 2 | 5500 |
3 | 3 | 6000 |
4 | 4 | 6500 |
5 | 5 | 6000 |
예제 2: ROWNUM과 ORDER BY 사용 주의점
ROWNUM은 행이 필터링되기 전에 적용되기 때문에 정렬 후 상위 N개의 데이터를 가져오려면 서브쿼리를 사용해야 합니다.
문제 상황
SELECT ROWNUM, employee_id, salary
FROM employees
ORDER BY salary DESC;
- 결과는 정렬되기 전에 ROWNUM이 부여되므로 원하는 결과를 얻을 수 없습니다.
해결 방법: 서브쿼리 사용
SELECT ROWNUM, employee_id, salary
FROM (
SELECT employee_id, salary
FROM employees
ORDER BY salary DESC
)
WHERE ROWNUM <= 3;
ROWNUM | EMPLOYEE_ID | SALARY |
1 | 4 | 6500 |
2 | 3 | 6000 |
3 | 5 | 6000 |
예제 3: ROWNUM과 페이징 처리
ROWNUM을 사용하여 데이터의 특정 범위를 가져올 수 있습니다. 예를 들어, 6번째부터 10번째 행까지 가져온다고 가정합니다.
SELECT *
FROM (
SELECT ROWNUM AS rnum, employee_id, salary
FROM (
SELECT employee_id, salary
FROM employees
ORDER BY hire_date
)
WHERE ROWNUM <= 10
)
WHERE rnum >= 6;
RNUM | EMPLOYEE_ID | SALARY |
6 | ... | ... |
예제 4: 특정 조건과 함께 사용
ROWNUM을 사용하여 특정 조건의 데이터에서 상위 N개의 결과만 가져올 수 있습니다.
SELECT ROWNUM, employee_id, salary
FROM employees
WHERE department_id = 10 AND ROWNUM <= 2;
ROWNUM | EMPLOYEE_ID | SALARY |
1 | 1 | 5000 |
2 | 2 | 5500 |
- ROWNUM은 필터링 전에 적용됩니다. 이를 피하려면 서브쿼리를 사용해야 합니다.
- 순서 보장 필요 시 반드시 ORDER BY를 서브쿼리와 함께 사용하세요.
'IT 개발 라이프 > DB' 카테고리의 다른 글
데이터베이스(DB) 정규화와 비정규화 (1) | 2025.01.16 |
---|---|
ORACLE(오라클) ROW_NUMBER() 함수 (0) | 2025.01.09 |
데이터베이스 트랜잭션(Transaction) (0) | 2024.12.31 |
데이터베이스(DB) Lock (1) | 2024.12.26 |
오라클 순위 함수 (Ranking Functions) (0) | 2024.12.17 |