DB

[MySQL] SELECT GROUP BY + HAVING (그룹화와 조건 필터링)

인생아 2025. 6. 24. 15:43
반응형

MySQL에서 데이터를 요약하거나 통계를 낼 때 가장 많이 사용되는 구문이 바로 GROUP BY이다.
그리고 그 그룹화된 결과에 조건을 걸고 싶다면, 바로 HAVING 절이 필요하다.

📌 GROUP BY란 무엇인가?

GROUP BY는 SELECT 문에서 특정 컬럼 값을 기준으로 데이터를 그룹화하는 기능이다.
주로 SUM, COUNT, AVG, MAX, MIN 같은 집계 함수와 함께 사용된다.

SELECT 컬럼, 집계함수 FROM 테이블
GROUP BY 컬럼;

예시:

SELECT city, COUNT(*) FROM users
GROUP BY city;
  • 도시(city)별로 사용자 수를 집계한다
반응형

🎯 HAVING은 왜 필요할까?

WHERE 절은 그룹화 이전에 작동하는 필터 조건이다.
하지만 집계 함수로 계산된 결과에 조건을 걸고 싶을 때는 HAVING을 사용해야 한다.

SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city
HAVING user_count > 10;
  • 도시별 사용자 수가 10명 이상인 도시만 조회

🔍 GROUP BY + HAVING 기본 예제

SELECT gender, COUNT(*) AS count
FROM users
GROUP BY gender
HAVING count >= 5;
  • 성별로 그룹화한 뒤, 5명 이상인 그룹만 필터링

🔡 다중 컬럼 그룹화

SELECT city, gender, COUNT(*) AS cnt
FROM users
GROUP BY city, gender
HAVING cnt >= 3;
  • 도시와 성별로 그룹화한 뒤, 인원이 3명 이상인 경우만 출력
반응형

📊 집계 함수와 함께 자주 쓰이는 예제

SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING avg_salary >= 5000;
  • 부서별 평균 급여가 5,000 이상인 부서만 조회
SELECT product_id, SUM(quantity) AS total_sales
FROM orders
GROUP BY product_id
HAVING total_sales > 100;
  • 상품별 총 판매량이 100을 초과하는 제품만 필터링

🔄 WHERE vs HAVING 차이 정리

항목 WHERE HAVING
적용 시점 GROUP BY 이전 GROUP BY 이후
대상 행 단위 필터링 집계 결과 필터링
집계 함수 사용 불가능 가능
 

예제 비교:

-- WHERE 사용
SELECT name FROM users
WHERE age > 20;

-- HAVING 사용
SELECT department, COUNT(*) AS dept_count
FROM users
GROUP BY department
HAVING dept_count >= 5;

🧠 실무 팁: GROUP BY + HAVING + ORDER BY + LIMIT 조합

SELECT category, COUNT(*) AS total
FROM posts
GROUP BY category
HAVING total >= 10
ORDER BY total DESC
LIMIT 5;
  • 게시글 수가 10개 이상인 카테고리 중 상위 5개를 출력

⚠️ GROUP BY 주의사항

  • SELECT에 나오는 컬럼은 반드시 GROUP BY에 포함되거나 집계 함수로 처리되어야 한다
  • HAVING 절에서는 ALIAS(별칭) 사용이 가능하지만, WHERE에서는 불가능하다
  • 성능 상 WHERE는 인덱스를 탈 수 있지만, HAVING은 그렇지 못한 경우가 많다

📎 공식 문서 참고

MySQL GROUP BY & HAVING 공식 가이드
https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html

반응형