HAVING 절과 조건부 집계
: 집계함수를 한 단계 더 활용하는 방법
SQL의 GROUP BY는 알고 있지만, 그 결과에 조건을 걸 수 있는 HAVING 절은 아직 낯설게 느껴지시나요?
안녕하세요!
오늘은 SQL에서 데이터를 집계할 때 유용하게 사용할 수 있는 HAVING 절에 대해 자세히 알아보려 합니다.
많은 분들이 WHERE와 GROUP BY는 익숙하지만, 그 다음 단계인 HAVING 절의 쓰임새에 대해서는 헷갈리거나 잘 사용하지 않는 경우가 많아요.
하지만 데이터를 좀 더 정교하게 다루기 위해서는 꼭 알아야 할 부분이죠.
이번 글에서는 HAVING 절이 왜 필요한지, 그리고 어떻게 활용할 수 있는지 실습 예제를 통해 함께 알아보겠습니다.
이 글을 끝까지 읽으시면, 매출이 높은 상위 카테고리를 필터링하거나 조건에 맞는 그룹 데이터를 추출하는 방법까지 완벽하게 익히실 수 있어요.
자, 그럼 지금부터 HAVING 절의 매력에 빠져볼 준비 되셨나요? 😊
목차
1. HAVING 절이란? 왜 필요할까
SQL에서 HAVING 절은 GROUP BY로 집계된 결과에 조건을 걸기 위해 사용됩니다.
일반적으로 조건을 걸 때는 WHERE
절을 많이 쓰지만, 이 절은 집계 함수(Aggregate Function)와 함께 사용할 수 없습니다.
그래서 등장한 것이 바로 HAVING입니다.
HAVING 절은 GROUP BY
로 묶인 각 그룹에 대해 SUM, COUNT, AVG, MAX, MIN 등의 집계 함수를 기준으로 조건을 거는 데 쓰여요.
예를 들어,
전체 매출을 카테고리별로 묶은 뒤, 매출이 1,000만 원 이상인 카테고리만 보고 싶다면 HAVING 절이 꼭 필요하겠죠?
🚫 WHERE 절만으로는 안 되는 이유
-
WHERE
절은 집계 함수와 함께 사용 불가 -
HAVING
은 GROUP BY 이후의 결과를 필터링할 수 있음
📊 HAVING 절을 사용한 기본 예제
SELECT category, SUM(sales) AS total_sales
FROM sales_data
GROUP BY category
HAVING SUM(sales) > 10000000;
위 쿼리는 카테고리별 총 매출이 1,000만 원 이상인 경우만 결과로 보여줘요.
HAVING SUM(sales) > 10000000
부분이 바로 포인트입니다.
✔️ 왜 실무에서 자주 쓰일까?
- 조건에 맞는 매출/사용자/주문 데이터를 필터링해야 할 때
- 운영 보고서, 대시보드 생성 시 조건부 요약 필수
- 비즈니스 인사이트 도출을 위해 중요한 기준 필터링 필요
HAVING 절은 단순 통계를 넘어서 조건 기반 분석을 할 수 있도록 도와줍니다.
보고서나 BI툴에 쿼리를 연동할 때도 거의 필수처럼 등장하죠.
실무에서 데이터를 다룬다면 꼭 알아둬야 할 필수 기술이라고 할 수 있어요.
2. WHERE 절과 HAVING 절의 차이점
HAVING 절을 제대로 활용하려면, 먼저 WHERE 절과의 차이점을 확실히 이해하고 있어야 해요.
둘 다 '조건을 거는 문장'이라는 점에서 비슷해 보이지만, 작동하는 시점과 대상이 전혀 다릅니다.
🔍 WHERE vs HAVING 작동 시점 비교
항목 | WHERE 절 | HAVING 절 |
---|---|---|
적용 시점 | GROUP BY 전에 작동 | GROUP BY 이후에 작동 |
적용 대상 | 개별 행(Row) | 그룹(Group) |
집계 함수 사용 | 불가능 ❌ | 가능 ✅ |
즉, WHERE
은 원천 데이터에 조건을 걸고, HAVING
은 그룹핑된 결과에 조건을 거는 거예요.
📌 예제로 비교해 보기
1) 특정 지역만 조회 (WHERE 사용)
SELECT region, COUNT(*)
FROM customer_data
WHERE region = '서울'
GROUP BY region;
2) 가입자가 100명 이상인 지역만 조회 (HAVING 사용)
SELECT region, COUNT(*) AS total_users
FROM customer_data
GROUP BY region
HAVING COUNT(*) >= 100;
같은 데이터셋이더라도 목적에 따라 WHERE 또는 HAVING 중 어떤 절을 써야 할지가 달라집니다.
조건이 행 단위냐, 그룹 단위냐가 핵심이에요!
💡 TIP: WHERE과 HAVING 같이 쓰기
두 절은 동시에 사용할 수 있습니다!
WHERE로 먼저 데이터를 필터링하고, 그 이후 HAVING으로 조건을 추가해 더 정교한 분석을 할 수 있어요.
SELECT region, COUNT(*) AS total_users
FROM customer_data
WHERE status = '활성'
GROUP BY region
HAVING COUNT(*) > 100;
3. HAVING 절 기본 예제
이제 HAVING 절이 어떤 역할을 하는지는 알았으니, 실제 예제를 통해 감을 잡아볼 시간이에요.
가장 기본적인 예제부터 단계별로 살펴보겠습니다.
📝 기본 예제: 상품별 주문 건수 필터링
상황: 어떤 쇼핑몰에서 상품별 주문 건수를 구한 뒤, 10건 이상 팔린 상품만 보고 싶다고 가정해볼게요.
SELECT product_name, COUNT(*) AS order_count
FROM orders
GROUP BY product_name
HAVING COUNT(*) >= 10;
이 쿼리는 주문 내역(orders) 테이블에서 상품별로 주문 수를 계산하고, 그 결과 중 10건 이상 주문된 상품만 출력합니다.
매출 상위 상품 분석이나 인기 상품 필터링에 아주 유용하죠.
📊 조건을 다양하게 바꿔보기
조건 | HAVING 구문 예시 |
---|---|
10건 이상 | HAVING COUNT(*) >= 10 |
50건 미만 | HAVING COUNT(*) < 50 |
정확히 100건 | HAVING COUNT(*) = 100 |
HAVING
뒤에는 수치 비교 연산자, 논리 연산자 등도 자유롭게 조합해서 사용할 수 있어요.
예를 들어,
매출이 1,000만 원 이상이면서 주문 건수가 20건 이상인 상품을 추출하려면 다음처럼 쓰면 됩니다:
SELECT product_name, SUM(sales_amount) AS total_sales, COUNT(*) AS order_count
FROM orders
GROUP BY product_name
HAVING SUM(sales_amount) >= 10000000 AND COUNT(*) >= 20;
이제 HAVING 절이 어떤 식으로 응용되는지 조금 감이 오시죠? 😊
이런 기본 예제는 앞으로 이어질 실습에서도 꼭 필요하니까, 잘 익혀두세요!
4. 조건에 맞는 그룹만 필터링하기 🧐
이번에는 HAVING 절을 활용해서 특정 조건을 만족하는 그룹 데이터만 필터링하는 실전 예제를 알아볼게요.
이건 실무에서 굉장히 자주 쓰이는데,
예를 들어
고객별 총 주문 수, 지역별 총 매출, 회원 등급별 활동량 등을 비교할 때 유용하답니다.
👥 예제: 고객별 총 주문액이 50만 원 이상인 고객 조회
SELECT customer_id, SUM(order_amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(order_amount) >= 500000;
이 쿼리는 각 고객의 총 주문 금액을 계산한 뒤, 50만 원 이상 지출한 고객만을 결과로 보여줍니다.
이런 방식은 마케팅 대상 고객 선정, 리텐션 분석, VIP 고객 식별 등에 많이 활용돼요.
📌 WHERE와 HAVING 같이 써서 필터링 정교화하기
“최근 1년간 주문 중에서만 조건을 적용하고 싶다”는 상황이라면?
그럴 땐 WHERE 절로 먼저 기간 조건을 걸고, HAVING 절로 그룹 조건을 걸면 됩니다!
SELECT customer_id, SUM(order_amount) AS total_spent
FROM orders
WHERE order_date >= '2024-04-01'
GROUP BY customer_id
HAVING SUM(order_amount) >= 500000;
이렇게 하면 2024년 4월 이후 주문 중, 50만 원 이상 지출한 고객만 추출할 수 있어요.
데이터 전처리를 적절히 조합하면, HAVING 절은 정말 강력한 무기가 된답니다.
💡 다양한 조건 조합해보기
-
HAVING AVG(order_amount) BETWEEN 10000 AND 50000
: 평균 주문금액 조건 -
HAVING COUNT(DISTINCT product_id) > 5
: 다양한 상품 구매한 고객
실제 업무에 HAVING을 적용해보면, 고객 세분화나 리포트 필터링을 굉장히 유연하게 할 수 있다는 걸 느끼게 될 거예요. 정말 잘 쓰면 기초 SQL에서 한 단계 올라선 느낌! ✨
5. 매출이 높은 상위 카테고리 조회하기 💰
이번엔 실무에서 아주 자주 등장하는 쿼리 실습이에요.
바로 매출 기준으로 상위 카테고리만 필터링해서 조회하는 상황입니다.
BI 보고서, 마케팅 분석, 사업전략 수립 등 수많은 실전 업무에서 이 로직은 매일같이 쓰여요!
💼 실전 예제: 매출 상위 카테고리 3개만 조회
카테고리별 매출을 집계한 뒤, 상위 3개만 출력하는 쿼리입니다.
SELECT category, SUM(sales_amount) AS total_sales
FROM orders
GROUP BY category
ORDER BY total_sales DESC
LIMIT 3;
이 쿼리는 HAVING
절이 아닌 ORDER BY + LIMIT
을 통해 상위 n개 그룹을 추출하는 방식이에요.
그럼 HAVING은 어떤 역할을 할까요?
🧾 조건부 상위 필터링 예제
이번엔 “매출이 1억 이상인 카테고리만 출력하자”는 조건을 추가해볼게요.
SELECT category, SUM(sales_amount) AS total_sales
FROM orders
GROUP BY category
HAVING SUM(sales_amount) >= 100000000
ORDER BY total_sales DESC;
여기서는 HAVING 절이 매출 기준 필터링 역할을 합니다.
ORDER BY는 정렬만 담당하고, WHERE로는 할 수 없었던 집계 조건은 HAVING이 처리하는 거예요.
💡 같이 쓰면 강력한 조합
- HAVING으로 조건을 먼저 거르고
- ORDER BY로 순서를 정렬하고
- LIMIT으로 상위 n개만 보여주기
이 3단계 조합은 정말 자주 쓰이고, 보고서 자동화나 Top N 분석에 탁월한 성능을 보여줘요.
6. 정리 🧠
지금까지 HAVING 절에 대해 기본 개념부터 실전 예제까지 다양하게 알아봤어요.
처음엔 WHERE와의 차이가 헷갈릴 수 있지만, 막상 한두 번 써보면 금방 익숙해지실 거예요.
HAVING은 단순한 문법이 아니라 집계된 데이터를 조건에 맞게 필터링함으로써 SQL을 좀 더 분석적으로 사용할 수 있도록 만들어주는 강력한 도구입니다.
실무에서는 이런 식으로도 자주 써요:
- 고객별 구매 패턴 분석 (재구매 고객 필터링)
- 상위 성과 지점/카테고리/부서 분석
- 조건부 KPI 리포트 필터링
이제 HAVING 절이 단순한 집계 함수 뒤에 붙는 보조 옵션이 아니라, 데이터 분석을 훨씬 정교하게 만드는 핵심 문법이라는 점, 이해되셨죠?
꼭 직접 쿼리를 짜보며 익혀보세요!
'Database' 카테고리의 다른 글
VIEW와 INDEX의 이해와 활용법 총정리 (0) | 2025.04.09 |
---|---|
데이터베이스 내장함수 활용 완전정복 (0) | 2025.04.09 |
GROUP BY와 집계함수로 배우는 데이터 분석의 첫걸음 (0) | 2025.04.08 |
서브쿼리(Subquery)의 모든 것: 복잡한 데이터도 쉽게 다루는 SQL 비법 (2) | 2025.04.08 |
다양한 JOIN 활용하기 : 테이블 관계를 한눈에! (1) | 2025.04.08 |