반응형
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;
- 주의사항:
정렬을 적용하면 예상과 다른 결과가 나올 수 있습니다.
예를 들어:
정렬 후 ROWNUM을 적용하여 올바른 결과를 얻을 수 있습니다.SELECT EMPLOYEE_ID, SALARY FROM (SELECT * FROM EMPLOYEES ORDER BY SALARY DESC) WHERE ROWNUM <= 3;
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. 주의사항 및 권장사항
- ROWNUM은 간단한 조건을 만족할 때 적합하지만, 정렬된 데이터에서 특정 조건을 만족하는 결과를 얻으려면 서브쿼리를 사용해야 합니다.
- ROW_NUMBER는 정렬과 그룹화를 고려한 복잡한 쿼리에서 강력하며, SQL 표준이므로 다양한 DBMS에서 호환됩니다.
- 실무에서는 정렬 및 그룹화가 필요한 경우 ROW_NUMBER를 우선적으로 고려하세요.
7. 마무리
ROWNUM과 ROW_NUMBER는 각기 다른 목적과 특징을 가진 함수로, 적절히 사용하면 SQL 쿼리의 성능을 최적화하고 정확한 결과를 얻을 수 있습니다. 단순 작업에는 ROWNUM이, 정렬과 그룹화가 필요한 고급 작업에는 ROW_NUMBER가 적합합니다. 실무에서 두 함수를 올바르게 사용하여 데이터 처리 효율을 극대화하세요!
반응형
'Database' 카테고리의 다른 글
오라클 SQL: CONNECT BY로 계층적 데이터 관리 (0) | 2024.12.04 |
---|---|
오라클 WITH 절로 복잡한 쿼리 간소화하기 (0) | 2024.12.04 |
오라클 ALL_TAB_COLUMNS와 USER_TAB_COLUMNS의 차이점 (0) | 2024.12.04 |
오라클 데이터 딕셔너리 뷰 이해하기 (0) | 2024.12.04 |
오라클 CLUSTER 테이블 사용법 (0) | 2024.12.04 |