SQL
[SQL#9] GROUP BY / HAVING
j.d
2025. 4. 16. 20:25
SQL에서 데이터를 그룹 단위로 요약하거나 조건을 걸고 싶을 때 사용하는 문법이 GROUP BY와 HAVING입니다.
특히 COUNT, SUM, AVG 등의 집계 함수와 함께 쓰일 때 강력한 기능을 발휘합니다.
1. GROUP BY
GROUP BY 함수는 컬럼 내 공통된 값을 기준으로 데이터를 그룹화합니다.
SELECT 그룹기준컬럼, 집계함수
FROM 테이블명
GROUP BY 그룹기준컬럼;
SELECT department, COUNT(*) AS count
FROM employees
GROUP BY department;
→ 부서별로 몇 명의 직원이 있는지 집계
department | count |
Sales | 5 |
HR | 2 |
IT | 3 |
2. HAVING
HAVING 함수는 그룹화된 결과에 조건을 적용할 때 사용됩니다.
SELECT 그룹기준컬럼, 집계함수
FROM 테이블명
GROUP BY 그룹기준컬럼
HAVING 조건;
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 5000;
→ 평균 급여가 5000 이상인 부서만 조회
※ WHERE vs HAVING
구분 | WHERE | HAVING |
시점 | 그룹화 이전 | 그룹화 이후 |
대상 | 개별 행 조건 | 그룹 전체(집계 결과) 조건 |
예시 | WHERE salary > 3000 | HAVING AVG(salary) > 3000 |
예시
예시 테이블: sales
id | region | sales_amount |
1 | East | 1000 |
2 | East | 2000 |
3 | West | 1500 |
4 | West | NULL |
5 | South | 3000 |
1) 지역별 매출 합계
SELECT region, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY region;
→ NULL 제외 후 지역별 합계를 반환
region | total_sales |
East | 3000 |
West | 1500 |
South | 3000 |
2) 매출 합계가 2000 이상인 지역만 조회
SELECT region, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY region
HAVING SUM(sales_amount) >= 2000;
→ 그룹화된 결과에 조건을 걸 때는 HAVING 사용
region | total_sales |
East | 3000 |
South | 3000 |