COUNT·SUM·AVG로 요약하고 GROUP BY로 그룹별 통계를 낸다.
집계와 GROUP BY
"전체 주문 건수는?", "도시별 평균 나이는?", "회원당 총 결제액은?" 같은 질문에 답하려면 여러 행을 하나의 값으로 요약해야 합니다. 이때 쓰는 것이 집계 함수와 GROUP BY 입니다.
학습 목표
- 집계 함수(
COUNT,SUM,AVG,MIN,MAX)를 사용합니다. GROUP BY로 그룹별 통계를 계산합니다.HAVING으로 그룹 결과를 거릅니다.WHERE와HAVING의 차이를 이해합니다.
집계 함수
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;
💡 TIP —
GROUP 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; -- 그룹 단위 필터 (나중)
실행 순서
논리적 처리 순서는 다음과 같습니다.
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
이 순서를 기억하면 왜 WHERE 에서는 별칭을 못 쓰고 HAVING 에서는 집계를 쓸 수 있는지 이해됩니다.
요약
- 집계 함수는 여러 행을 하나의 값으로 요약합니다.
COUNT(*)와COUNT(열)은 NULL 처리에서 다릅니다.GROUP BY로 그룹을 만들고,SELECT에는 기준 열과 집계만 둡니다.- 그룹을 거를 때는
WHERE가 아니라HAVING을 사용합니다. - 처리 순서는
WHERE→GROUP BY→HAVING입니다.
연습문제
orders의 전체 주문 건수와 평균 금액을 구하세요.- 사용자별 총 주문 금액을 금액이 큰 순으로 정렬해 보여 주세요.
- 주문을 2건 이상 한 사용자만 골라 건수를 출력하세요.
- 도시별 평균 나이를 구하되, 사용자가 5명 이상인 도시만 보여 주세요.
힌트 — 2번은
GROUP BY user_id+ORDER BY, 3번·4번은HAVING을 사용합니다.
💡 연습문제 풀이
불러오는 중…
댓글 0
“MySQL” 강좌에 대한 댓글입니다.