핵심 인사이트 (3줄 요약)

  1. 본질: 집계 함수(Aggregate Function)는 여러 행(Row)의 값을 하나의 결과값으로 요약하는 SQL(Structured Query Language) 함수로, GROUP BY와 결합하여 그룹별 통계를 생성하는 데이터 분석의 핵심 도구다.
  2. 가치: 수백만 건의 트랜잭션에서 일 매출 합계, 평균 주문금액, 최대·최소 거래액을 단일 쿼리로 추출할 수 있어, 보고서·대시보드·BI(Business Intelligence) 분석의 기반이 된다.
  3. 판단 포인트: NULL 처리 방식이 함수마다 다르며, HAVING은 집계 후 필터링, WHERE는 집계 전 필터링이라는 처리 순서가 성능과 결과의 핵심 차이를 만든다.

Ⅰ. 개요 및 필요성

집계 함수는 SQL에서 다수의 행을 하나의 요약 값으로 압축하는 연산이다. 단일 행 함수(UPPER, SUBSTR 등)가 행마다 독립적으로 동작하는 것과 달리, 집계 함수는 행 집합 전체를 입력으로 받아 스칼라(Scalar) 값 하나를 반환한다.

비즈니스 현장에서 "이번 달 총 매출은 얼마인가?", "지역별 평균 배송 시간은?", "가장 많이 팔린 상품은?" 같은 질문은 집계 없이 답할 수 없다. 집계 함수는 이런 질문에 SQL 한 문장으로 답하는 능력을 제공한다.

집계 함수 없으면 발생하는 문제:

  • 애플리케이션 레이어에서 루프를 돌며 합산 → 수백만 건 처리 시 성능 재앙

  • RDBMS의 인덱스·통계 최적화를 우회 → 전체 테이블 스캔 반복

  • 코드 복잡도 증가 → 버그 유입 및 유지보수 비용 급증

  • 📢 섹션 요약 비유: 집계 함수는 '창고 재고 조사 시 스캐너로 모든 상자를 찍고 총계를 내는 자동화 장치' 와 같습니다. 직원이 하나씩 세는 대신 스캐너(집계 함수)가 순식간에 총합, 평균, 최대·최소를 뽑아냅니다.


Ⅱ. 아키텍처 및 핵심 원리

1. 5대 집계 함수 특성

함수기능NULL 처리반환 타입
COUNT(*)전체 행 수NULL 포함정수
COUNT(열)NULL 아닌 행 수NULL 제외정수
SUM(열)합계NULL 제외숫자
AVG(열)평균NULL 제외실수
MAX(열)최대값NULL 제외열과 동일
MIN(열)최소값NULL 제외열과 동일

2. GROUP BY와 HAVING의 처리 순서

SQL 실행 논리 순서 (집계 관련)

  ① FROM        — 테이블 읽기
  │
  ▼
  ② WHERE       — 행 단위 필터 (집계 전!)
  │
  ▼
  ③ GROUP BY    — 그룹 단위 묶기
  │
  ▼
  ④ 집계 함수   — SUM, AVG, MAX 등 계산
  │
  ▼
  ⑤ HAVING     — 그룹 단위 필터 (집계 후!)
  │
  ▼
  ⑥ SELECT     — 출력 열 선택
  │
  ▼
  ⑦ ORDER BY   — 정렬

핵심 판단: 집계 결과(SUM, COUNT 등)를 조건으로 필터링하려면 반드시 HAVING을 써야 한다. WHERE 절에서는 집계 함수를 쓸 수 없다.

3. 실전 예시

-- 부서별 평균 연봉이 500만 원 이상인 부서만 조회
SELECT   dept_id,
         AVG(salary)   AS avg_salary,
         COUNT(*)      AS headcount
FROM     employees
WHERE    hire_date >= '2020-01-01'   -- ① 집계 전 행 필터
GROUP BY dept_id                      -- ② 그룹화
HAVING   AVG(salary) >= 5000000       -- ③ 집계 후 그룹 필터
ORDER BY avg_salary DESC;
  • 📢 섹션 요약 비유: WHERE와 HAVING의 차이는 '시험 전 응시 자격 필터링(WHERE)과 시험 후 합격 그룹 필터링(HAVING)' 의 차이입니다. 자격 조건은 시험 보기 전에 걸러내고(WHERE), 그룹 평균 점수가 기준 이상인 팀만 선발하는 것은 시험 후에 결정합니다(HAVING).

Ⅲ. 비교 및 연결

집계 함수 vs. 윈도우 함수

집계 함수와 윈도우 함수(Window Function)는 모두 집계 연산을 수행하지만, 핵심 차이는 행의 수다.

구분집계 함수 + GROUP BY윈도우 함수 (OVER)
결과 행 수그룹당 1행으로 압축원본 행 수 유지
개별 행 접근불가가능
사용 위치SELECT, HAVINGSELECT, ORDER BY
예시GROUP BY dept, SUM(salary)SUM(salary) OVER (PARTITION BY dept)
-- 윈도우 함수: 각 직원의 행을 유지하면서 부서 합계도 같이 조회
SELECT emp_name,
       salary,
       SUM(salary) OVER (PARTITION BY dept_id) AS dept_total
FROM   employees;

NULL과 AVG의 함정

-- 주의: AVG는 NULL을 제외하고 계산한다
-- 실제 데이터: [100, 200, NULL, 300] → AVG = (100+200+300)/3 = 200
-- NULL을 0으로 처리하려면: AVG(COALESCE(score, 0))
  • 📢 섹션 요약 비유: 집계 함수와 윈도우 함수의 차이는 '반 평균 성적표''개인 성적표에 반 평균 추가 열기재' 의 차이입니다. 집계 함수는 반 전체를 한 줄로 압축하고, 윈도우 함수는 학생별 성적표는 그대로 두면서 옆에 반 평균 칸을 추가합니다.

Ⅳ. 실무 적용 및 기술사 판단

의사결정 체크리스트

요구사항적용 함수·방법이유
특정 열의 NULL 포함 전체 행 수COUNT(*)NULL 포함 카운트
NULL 제외 데이터 행 수COUNT(열명)NULL 자동 제외
그룹별 소계+총계 동시GROUP BY ROLLUP다차원 집계
행 유지하면서 그룹 통계윈도우 함수 OVER()압축 없는 집계
중간값(Median)PERCENTILE_CONT(0.5)AVG는 중간값 아님

성능 판단 포인트

집계 쿼리 성능 병목은 대부분 GROUP BY의 정렬·해시 연산: 집계 대상 열에 인덱스가 있어도 GROUP BY는 전체 행을 처리해야 한다. 데이터가 수억 건이면 집계 쿼리 자체보다 사전 집계(Materialized View, 파티셔닝, 요약 테이블) 가 필수다.

안티패턴

SELECT에 GROUP BY 미포함 열 사용 (MySQL 비표준 동작): 표준 SQL에서는 GROUP BY 절에 없는 열을 SELECT에 쓸 수 없다. MySQL의 only_full_group_by 비활성화 시 비결정적 값이 반환되어 잘못된 분석 결과를 낳는다. 반드시 표준 SQL 모드를 사용해야 한다.

  • 📢 섹션 요약 비유: GROUP BY 미포함 열을 SELECT에 쓰는 것은 '반 평균을 구하면서 아무 학생이나 대표로 찍어 이름을 쓰는 것' 과 같습니다. 평균은 반 전체 것이지만, 이름은 누가 될지 모르는 비결정적 오류입니다.

Ⅴ. 기대효과 및 결론

집계 함수는 SQL의 분석 능력을 애플리케이션 레이어에서 데이터베이스 엔진 레이어로 끌어내려, RDBMS의 최적화 엔진이 집계 연산을 가장 효율적으로 수행할 수 있게 한다. 쿼리 옵티마이저는 인덱스, 파티션, 병렬 집계 등을 활용해 수억 건도 빠르게 처리한다.

한계: 실시간 집계는 OLAP(Online Analytical Processing) 워크로드로 OLTP(Online Transaction Processing) 시스템에 부하를 준다. 대규모 환경에서는 데이터 웨어하우스, 집계 뷰(Materialized View), OLAP 큐브 등의 사전 집계 아키텍처가 필수다.

미래 방향: ① 컬럼 스토어 DB(BigQuery, Redshift, Snowflake)의 벡터화 집계 연산, ② 스트리밍 집계(Flink, Spark Structured Streaming), ③ AI 기반 자동 쿼리 최적화.

집계 함수는 "데이터를 보는 눈을 만드는 것"이다 — 원시 데이터(Raw Data)를 의사결정에 쓸 수 있는 인사이트로 변환하는 SQL의 핵심 역량이다.

  • 📢 섹션 요약 비유: 집계 함수는 '수백만 개의 조각 퍼즐을 순식간에 하나의 그림으로 합쳐주는 기계' 와 같습니다. 조각 하나하나(개별 트랜잭션 행)를 눈으로 볼 수는 없지만, 집계 함수가 완성된 그림(합계, 평균, 최대·최소)을 보여줘서 경영 판단이 가능해집니다.

📌 관련 개념 맵

개념연결 포인트
GROUP BY집계 함수와 항상 함께 등장하는 그룹화 절
HAVING집계 결과에 대한 필터링; WHERE와 처리 순서가 다름
윈도우 함수 (Window Function)행을 압축하지 않고 집계하는 집계 함수의 확장 형태
Materialized View집계 결과를 사전에 저장해 성능을 높이는 기법
OLAP (Online Analytical Processing)집계 중심의 분석 쿼리 워크로드 처리 시스템

📈 관련 키워드 및 발전 흐름도

단순 SELECT 조회 (개별 행)
    │
    ▼
집계 함수 SUM / AVG / MAX / MIN / COUNT
    │
    ▼
GROUP BY — 그룹별 집계
    │
    ├─► HAVING — 집계 후 필터링
    │
    ├─► 윈도우 함수 OVER (PARTITION BY) — 행 유지 집계
    │
    ▼
Materialized View / ROLLUP / CUBE — 사전 집계
    │
    ▼
OLAP 엔진 / 컬럼 스토어 / 데이터 웨어하우스

👶 어린이를 위한 3줄 비유 설명

  1. 집계 함수는 '마트 계산대에서 모든 물건의 가격을 한 번에 더해주는 스캐너' 예요! SUM은 총합, AVG는 평균, MAX는 가장 비싼 거, MIN은 가장 싼 거를 알려줘요.
  2. GROUP BY'물건을 과자·음료·채소로 종류별로 나눈 다음 각각 계산하는 것' 이에요. 그러면 "과자 총합이 얼마, 음료 총합이 얼마"처럼 그룹별로 알 수 있어요!
  3. HAVING'계산 다 한 후에 총합이 1만 원 넘는 카테고리만 영수증에 표시하는 조건' 이에요. WHERE는 계산 전에 특정 물건을 빼는 것이고, HAVING은 계산 후에 결과를 거르는 것이랍니다!