MySQL Aggregate Functions & GROUP BY

MySQL 집계 함수(Aggregate Functions) 정리

집계 함수는 여러 행을 묶어 하나의 결과를 반환합니다. GROUP BY로 그룹을 나누고, HAVING으로 그룹 단위 조건을 걸 수 있다.


1. 집계 함수 (Aggregate Functions)

함수설명반환 타입
COUNT행의 개수 (NULL 제외 가능)숫자
SUM합계숫자
AVG평균숫자
MIN최솟값해당 컬럼 타입
MAX최댓값해당 컬럼 타입

기본 사용 예시

-- 샘플 테이블: sales (id, product, category, amount, sale_date)
SELECT * FROM sales;
-- | id | product | category | amount | sale_date   |
-- |  1 | A       | food     | 1000   | 2024-01-01  |
-- |  2 | B       | food     | 1500   | 2024-01-02  |
-- |  3 | C       | drink    | 500    | 2024-01-01  |

-- 전체 행 개수
SELECT COUNT(*) FROM sales;           -- 3

-- amount 합계, 평균, 최소, 최대
SELECT SUM(amount), AVG(amount), MIN(amount), MAX(amount) FROM sales;
-- 3000, 1000, 500, 1500

-- NULL은 COUNT에서 제외 (COUNT(컬럼명) 사용 시)
SELECT COUNT(amount) FROM sales;      -- NULL이 있으면 제외됨

2. GROUP BY (그룹화)

특정 컬럼 값별로 행을 묶어, 그룹 단위로 집계할 때 사용합니다.

-- 카테고리별 판매 건수, 합계, 평균
SELECT
  category,
  COUNT(*) AS cnt,
  SUM(amount) AS total,
  AVG(amount) AS avg_amount
FROM sales
GROUP BY category;

-- | category | cnt | total | avg_amount |
-- | food     | 2   | 2500  | 1250       |
-- | drink    | 1   | 500   | 500        |

주의: SELECT에 나오는 컬럼은 GROUP BY에 포함되거나, 집계 함수로 감싸져 있어야 합니다.

-- 잘못된 예: category로만 묶었는데 product를 그대로 SELECT
-- SELECT category, product FROM sales GROUP BY category;  -- 에러 가능

-- 올바른 예: product도 그룹 기준에 포함
SELECT category, product, SUM(amount)
FROM sales
GROUP BY category, product;

3. HAVING (그룹 조건)

WHERE행 단위 필터, HAVING그룹 단위 필터입니다. 집계 결과에 조건을 걸 때 사용합니다.

-- 합계가 2000 이상인 카테고리만
SELECT category, SUM(amount) AS total
FROM sales
GROUP BY category
HAVING SUM(amount) >= 2000;

-- | category | total |
-- | food     | 2500  |

-- 별칭(alias) 사용 (MySQL 지원)
SELECT category, SUM(amount) AS total
FROM sales
GROUP BY category
HAVING total >= 2000;

4. ORDER BY와 함께 사용

SELECT category, COUNT(*) AS cnt, SUM(amount) AS total
FROM sales
GROUP BY category
HAVING total > 500
ORDER BY total DESC;

실행 순서 정리

SELECT 문에서 처리되는 대략적인 순서는 다음과 같습니다.

  1. FROM — 테이블 선택
  2. WHERE — 행 필터
  3. GROUP BY — 그룹화
  4. HAVING — 그룹 필터
  5. SELECT — 컬럼/집계 계산
  6. ORDER BY — 정렬

Tip: WHERE는 그룹 짓기 전에, HAVING은 그룹 짓고 난 뒤에 적용됩니다. 행을 먼저 줄이려면 WHERE를 활용하세요.