GROUP BY와 집계 함수
2026년 8월 28일
GROUP BY와 집계 함수
GROUP BY는 행을 묶어 그룹당 한 줄로 줄인다. **Mongo의$group**과 같은 자리다.
SQL
Mermaid스크롤로 확대 · 드래그로 이동
집계 함수
| 함수 | 뜻 | NULL |
|---|---|---|
COUNT(*) | 행 개수 | 포함 |
COUNT(열) | 그 열이 NULL 아닌 개수 | 제외 |
COUNT(DISTINCT 열) | 중복 없는 개수 | 제외 |
SUM AVG | 합·평균 | 제외 (NULL과 3값 논리) |
MIN MAX | 최소·최대 | 제외 |
GROUP_CONCAT(열) | 값을 문자열로 이어 붙임 (MySQL/MariaDB) | 제외 |
SQL
GROUP_CONCAT은 Mongo의 $push/$addToSet에 해당한다.
WHERE vs HAVING — 실행 순서가 답이다
SQL
WHERE에 COUNT(*)를 쓰면 에러다. 그 시점에는 그룹이 아직 없다 (SQL 실행 순서).
성능: 가능한 조건은 전부 WHERE로 내린다. 먼저 걸러야 묶을 행이 줄고 인덱스도 탄다. HAVING은 집계 결과로만 판단할 수 있는 조건에만 쓴다.
규칙: SELECT에는 그룹 기준이나 집계만
SQL
MySQL/MariaDB는
ONLY_FULL_GROUP_BY모드가 꺼져 있으면 이걸 허용해 버린다. 임의의 행 값이 나와 결과가 조용히 틀린다. 이 모드는 켜 두는 게 맞다.
조건부 집계 — 한 번의 스캔으로 여러 지표
SQL
ELSE를 생략하면 NULL이 되고, AVG는 NULL을 무시하므로 조건을 만족하는 것들의 평균이 된다. 매우 자주 쓰는 관용구다.
여러 기준으로 묶기
SQL
한 줄 정리
WHERE는 묶기 전, HAVING은 묶은 뒤. COUNT(*)와 COUNT(열)은 NULL 때문에 다르고, 조건부 집계가 주력 관용구다.
관련
- SQL 실행 순서
- SELECT 문법
- NULL과 3값 논리
- 서브쿼리
- CTE와 윈도우 함수
- MongoDB 집계 연산자
- SQL ↔ MongoDB 문법 대조표