주문일자가 20210102보다 작거나 같은 시일 이내에 고객별 주문액수 합계를 구하는" 데이터베이스 질의에서 HAVING을 사용하지 않는 이유는 조건을 적용하는 시점 때문입니다.
SQL에서 WHERE와 HAVING의 차이를 다시 살펴보면, 각 절은 다음과 같은 시점에서 조건을 적용합니다:
- WHERE: 데이터를 그룹화하기 전에 행 단위에서 필터링을 수행합니다.
- HAVING: 그룹화한 후에 집계 결과를 대상으로 조건을 걸 때 사용됩니다.
이 경우, **"주문일자가 20210102보다 작거나 같은 시일"**이라는 조건은 각각의 개별 주문에 대한 조건이므로, 그룹화되기 전에 필터링이 되어야 합니다. 따라서, 이 조건은 WHERE 절에 사용됩니다.
예시 쿼리:
SELECT customer_id, SUM(order_amount) AS total_amount
FROM orders
WHERE order_date <= '2021-01-02'
GROUP BY customer_id;
- WHERE 절은 그룹화 전에 order_date가 2021-01-02 이전인 주문만 필터링합니다.
- 그 후 GROUP BY를 통해 고객별(customer_id)로 그룹화하고, 각 고객의 주문액 합계(SUM(order_amount))를 계산합니다.
왜 HAVING을 사용하지 않나요?
- 이 쿼리에서 order_date <= '2021-01-02' 조건은 개별 행(주문)에 적용되는 조건입니다. 즉, **집계 함수(SUM)**가 적용되기 전에 이미 필터링이 되어야 하므로, WHERE 절을 사용하는 것이 맞습니다.
- HAVING은 그룹화된 결과에 조건을 적용할 때 사용되는데, 이 쿼리에서는 집계 결과에 대한 추가적인 조건이 없기 때문에 HAVING이 필요하지 않습니다.
HAVING을 사용할 수 있는 경우:
HAVING 절은 주로 집계 함수 결과에 조건을 걸고 싶을 때 사용됩니다. 예를 들어, "고객별 주문액 합계가 5000을 초과하는 고객만 선택"하고 싶다면, HAVING을 사용합니다.
SELECT customer_id, SUM(order_amount) AS total_amount
FROM orders
WHERE order_date <= '2021-01-02'
GROUP BY customer_id
HAVING SUM(order_amount) > 5000;
- 여기서는 SUM(order_amount)가 5000을 초과하는 그룹만 선택하기 때문에 HAVING 절이 필요합니다.
결론:
- WHERE는 개별 행에 조건을 적용하므로 order_date 같은 필터링 조건은 WHERE에서 처리됩니다.
- HAVING은 집계 함수의 결과에 조건을 걸 때 사용됩니다. 즉, 고객별 주문액 합계 등 집계 결과에 조건을 적용할 때 HAVING을 사용하게 됩니다.
'자격증 > 정보처리기사' 카테고리의 다른 글
시험전 확인 (2) | 2024.10.18 |
---|---|
[C언어]scanf , 생성자 (0) | 2024.10.16 |
[서브넷마스크 계산] FLSM vs VLSM 차이 (0) | 2024.10.15 |
[서브넷 마스크] IPv4 범위 클래스 계산 이유 (0) | 2024.10.15 |
개인적리 (0) | 2024.07.26 |