문법 · SQL · intermediate

GROUP BY · 집계 · HAVING

COUNT/SUM/AVG와 그룹 필터 HAVING.

배우기 · SQL 문법 · 13분 · 3/14 · sql · 집계

이 트랙 목차 (14)
  1. 1. SELECT · WHERE · ORDER · LIMIT
  2. 2. JOIN: INNER · LEFT와 없는 행 찾기
  3. 3. GROUP BY · 집계 · HAVING
  4. 4. 서브쿼리·IN·존재 여부
  5. 5. CASE · NULL · COALESCE
  6. 6. 윈도우 함수 맛보기: RANK · OVER
  7. 7. ORDER BY · LIMIT · DISTINCT
  8. 8. INSERT · UPDATE · DELETE 맛보기
  9. 9. 스칼라 함수 (UPPER · ROUND…)
  10. 10. 함수 응용 (INSTR · CAST · GROUP)
  11. 20. CASE · HAVING · LIKE
  12. 21. JOIN · NULLIF · DISTINCT
  13. 22. ROUND · LEFT JOIN · GROUP_CONCAT
  14. 23. UNION · INTERSECT · WITH

집계 함수

함수의미
COUNT(*)행 수
COUNT(col)NULL 아닌 col 개수
SUM(col)
AVG(col)평균
MIN / MAX최소·최대

GROUP BY

SELECT city, COUNT(*) AS cnt
FROM users
GROUP BY city
ORDER BY cnt DESC;

SELECT에 집계가 아닌 열을 넣으면 GROUP BY에 함께 넣어야 합니다 (SQLite도 대체로 이 규칙을 따릅니다).

HAVING

그룹에 대한 필터입니다. WHERE는 그룹 전, HAVING은 그룹 후.

SELECT city, COUNT(*) AS cnt
FROM users
GROUP BY city
HAVING COUNT(*) >= 2;

NULL와 COUNT

COUNT(col)은 NULL을 세지 않습니다. 행 자체가 필요하면 COUNT(*).

COALESCE

SELECT COALESCE(nickname, name) AS label FROM users;

NULL을 대체값으로 바꿉니다.

자주 하는 실수

  1. SELECT에 city를 넣었는데 GROUP BY에 없음
  2. WHERE에 COUNT(*)를 씀 → HAVING으로 옮기기
  3. COUNT(col)COUNT(*) 혼동 (NULL)

연습 패턴

“도시별 주문 수, 2건 이상만, 많은 순”

SELECT city, COUNT(*) AS cnt
FROM orders
GROUP BY city
HAVING COUNT(*) >= 2
ORDER BY cnt DESC;

결과 열 이름·정렬이 문제 조건과 같은지 확인하세요.

연습

집계 결과에 조건을 걸 때는 WHERE가 아니라 HAVING인지 예제로 확인하세요.

관련 짧은 원리

관련 문제