SQL을 배우다 보면 반드시 마주치는 문법 중 하나가 GROUP BY와 HAVING입니다. 이 둘은 주로 집계 함수(COUNT, SUM, AVG, MAX, MIN)와 함께 사용되며, 데이터를 그룹으로 묶고, 그룹에 조건을 걸 때 사용합니다. 하지만 WHERE과 HAVING을 헷갈리거나, GROUP BY 없이 집계만 하려다 오류가 나는 경우도 많죠. 이번 글에서는 GROUP BY와 HAVING의 차이점과 함께 실무 예시를 통해 제대로 이해해보겠습니다.
GROUP BY란?
GROUP BY는 같은 값을 가진 행들을 하나의 그룹으로 묶어서, 각 그룹에 대해 집계 연산을 할 수 있게 합니다.
📌 기본 구조
SELECT 그룹기준컬럼, 집계함수
FROM 테이블
GROUP BY 그룹기준컬럼;
📌 예시: 부서별 직원 수 구하기
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
👉 결과: 부서별로 직원 수가 몇 명인지 출력
HAVING이란?
HAVING은 GROUP BY로 묶은 그룹에 조건을 걸기 위한 절입니다.
즉, WHERE이 행에 대한 조건이라면, HAVING은 그룹(집계된 결과)에 대한 조건입니다.
📌 기본 구조
SELECT 그룹기준컬럼, 집계함수
FROM 테이블
GROUP BY 그룹기준컬럼
HAVING 조건;
WHERE vs HAVING 차이점
항목 WHERE HAVING
적용 대상 | 행(row) | 그룹(group) |
집계 함수 사용 | ❌ 사용 불가 | ✅ 사용 가능 |
실행 시점 | GROUP BY 이전 | GROUP BY 이후 |
❗예시 비교
-- 부서별로 급여 평균이 5000 이상인 부서만 조회
-- 잘못된 예시 (집계 함수 AVG는 WHERE에서 사용 불가)
SELECT department, AVG(salary)
FROM employees
WHERE AVG(salary) > 5000 -- ❌ 오류 발생
GROUP BY department;
-- 올바른 예시
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 5000;
주요 집계 함수 (Aggregate Functions)
함수 설명 예시 결과 (부서별)
COUNT() | 행 개수 | 직원 수 |
SUM() | 합계 | 총 매출 |
AVG() | 평균 | 평균 급여 |
MAX() | 최대값 | 최고 급여 |
MIN() | 최소값 | 최저 급여 |
🛠 실무 예제
예제 1: 제품 카테고리별 총 판매 수량 구하기
SELECT category, SUM(quantity) AS total_sold
FROM sales
GROUP BY category;
예제 2: 월별 매출이 1만 이상인 달만 필터링
SELECT MONTH(sale_date) AS month, SUM(amount) AS monthly_total
FROM sales
GROUP BY MONTH(sale_date)
HAVING SUM(amount) >= 10000;
예제 3: 직원 수가 5명 이상인 부서만 보기
SELECT department, COUNT() AS employee_count
FROM employees
GROUP BY department
HAVING COUNT() >= 5;
⚠️ 주의사항
GROUP BY에 포함되지 않은 컬럼은 SELECT절에서 집계 함수로만 사용해야 합니다.
-- 오류 예시
SELECT name, COUNT(*) FROM employees GROUP BY department; -- ❌ name은 GROUP BY 대상이 아님
HAVING을 쓸 때는 집계 함수가 반드시 필요하진 않지만, 대부분의 경우 집계 조건에 사용합니다.
-- 가능하지만 특별한 경우
SELECT department
FROM employees
GROUP BY department
HAVING department LIKE 'IT%';
🧠 요약
개념 역할 위치 특징
GROUP BY | 같은 값을 가진 행을 묶기 | FROM 다음 | 주로 집계 함수와 함께 사용 |
HAVING | 그룹핑된 결과에 조건 걸기 | GROUP BY 다음 | 집계 함수 사용 가능 |
WHERE | 개별 행에 조건 걸기 | FROM 다음 | 집계 함수 사용 불가 |
✅ 마무리하며
GROUP BY와 HAVING은 SQL에서 데이터를 요약하고 통계 분석할 때 필수적인 문법입니다. 특히 집계 함수들과 함께 자주 사용되므로 WHERE와 HAVING의 역할 차이를 정확히 이해하고 있어야 쿼리 작성 실력이 향상됩니다. 처음에는 헷갈릴 수 있지만, 다양한 예제와 실습을 통해 익숙해지면 자연스럽게 사용할 수 있게 됩니다. 여러분의 데이터 분석 쿼리가 더 강력해지길 바랍니다!