group by의 기준이 되는 칼럼이 아닌 다른 칼럼에서 null 있으면?
`GROUP BY` 기준이 되는 열이 아닌 다른 열에 `NULL` 값이 있는 경우, 해당 열의 `NULL` 값은 집계 함수에 따라 처리 방식이 다를 수 있습니다. 일반적으로 `NULL` 값은 다음과 같은 방식으로 처리됩니다:
1. **집계 함수가 `NULL`을 무시하는 경우**:
- `SUM`, `COUNT`, `AVG` 같은 함수는 `NULL` 값을 무시하고 계산합니다.
- 예를 들어, `SUM`은 `NULL` 값을 포함하지 않고, 숫자 값만 합산합니다.
2. **집계 함수가 `NULL`을 특별하게 처리하는 경우**:
- `COUNT` 함수는 `NULL` 값이 있는 열의 경우, `COUNT(*)`는 모든 행을 계산하지만 `COUNT(column_name)`은 `NULL`을 제외한 행만 계산합니다.
- `MIN`, `MAX` 같은 함수는 `NULL`을 무시하고 최솟값 또는 최댓값을 찾습니다.
### 예제
`employees`라는 테이블이 있고, `department`와 `salary` 열이 포함되어 있다고 가정합시다.
| id | department | salary |
|-----|------------|--------|
| 1 | HR | 5000 |
| 2 | IT | 6000 |
| 3 | HR | NULL |
| 4 | IT | 7000 |
| 5 | Sales | NULL |
### 쿼리
```sql
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department;
```
### 동작 방식
1. **데이터 로드**:
- SQL 엔진이 `employees` 테이블의 데이터를 로드합니다.
| id | department | salary |
|-----|------------|--------|
| 1 | HR | 5000 |
| 2 | IT | 6000 |
| 3 | HR | NULL |
| 4 | IT | 7000 |
| 5 | Sales | NULL |
2. **`GROUP BY` 실행**:
- `department` 열을 기준으로 데이터를 그룹화합니다.
- 동일한 `department` 값을 가진 행들이 하나의 그룹으로 묶입니다.
결과:
- `HR` 그룹:
| id | department | salary |
|-----|------------|--------|
| 1 | HR | 5000 |
| 3 | HR | NULL |
- `IT` 그룹:
| id | department | salary |
|-----|------------|--------|
| 2 | IT | 6000 |
| 4 | IT | 7000 |
- `Sales` 그룹:
| id | department | salary |
|-----|------------|--------|
| 5 | Sales | NULL |
3. **집계 함수 실행 (`SUM`)**:
- `SUM(salary)` 함수가 각 그룹 내에서 실행됩니다.
- `NULL` 값은 무시되고, `SUM`은 숫자 값만 합산합니다.
결과:
- `HR` 그룹의 합계: `5000` (여기서 `NULL`은 무시됩니다)
- `IT` 그룹의 합계: `6000 + 7000 = 13000`
- `Sales` 그룹의 합계: `NULL` (숫자 값이 없으므로 합계는 `NULL`)
4. **최종 결과 반환**:
| department | total_salary |
|------------|--------------|
| HR | 5000 |
| IT | 13000 |
| Sales | NULL |
### 결과 해석
- **`HR` 그룹**: `HR` 그룹 내에 `NULL` 값이 있지만, `SUM` 함수는 이를 무시하고 숫자 값만 합산합니다.
- **`IT` 그룹**: 모든 `salary` 값이 숫자이므로 합산됩니다.
- **`Sales` 그룹**: `Sales` 그룹에는 `NULL` 값만 존재하기 때문에, 합계도 `NULL`로 나타납니다.
### 결론
`GROUP BY` 기준이 아닌 열에 `NULL` 값이 있을 경우:
- 대부분의 집계 함수는 `NULL` 값을 무시하고 작업을 수행합니다.
- `SUM`, `AVG`, `COUNT(column_name)` 등은 `NULL` 값을 포함하지 않습니다.
- `MIN`, `MAX`는 `NULL` 값을 무시하고 최솟값 또는 최댓값을 계산합니다.
- `COUNT(*)`는 모든 행을 계산하므로 `NULL` 값도 포함됩니다.
이러한 특성을 이해하고, `NULL` 값이 집계 결과에 미치는 영향을 예측하여 쿼리를 작성해야 합니다.