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 문에서 처리되는 대략적인 순서는 다음과 같습니다.
- FROM — 테이블 선택
- WHERE — 행 필터
- GROUP BY — 그룹화
- HAVING — 그룹 필터
- SELECT — 컬럼/집계 계산
- ORDER BY — 정렬
Tip:
WHERE는 그룹 짓기 전에,HAVING은 그룹 짓고 난 뒤에 적용됩니다. 행을 먼저 줄이려면WHERE를 활용하세요.