개발/SQL

3. 비개발자를 위한 SQL 조건별 집계와 HAVING 절 쉽게 배우기

devbake 2025. 8. 5. 18:53

많은 데이터 분석 초보자는 SQL의 GROUP BY 구문을 배우면서 데이터를 묶어서 합계나 평균을 구하는 데 만족한다. 하지만 실무에서는 이렇게 단순 집계만으로는 의사결정을 내리기 어렵다. 예를 들어, 마케팅팀은 “월 매출이 100만 원 이상인 달만 보고 싶다”거나 “3회 이상 구매한 고객만 분석 대상에 포함시키고 싶다”는 조건을 추가해야 할 때가 많다.

이런 요구사항을 처리하려면 GROUP BY와 함께 HAVING 절을 활용해야 한다. HAVING 절은 WHERE 절과 혼동하기 쉽지만, 작동 시점과 용도가 다르다. 이 글은 SQL을 처음 배우는 사람도 이해할 수 있도록 HAVING 절의 개념과 실무 예제를 단계별로 설명하며, 실제 업무에서 쓸 수 있는 응용 팁까지 제공한다.

 

 

1. HAVING 절이 필요한 이유

비개발자를 위한 SQL 조건별 집계와 HAVING 절 쉽게 배우기

많은 사람이 WHERE 절로 모든 조건 필터링이 가능하다고 생각한다. 그러나 WHERE 절은 데이터를 그룹화하기 전에 조건을 적용한다. 반면 HAVING 절은 그룹화가 끝난 후 집계된 결과를 필터링할 때 사용한다. 이 차이를 이해하는 것이 HAVING 절의 핵심이다.

 

2. 예제 데이터 구조 소개

이번 실습에서는 users와 orders 두 테이블을 사용한다.

- users 테이블

user_id user_name signup_date
1 김철수 2025-06-01
2 이영희 2025-06-15
3 박민수 2025-07-01
4 최유리 2025-07-20

- orders 테이블

order_id user_id amount order_date
101 1 120000 2025-07-05
102 2 90000 2025-07-10
103 1 150000 2025-08-01
104 3 80000 2025-08-05
105 1 50000 2025-08-10
106 4 200000 2025-08-12

 

3. 기본 문법

SELECT 컬럼, 집계함수()
FROM 테이블
GROUP BY 컬럼
HAVING 집계함수() 조건;
  • GROUP BY: 데이터를 묶는 기준을 설정
  • HAVING: 묶은 결과에 조건을 적용
  • 집계 함수: SUM, AVG, COUNT, MAX, MIN 등

 

4. 실무 예제

예제 1: 총 주문 금액이 200,000원 이상인 고객만 보기

SELECT 
  users.user_name,
  SUM(orders.amount) AS total_spent
FROM orders
JOIN users
ON orders.user_id = users.user_id
GROUP BY users.user_name
HAVING SUM(orders.amount) >= 200000;

결과 예시:

user_name total_spent
김철수 320000
최유리 200000

📌 마케터는 이런 식으로 쿼리를 활용해 VIP 고객 리스트를 빠르게 추출할 수 있다.

 

 

예제 2: 주문 건수가 2건 이상인 고객만 보기

SELECT 
  users.user_name,
  COUNT(orders.order_id) AS order_count
FROM orders
JOIN users
ON orders.user_id = users.user_id
GROUP BY users.user_name
HAVING COUNT(orders.order_id) >= 2;

결과 예시:

user_name order_count
김철수 3
📌 CRM 담당자는 이 결과를 통해 재구매 고객만 타겟팅하는 마케팅을 진행할 수 있다.

 

 

예제 3: 월별 매출이 150,000원 이상인 달만 보기

SELECT 
  strftime('%Y-%m', order_date) AS order_month,
  SUM(amount) AS monthly_sales
FROM orders
GROUP BY order_month
HAVING SUM(amount) >= 150000
ORDER BY order_month;

결과 예시:

order_month monthly_sales
2025-07 210000
2025-08 480000

📌 운영팀은 이를 통해 매출이 높은 달의 특징을 분석할 수 있다.

 

 

예제 4: 카테고리별 평균 주문 금액이 100,000원 이상인 경우만 보기

(카테고리 정보가 products 테이블에 있다고 가정)

SELECT 
  products.category,
  AVG(orders.amount) AS avg_amount
FROM orders
JOIN products
ON orders.product_id = products.product_id
GROUP BY products.category
HAVING AVG(orders.amount) >= 100000;

📌 상품 기획팀은 이를 기반으로 고가 상품군 중심 전략을 세울 수 있다.

 

 

5. 실무 활용 팁

  1. HAVING 절은 반드시 GROUP BY와 함께 사용해야 한다.
  2. WHERE 절과 HAVING 절을 함께 쓰면 사전 필터링 + 집계 후 필터링이 가능하다.
  3. 데이터가 많을 경우 WHERE로 먼저 불필요한 데이터를 줄이고, HAVING으로 마무리하면 성능이 좋아진다.
  4. 마케팅, 재무, 운영, 물류 등 모든 부서에서 공통으로 활용 가능하다.

 

 


결론

HAVING 절은 단순히 집계 결과를 걸러내는 도구가 아니라, 데이터 분석의 핵심 필터 역할을 한다. 비개발자라도 이번 글의 예제를 따라 해보면, 매출 분석·고객 세분화·성과 측정 등 다양한 비즈니스 상황에서 HAVING 절을 능숙하게 활용할 수 있게 된다.
다음 편에서는 서브쿼리를 활용한 중첩 조건 분석을 다뤄서, 조건이 복잡한 리포트도 자동으로 생성하는 방법을 소개하겠다.