dev.syw

COUNT·SUM·AVG로 요약하고 GROUP BY로 그룹별 통계를 낸다.

집계와 GROUP BY

"전체 주문 건수는?", "도시별 평균 나이는?", "회원당 총 결제액은?" 같은 질문에 답하려면 여러 행을 하나의 값으로 요약해야 합니다. 이때 쓰는 것이 집계 함수와 GROUP BY 입니다.

학습 목표

  • 집계 함수(COUNT, SUM, AVG, MIN, MAX)를 사용합니다.
  • GROUP BY 로 그룹별 통계를 계산합니다.
  • HAVING 으로 그룹 결과를 거릅니다.
  • WHEREHAVING 의 차이를 이해합니다.

집계 함수

SELECT
  COUNT(*)        AS 총건수,
  COUNT(phone)    AS 전화등록수,  -- NULL은 세지 않음
  SUM(amount)     AS 총매출,
  AVG(amount)     AS 평균금액,
  MIN(amount)     AS 최소,
  MAX(amount)     AS 최대
FROM orders;
함수의미
COUNT(*)행 개수 (NULL 포함)
COUNT(열)해당 열이 NULL이 아닌 행 수
SUM(열)합계
AVG(열)평균
MIN / MAX최솟값 / 최댓값

⚠️ 주의COUNT(*) 는 모든 행을 세지만 COUNT(열) 은 그 열이 NULL 인 행을 빼고 셉니다. AVG 역시 NULL을 분모에서 제외하므로 결과가 달라질 수 있습니다.

GROUP BY — 그룹별 요약

-- 사용자별 주문 건수와 총액
SELECT user_id, COUNT(*) AS 건수, SUM(amount) AS 총액
FROM orders
GROUP BY user_id;

GROUP BY user_id 는 같은 user_id 끼리 묶어 그룹마다 집계값을 계산합니다.

-- 여러 열로 그룹화
SELECT city, gender, AVG(age) AS 평균나이
FROM users
GROUP BY city, gender;

💡 TIPGROUP BY 를 쓰면 SELECT 에는 그룹 기준 열과 집계 함수만 올 수 있습니다. 그 외 일반 열을 함께 쓰면 어떤 값을 보여줄지 모호해지므로, 표준 SQL에서는 오류입니다. (MySQL 기본 설정에서는 허용될 수 있으나 권장하지 않습니다.)

HAVING — 그룹 조건

집계 결과로 그룹을 거를 때는 WHERE 가 아니라 HAVING 을 씁니다.

-- 주문을 3건 이상 한 사용자만
SELECT user_id, COUNT(*) AS 건수
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 3;

WHERE 는 그룹을 만들기 전에 개별 행을 거르고, HAVING 은 그룹을 만든 뒤 집계값으로 거릅니다.

-- 2026년 주문만 모아, 총액 10만 이상인 사용자
SELECT user_id, SUM(amount) AS 총액
FROM orders
WHERE ordered_at >= '2026-01-01'   -- 행 단위 필터 (먼저)
GROUP BY user_id
HAVING SUM(amount) >= 100000;      -- 그룹 단위 필터 (나중)

실행 순서

논리적 처리 순서는 다음과 같습니다.

FROMWHEREGROUP BYHAVINGSELECTORDER BYLIMIT

이 순서를 기억하면 왜 WHERE 에서는 별칭을 못 쓰고 HAVING 에서는 집계를 쓸 수 있는지 이해됩니다.

요약

  • 집계 함수는 여러 행을 하나의 값으로 요약합니다.
  • COUNT(*)COUNT(열) 은 NULL 처리에서 다릅니다.
  • GROUP BY 로 그룹을 만들고, SELECT 에는 기준 열과 집계만 둡니다.
  • 그룹을 거를 때는 WHERE 가 아니라 HAVING 을 사용합니다.
  • 처리 순서는 WHEREGROUP BYHAVING 입니다.

연습문제

  1. orders 의 전체 주문 건수와 평균 금액을 구하세요.
  2. 사용자별 총 주문 금액을 금액이 큰 순으로 정렬해 보여 주세요.
  3. 주문을 2건 이상 한 사용자만 골라 건수를 출력하세요.
  4. 도시별 평균 나이를 구하되, 사용자가 5명 이상인 도시만 보여 주세요.

힌트 — 2번은 GROUP BY user_id + ORDER BY, 3번·4번은 HAVING 을 사용합니다.

💡 연습문제 풀이

불러오는 중…

함께 보면 좋은 자료

댓글 0

MySQL” 강좌에 대한 댓글입니다.

댓글을 작성하려면 로그인이 필요합니다.