SQL 통한 Database 관리

having count(*)=2

JBS 12 2024. 8. 29. 20:57

`HAVING COUNT(*) = 2` 조건은 `GROUP BY` 절로 그룹화된 각 그룹에서 **행의 개수가 정확히 2개인 그룹**만 결과로 반환하라는 의미입니다. `HAVING` 절은 `GROUP BY`에 의해 생성된 각 그룹에 대한 조건을 필터링할 때 사용됩니다.

### 예제

가령, 다음과 같은 `orders` 테이블이 있다고 가정해 봅시다:

| order_id | customer_id | amount |
|----------|-------------|--------|
| 1        | 101         | 250    |
| 2        | 102         | 150    |
| 3        | 101         | 200    |
| 4        | 103         | 300    |
| 5        | 102         | 100    |
| 6        | 101         | 50     |

이제, 각 고객(`customer_id`) 별로 주문이 정확히 2개인 고객만을 선택하고 싶다면, 다음과 같이 쿼리를 작성할 수 있습니다:

```sql
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) = 2;
```

### 쿼리의 동작 방식

1. **데이터 로드**:
   - SQL 엔진이 `orders` 테이블의 데이터를 로드합니다.

   | order_id | customer_id | amount |
   |----------|-------------|--------|
   | 1        | 101         | 250    |
   | 2        | 102         | 150    |
   | 3        | 101         | 200    |
   | 4        | 103         | 300    |
   | 5        | 102         | 100    |
   | 6        | 101         | 50     |

2. **`GROUP BY` 실행**:
   - `customer_id` 열을 기준으로 데이터를 그룹화합니다.
   - 동일한 `customer_id` 값을 가진 행들이 하나의 그룹으로 묶입니다.

   결과:
   - `customer_id = 101` 그룹: 주문 3건
   - `customer_id = 102` 그룹: 주문 2건
   - `customer_id = 103` 그룹: 주문 1건

3. **집계 함수 실행 (`COUNT(*)`)**:
   - 각 그룹 내의 행 개수를 계산합니다.

   | customer_id | order_count |
   |-------------|-------------|
   | 101         | 3           |
   | 102         | 2           |
   | 103         | 1           |

4. **`HAVING` 조건 적용**:
   - `HAVING COUNT(*) = 2` 조건에 따라, `order_count`가 2인 그룹만을 필터링합니다.
  
   결과:
   - `customer_id = 102` 그룹만 결과에 포함됩니다.

5. **최종 결과 반환**:

   | customer_id | order_count |
   |-------------|-------------|
   | 102         | 2           |

### 결과 해석

- 이 쿼리는 주문이 정확히 2건인 고객만을 결과로 반환합니다.
- 위 예제에서는 `customer_id = 102`인 고객만이 이 조건을 만족하므로, 해당 고객의 정보가 반환됩니다.

### 결론

`HAVING COUNT(*) = 2`는 `GROUP BY` 절로 묶인 각 그룹에서 행의 개수가 정확히 2개인 그룹만을 필터링하는 데 사용됩니다. `HAVING` 절은 `GROUP BY`의 결과를 기반으로 필터링을 수행하므로, `WHERE` 절이 처리된 이후에 적용됩니다. 이 조건을 통해 특정 기준에 맞는 그룹만을 선택할 수 있습니다.