오라클 SQL · 함수와 집계

GROUP BY와 HAVING으로 그룹별 집계하기

집계 함수의 진짜 힘은 그룹 단위 요약에서 드러난다. GROUP BY는 데이터를 기준별로 묶고, HAVING은 집계 결과를 다시 필터링한다.

GROUP BY와 HAVING으로 그룹별 집계하기 대표 이미지

이 글에서 꼭 잡아야 할 것

집계 함수의 진짜 힘은 그룹 단위 요약에서 드러난다. GROUP BY는 데이터를 기준별로 묶고, HAVING은 집계 결과를 다시 필터링한다.

GROUP BY는 SQL의 시야를 행 단위에서 그룹 단위로 바꾸는 절이다. 부서별 급여 합계, 월별 주문 건수처럼 데이터를 묶어 해석하는 순간 SQL은 단순 조회를 넘어 분석 도구가 된다. HAVING은 그 분석 결과 중 의미 있는 그룹만 다시 남기는 단계다.

난이도 초급
모듈 함수와 집계
학습 시간 10분
핵심 키워드 GROUP BY, HAVING, Aggregate

개념 지도와 이해 포인트

그룹화 기준 GROUP BY에 적은 컬럼 값이 같은 행끼리 하나의 그룹이 된다. 그룹 기준을 어떻게 나누느냐에 따라 요약 결과가 완전히 달라진다.
집계 후 필터링 HAVING은 집계가 끝난 뒤 그룹 결과를 거르는 절이다. WHERE와 역할이 다르므로 적용 시점을 명확히 구분해야 한다.
선택 가능한 컬럼 SELECT에 일반 컬럼을 쓰려면 반드시 GROUP BY에 포함되어야 한다. 그렇지 않으면 문장 오류가 발생한다.
GROUP BY와 HAVING으로 그룹별 집계하기 개념 다이어그램

대표 문법 패턴

SELECT department_id,
       COUNT(*) AS employee_count,
       AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) >= 5000
ORDER BY department_id;

문법 읽는 포인트

  • WHERE는 그룹화 이전 행 필터, HAVING은 그룹화 이후 결과 필터다.
  • SELECT의 일반 컬럼은 GROUP BY 기준 컬럼과 일치해야 한다.
  • 정렬은 집계가 끝난 뒤 ORDER BY에서 처리한다.

핵심 용어

  • GROUP BY
  • HAVING
  • Aggregate

부서별 인원 수와 평균 급여 분석하기

WHERE와 HAVING을 분리해서 읽는 습관이 중요하다. 먼저 필요한 행을 줄이고, 그다음 그룹을 만들고, 마지막으로 의미 있는 그룹만 남기면 문장 흐름이 깔끔해진다.

SELECT department_id,
       COUNT(*) AS emp_count,
       MIN(salary) AS min_salary,
       MAX(salary) AS max_salary
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id
HAVING COUNT(*) >= 3
ORDER BY emp_count DESC;

수험 체크포인트와 자주 하는 실수

시험 체크포인트

  • GROUP BY 문제는 SELECT 절의 일반 컬럼이 모두 그룹 기준에 포함되었는지 먼저 보자.
  • HAVING은 집계 함수 조건과 함께 등장하는 경우가 많다.
  • WHERE와 HAVING의 적용 시점은 반드시 구분해서 암기해야 한다.

자주 하는 실수

  • 집계 함수를 WHERE에서 바로 비교하려는 실수
  • GROUP BY 없이 일반 컬럼과 집계 함수를 함께 선택하는 실수
  • HAVING을 단순히 WHERE의 대체 문법으로 외우는 실수

연결 학습

그룹별 집계를 익히면 여러 테이블을 함께 읽는 조인으로 넘어갈 준비가 된다. 다음 챕터에서는 ANSI INNER JOIN부터 시작한다.

댓글 0

작성자 이름과 댓글 내용을 입력하면 바로 등록됩니다. 답글은 한 단계까지 지원하고, 댓글은 최대 200자까지 작성할 수 있습니다.

일반 댓글 작성

댓글을 불러오는 중입니다.

같은 카테고리에서 이어서 읽기

지금 읽은 글과 가까운 흐름의 글 5개를 모아 두었습니다. 바로 앞뒤 문맥을 이어서 읽고 싶을 때 가장 편합니다.