rownum, row_number
`ROWNUM`과 `ROW_NUMBER()`는 SQL에서 행 번호를 부여하는 데 사용되는 두 가지 기능입니다. 하지만 사용 방식과 용도가 다릅니다.
### 1. `ROWNUM`
- **Oracle 전용**: `ROWNUM`은 Oracle에서 사용하는 가상의 열로, 쿼리 결과의 각 행에 대해 고유한 숫자를 부여합니다.
- **기본 사용**: 쿼리의 결과 집합에서 순서대로 1부터 시작하는 번호를 매깁니다.
- **제약**: `ROWNUM`은 결과 집합을 정렬하기 전에 적용되기 때문에, 정렬된 결과를 기준으로 번호를 매기려면 서브쿼리와 함께 사용해야 합니다.
#### 기본 사용 예제
```sql
SELECT ROWNUM, employee_name
FROM employees
WHERE department_id = 10;
```
#### 정렬된 결과에서 사용
정렬된 결과를 기반으로 `ROWNUM`을 적용하려면 서브쿼리를 사용해야 합니다:
```sql
SELECT * FROM (
SELECT ROWNUM AS rn, employee_name
FROM (
SELECT employee_name
FROM employees
WHERE department_id = 10
ORDER BY salary DESC
)
)
WHERE rn <= 5;
```
이 예제는 급여가 높은 상위 5명의 직원 정보를 가져옵니다.
### 2. `ROW_NUMBER()`
- **표준 SQL**: `ROW_NUMBER()`는 SQL 표준의 윈도우 함수로, 행의 순서에 따라 고유한 번호를 매깁니다.
- **기능**: `PARTITION BY`와 `ORDER BY`를 사용하여 특정 그룹이나 정렬 기준에 따라 번호를 부여할 수 있습니다.
- **유연성**: `ROW_NUMBER()`는 정렬된 결과에 대해 번호를 매기므로, 정렬된 데이터의 특정 부분을 쉽게 가져올 수 있습니다.
#### 기본 사용 예제
```sql
SELECT ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn, employee_name
FROM employees
WHERE department_id = 10;
```
#### 그룹화와 함께 사용
```sql
SELECT ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rn, employee_name
FROM employees;
```
이 예제는 각 부서별로 급여가 높은 순서대로 행 번호를 부여합니다.
### 요약
- **`ROWNUM`**:
- Oracle 전용.
- 쿼리 결과의 각 행에 대해 1부터 시작하는 순번을 부여.
- 서브쿼리와 함께 사용하여 정렬된 결과에서 번호를 부여할 수 있음.
- **`ROW_NUMBER()`**:
- SQL 표준 함수.
- 윈도우 함수로, 정렬된 데이터에 대해 고유 번호를 부여.
- `PARTITION BY`와 `ORDER BY`를 사용하여 그룹별 정렬된 결과에 번호를 부여.
`ROWNUM`은 주로 Oracle에서 사용되며, 간단한 행 번호 부여에 적합하지만, 정렬된 결과에서 사용하기에는 제한이 있습니다. 반면, `ROW_NUMBER()`는 표준 SQL 함수로 더 유연하고 강력한 기능을 제공하여 다양한 정렬 및 그룹화 조건을 지원합니다.