본문 바로가기
Database

오라클 ROWNUM과 ROW_NUMBER 차이점

by 굿센스굿 2024. 12. 4.
반응형


SQL에서 ROWNUM ROW_NUMBER는 테이블의 행(row)에 고유한 번호를 할당하는 데 사용됩니다. 이 두 함수는 이름은 비슷하지만 동작 방식과 사용 목적에 있어 중요한 차이점이 있습니다. 이번 글에서는 두 함수의 차이점을 명확히 설명하고, 각각의 특징과 실무 활용 방법에 대해 예시와 함께 살펴보겠습니다.


1. ROWNUM이란?

1.1 정의

ROWNUM은 오라클 데이터베이스에서 쿼리가 반환하는 행에 대해 임시적으로 번호를 부여하는 가상 컬럼입니다.

  • 쿼리 결과의 반환 순서에 따라 행 번호를 할당합니다.
  • 실행 중 생성되므로 쿼리의 실행 계획에 따라 동작이 달라질 수 있습니다.

1.2 특징

  • 쿼리 결과의 첫 번째 행부터 순서대로 번호가 할당됩니다.
  • 데이터 정렬(ORDER BY) 이전에 번호가 부여됩니다.
  • WHERE 조건문에 사용 시, 조건을 만족하는 행에 번호가 부여되는 것이 아니라, 번호 부여 후 조건이 적용됩니다.

2. ROW_NUMBER란?

2.1 정의

ROW_NUMBER는 SQL 표준 함수로, 특정 윈도우 함수와 함께 사용되어 결과 집합 내에서 정렬된 순서대로 고유한 번호를 할당합니다.

  • OVER() 절을 사용해 데이터 정렬 기준과 윈도우(범위)를 정의합니다.

2.2 특징

  • 특정 정렬 기준을 기반으로 행 번호를 할당합니다.
  • 윈도우 함수로 작동하므로 범위(Partition)를 지정하여 각 그룹 내에서 번호를 재부여할 수 있습니다.
  • 정렬 후 번호가 부여되므로 보다 유연하고 직관적인 결과를 제공합니다.

3. ROWNUM과 ROW_NUMBER의 차이점

구분 ROWNUM ROW_NUMBER

동작 방식 실행 계획 순서에 따라 번호를 부여 정렬(ORDER BY) 후 번호를 부여
SQL 표준 여부 오라클 전용 기능 SQL 표준 함수
정렬 가능 여부 정렬된 데이터 기준으로 번호 부여 불가 특정 정렬 기준에 따라 번호 부여 가능
그룹화(Partition) 그룹화 기능 없음 그룹화(Partition By)를 통해 그룹별 번호 부여 가능
사용 용도 빠르고 간단한 번호 부여 정렬 및 그룹화된 데이터에 고유 번호 할당

4. 사용 예시

4.1 ROWNUM 사용 예시

기본 사용

SELECT ROWNUM AS RN, EMPLOYEE_ID, SALARY
FROM EMPLOYEES;
  • 결과:
    쿼리가 반환하는 순서대로 번호가 부여됩니다.

특정 행 제한 (TOP N)

SELECT ROWNUM, EMPLOYEE_ID, SALARY
FROM EMPLOYEES
WHERE ROWNUM <= 5;
  • 결과:
    첫 5개 행만 반환합니다.
    단, 정렬 기준 없이 반환되므로 특정 조건의 데이터를 반환하지 않을 수 있습니다.

4.2 ROW_NUMBER 사용 예시

기본 사용

SELECT ROW_NUMBER() OVER (ORDER BY SALARY DESC) AS RN, EMPLOYEE_ID, SALARY
FROM EMPLOYEES;
  • 결과:
    SALARY(급여) 기준으로 내림차순 정렬된 후 번호가 부여됩니다.

그룹화 사용

SELECT DEPARTMENT_ID, EMPLOYEE_ID, SALARY,
       ROW_NUMBER() OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC) AS RN
FROM EMPLOYEES;
  • 결과:
    각 부서(DEPARTMENT_ID)별로 급여 순위(SALARY DESC)를 기준으로 번호를 부여합니다.

5. 실무 활용 사례

5.1 TOP N 조회

ROWNUM을 사용한 상위 3명 조회

SELECT EMPLOYEE_ID, SALARY
FROM EMPLOYEES
WHERE ROWNUM <= 3;
  • 주의사항:
    정렬을 적용하면 예상과 다른 결과가 나올 수 있습니다.
    예를 들어:
    SELECT EMPLOYEE_ID, SALARY
    FROM (SELECT * FROM EMPLOYEES ORDER BY SALARY DESC)
    WHERE ROWNUM <= 3;
    
    정렬 후 ROWNUM을 적용하여 올바른 결과를 얻을 수 있습니다.

ROW_NUMBER를 사용한 상위 3명 조회

SELECT EMPLOYEE_ID, SALARY
FROM (
    SELECT EMPLOYEE_ID, SALARY, ROW_NUMBER() OVER (ORDER BY SALARY DESC) AS RN
    FROM EMPLOYEES
) WHERE RN <= 3;
  • 결과:
    급여 순위에 따라 상위 3명을 정확히 반환합니다.

5.2 그룹별 순위 산출

ROWNUM으로 부서별 상위 1명 조회

ROWNUM만으로는 부서별 상위 1명 조회가 어렵습니다. 대신 그룹화된 결과에 ROWNUM을 추가해야 합니다.

SELECT * FROM (
    SELECT DEPARTMENT_ID, EMPLOYEE_ID, SALARY, 
           ROWNUM AS RN
    FROM (SELECT * FROM EMPLOYEES ORDER BY DEPARTMENT_ID, SALARY DESC)
) WHERE RN = 1;

ROW_NUMBER로 부서별 상위 1명 조회

SELECT DEPARTMENT_ID, EMPLOYEE_ID, SALARY
FROM (
    SELECT DEPARTMENT_ID, EMPLOYEE_ID, SALARY,
           ROW_NUMBER() OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC) AS RN
    FROM EMPLOYEES
) WHERE RN = 1;
  • 결과:
    부서별 급여 1위 직원이 정확히 반환됩니다.

6. 주의사항 및 권장사항

  1. ROWNUM은 간단한 조건을 만족할 때 적합하지만, 정렬된 데이터에서 특정 조건을 만족하는 결과를 얻으려면 서브쿼리를 사용해야 합니다.
  2. ROW_NUMBER는 정렬과 그룹화를 고려한 복잡한 쿼리에서 강력하며, SQL 표준이므로 다양한 DBMS에서 호환됩니다.
  3. 실무에서는 정렬 및 그룹화가 필요한 경우 ROW_NUMBER를 우선적으로 고려하세요.

7. 마무리

ROWNUM ROW_NUMBER는 각기 다른 목적과 특징을 가진 함수로, 적절히 사용하면 SQL 쿼리의 성능을 최적화하고 정확한 결과를 얻을 수 있습니다. 단순 작업에는 ROWNUM이, 정렬과 그룹화가 필요한 고급 작업에는 ROW_NUMBER가 적합합니다. 실무에서 두 함수를 올바르게 사용하여 데이터 처리 효율을 극대화하세요!

반응형