IT 개발 라이프/DB

ORACLE(오라클) ROWNUM 함수

10Biliion 2025. 1. 9. 08:34

 

 

Oracle 데이터베이스에서 ROWNUM은 결과 집합 내의 각 행에 대해 고유한 번호를 부여하는 가상 컬럼입니다. 이는 데이터를 제한하거나 특정 조건에 맞는 행을 빠르게 필터링하는 데 사용됩니다.

 

ROWNUM의 특징

  1. 결과 집합 생성 순서: ROWNUM은 쿼리가 처리되는 순서에 따라 행 번호를 부여합니다.
  2. 임시 컬럼: ROWNUM은 실제 데이터베이스 테이블의 컬럼이 아니며, SELECT 쿼리에서만 존재합니다.
  3. 제약 사항: 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

  1. ROWNUM은 필터링 전에 적용됩니다. 이를 피하려면 서브쿼리를 사용해야 합니다.
  2. 순서 보장 필요 시 반드시 ORDER BY를 서브쿼리와 함께 사용하세요.