집계함수와 GROUP BY (COUNT, SUM, AVG, MAX, MIN, HAVING)
🔥 매회 출제 (priority 3)
🌱 왜 배우나
학생 500명의 성적표를 한 장씩 넘겨 보는 것과 “학과별 평균 점수” 한 줄로 보는 것은 완전히 다른 일이다. 카페에서도 “오늘 총매출”이 궁금하지 영수증 수백 장을 직접 세고 싶진 않다. 이렇게 여러 행을 하나의 요약값으로 압축해 주는 기능이 집계함수다. GROUP BY는 “학과별”처럼 그룹으로 묶어 주는 짝꿍 명령이다. 단 NULL이 섞이거나 WHERE와 HAVING을 헷갈리면 결과가 조용히 틀어지기 때문에 규칙을 정확히 알아야 한다.
📖 핵심 개념
집계함수(Aggregate Function)는 여러 행의 값을 모아 하나의 값으로 요약하는 함수다. 대표 다섯 가지는 COUNT(개수), SUM(합계), AVG(평균), MAX(최대), MIN(최소)이다.
가장 자주 나오는 함정은 NULL(값 없음) 처리다. 함수마다 NULL을 다루는 규칙이 다르고, 그 차이가 매회 출제된다.
GROUP BY는 특정 열의 값이 같은 행끼리 묶어 그룹 단위로 집계하게 해 준다. 그룹화된 결과에 조건을 걸 때는 WHERE가 아니라 HAVING을 써야 한다. WHERE는 그룹을 만들기 전에 개별 행을 걸러 내고, HAVING은 그룹을 만든 뒤 집계 결과를 걸러 낸다. 이 순서가 핵심이다.
🔍 시각화
원본 데이터 (학생 표):
┌──────┬──────┐
│ 학과 │ 점수 │
├──────┼──────┤
│ 컴공 │ 80 │
│ 컴공 │ NULL │
│ 경영 │ 70 │
│ 경영 │ 90 │
│ 경영 │ 60 │
└──────┴──────┘
GROUP BY 학과 → 집계함수 적용:
┌──────┬───────────┬───────────┬──────────┐
│ 학과 │ COUNT(*) │COUNT(점수)│AVG(점수) │
├──────┼───────────┼───────────┼──────────┤
│ 컴공 │ 2 │ 1 │ 80 │ ← NULL 제외
│ 경영 │ 3 │ 3 │ 73.3 │
└──────┴───────────┴───────────┴──────────┘
WHERE vs HAVING 적용 시점:
FROM → WHERE(행 필터) → GROUP BY → 집계함수 → HAVING(그룹 필터) → SELECT
↔️ 이웃 개념 구분
- COUNT(*) vs COUNT(열 이름): COUNT(*)는 NULL까지 포함한 전체 행 수. COUNT(열 이름)은 그 열에서 NULL을 제외한 행 수. 가장 자주 나오는 차이.
- WHERE vs HAVING: WHERE는 그룹 만들기 전에 개별 행을 거른다. HAVING은 그룹 만든 뒤에 집계 결과를 거른다. WHERE 절에서는 집계함수를 쓸 수 없다.
🔑 핵심 용어
- COUNT(*): NULL을 포함한 전체 행 수.
- COUNT(열 이름): 그 열에서 NULL을 뺀 행 수.
- SUM / AVG / MAX / MIN: 모두 NULL을 자동으로 빼고 계산한다. 특히 AVG는 NULL을 0으로 치지 않고, NULL이 아닌 행 수로만 나눈다.
- GROUP BY: 지정한 열의 값이 같은 행끼리 묶는다. SELECT에는 GROUP BY에 쓴 열이나 집계함수만 올 수 있다.
- HAVING: GROUP BY로 묶은 뒤 집계 결과에 조건을 건다. WHERE와 달리 집계함수를 조건에 쓸 수 있다.
- 실행 순서: FROM → WHERE → GROUP BY → 집계함수 → HAVING → SELECT → ORDER BY.
✅ 스스로 가르쳐보기
점수 열에 80, NULL, 70, NULL, 90이 있다고 하자. 친구 앞에서 COUNT(*), COUNT(점수), AVG(점수)의 결과를 먼저 본인 입으로 말하고, 왜 그 값이 나오는지 NULL 처리 규칙으로 설명해 보자. 숫자만 외우는 것이 아니라 규칙을 내 문장으로 풀어내는 게 핵심이다.
체크포인트:
- COUNT(*)와 COUNT(열)의 NULL 처리 차이를 정확히 말할 수 있는가
- AVG가 NULL을 0이 아니라 “없는 행”으로 처리하는 이유를 설명할 수 있는가
- WHERE와 HAVING이 각각 언제 적용되는지 실행 순서로 말할 수 있는가
🎯 기출 포인트
2025-3회: COUNT(*)와 COUNT(컬럼명)의 NULL 처리 차이가 출제됐다. AVG 계산 시 NULL 때문에 분모가 달라지는 함정을 조심하라. HAVING 절에는 집계함수를 조건으로 쓸 수 있지만 WHERE 절에는 못 쓴다는 점도 빈출 포인트다.