많은 데이터 분석 초보자는 SQL의 GROUP BY 구문을 배우면서 데이터를 묶어서 합계나 평균을 구하는 데 만족한다. 하지만 실무에서는 이렇게 단순 집계만으로는 의사결정을 내리기 어렵다. 예를 들어, 마케팅팀은 “월 매출이 100만 원 이상인 달만 보고 싶다”거나 “3회 이상 구매한 고객만 분석 대상에 포함시키고 싶다”는 조건을 추가해야 할 때가 많다.
이런 요구사항을 처리하려면 GROUP BY와 함께 HAVING 절을 활용해야 한다. HAVING 절은 WHERE 절과 혼동하기 쉽지만, 작동 시점과 용도가 다르다. 이 글은 SQL을 처음 배우는 사람도 이해할 수 있도록 HAVING 절의 개념과 실무 예제를 단계별로 설명하며, 실제 업무에서 쓸 수 있는 응용 팁까지 제공한다.
1. 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 |
예제 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. 실무 활용 팁
- HAVING 절은 반드시 GROUP BY와 함께 사용해야 한다.
- WHERE 절과 HAVING 절을 함께 쓰면 사전 필터링 + 집계 후 필터링이 가능하다.
- 데이터가 많을 경우 WHERE로 먼저 불필요한 데이터를 줄이고, HAVING으로 마무리하면 성능이 좋아진다.
- 마케팅, 재무, 운영, 물류 등 모든 부서에서 공통으로 활용 가능하다.
결론
HAVING 절은 단순히 집계 결과를 걸러내는 도구가 아니라, 데이터 분석의 핵심 필터 역할을 한다. 비개발자라도 이번 글의 예제를 따라 해보면, 매출 분석·고객 세분화·성과 측정 등 다양한 비즈니스 상황에서 HAVING 절을 능숙하게 활용할 수 있게 된다.
다음 편에서는 서브쿼리를 활용한 중첩 조건 분석을 다뤄서, 조건이 복잡한 리포트도 자동으로 생성하는 방법을 소개하겠다.
'개발 > SQL' 카테고리의 다른 글
2. 비개발자를 위한 SQL 실무 튜토리얼: JOIN과 GROUP BY로 데이터 분석하기 (2) | 2025.08.03 |
---|---|
1. 비개발자를 위한 SQL 입문: 실무 예제로 배우는 SELECT 쿼리 (7) | 2025.08.01 |