본문 바로가기
자격증/정보처리기사

where ... group by 와 group by .. having 차이 차이점

by 딸기뚜왈기 2024. 10. 14.

 

 

주문일자가 20210102보다 작거나 같은 시일 이내에 고객별 주문액수 합계를 구하는" 데이터베이스 질의에서 HAVING을 사용하지 않는 이유는 조건을 적용하는 시점 때문입니다.

SQL에서 WHEREHAVING의 차이를 다시 살펴보면, 각 절은 다음과 같은 시점에서 조건을 적용합니다:

  • 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