반응형

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 절은 집계 함수와 함께 사용 불가
  • HAVINGGROUP 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 부분이 바로 포인트입니다.

✔️ 왜 실무에서 자주 쓰일까?

  1. 조건에 맞는 매출/사용자/주문 데이터를 필터링해야 할 때
  2. 운영 보고서, 대시보드 생성 시 조건부 요약 필수
  3. 비즈니스 인사이트 도출을 위해 중요한 기준 필터링 필요

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이 처리하는 거예요.

💡 같이 쓰면 강력한 조합

  1. HAVING으로 조건을 먼저 거르고
  2. ORDER BY로 순서를 정렬하고
  3. LIMIT으로 상위 n개만 보여주기

이 3단계 조합은 정말 자주 쓰이고, 보고서 자동화나 Top N 분석에 탁월한 성능을 보여줘요.

 

 

6. 정리 🧠

지금까지 HAVING 절에 대해 기본 개념부터 실전 예제까지 다양하게 알아봤어요.

처음엔 WHERE와의 차이가 헷갈릴 수 있지만, 막상 한두 번 써보면 금방 익숙해지실 거예요.

HAVING은 단순한 문법이 아니라 집계된 데이터를 조건에 맞게 필터링함으로써 SQL을 좀 더 분석적으로 사용할 수 있도록 만들어주는 강력한 도구입니다.

 

실무에서는 이런 식으로도 자주 써요:

  • 고객별 구매 패턴 분석 (재구매 고객 필터링)
  • 상위 성과 지점/카테고리/부서 분석
  • 조건부 KPI 리포트 필터링

 

이제 HAVING 절이 단순한 집계 함수 뒤에 붙는 보조 옵션이 아니라, 데이터 분석을 훨씬 정교하게 만드는 핵심 문법이라는 점, 이해되셨죠?

꼭 직접 쿼리를 짜보며 익혀보세요!

 

반응형

+ Recent posts