SQL 통한 Database 관리

group by의 기준이 되는 칼럼이 아닌 다른 칼럼에서 null 있으면?

JBS 12 2024. 8. 29. 20:57

`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` 값이 집계 결과에 미치는 영향을 예측하여 쿼리를 작성해야 합니다.