`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` 절이 처리된 이후에 적용됩니다. 이 조건을 통해 특정 기준에 맞는 그룹만을 선택할 수 있습니다.
'Data Analysis 데이터 분석 > SQL 통한 Database 관리' 카테고리의 다른 글
group by할 열에 null이 있을 경우 (0) | 2024.08.29 |
---|---|
group by의 기준이 되는 칼럼이 아닌 다른 칼럼에서 null 있으면? (1) | 2024.08.29 |
select from group by having order by 순서 (0) | 2024.08.29 |
order by (case when id = 999 then 0 else id end) (4) | 2024.08.29 |
GROUP BY 쿼리에서는 `ORDER BY` 절에서 사용하는 모든 열이 `SELECT`나 `GROUP BY` 절에 있어야 (0) | 2024.08.29 |