C.W.K.
Stream
Lesson 06 of 10 · published

GROUP BY 와 HAVING

~14 min · sql, group-by, having

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

버킷 단위 요약

GROUP BY 가 row 들을 컬럼(들) 로 버킷 분할; 집계가 버킷마다 돌아. HAVING 이 집계 후 버킷을 필터 (WHERE 와 대조 — WHERE 는 집계 전 row 필터).

연산 순서 멘탈 모델:

  1. FROM + join 이 후보 row 모음.
  2. WHERE 가 그 row 필터.
  3. GROUP BY 가 살아남은 row 를 버킷으로 분할.
  4. 집계가 버킷마다 한 값 계산.
  5. HAVING 이 버킷 필터.
  6. SELECT 가 컬럼/표현식 projection.
  7. ORDER BY + LIMIT 마무리.
Warning: Postgres 는 SELECT 컬럼 일부만 GROUP BY 하면 에러. SQLite 는 통과시키고 미집계 컬럼에 임의 값 골라 — MySQL 5.7 이전 같은 함정. 항상 모든 미집계 SELECT 컬럼을 GROUP BY 에 포함하거나 집계로 감싸.

Code

GROUP BY + HAVING·sql
-- 이번 달 message count 기준 top 5 brain
SELECT brain, count(*) AS n
FROM   messages
WHERE  created_at >= datetime('now', 'start of month')
GROUP  BY brain
HAVING count(*) > 100      -- 트래픽 적은 brain 무시
ORDER  BY n DESC
LIMIT  5;
다중 컬럼 그룹·sql
-- per-day, per-brain message count
SELECT date(created_at)        AS day,
       brain,
       count(*)                AS n
FROM   messages
GROUP  BY day, brain
ORDER  BY day, brain;

External links

Exercise

작은 orders 테이블 (id, customer_id, total, created_at) 에 수백 row. Query 3 개: (1) per-customer 주문 count, (2) per-month 매출 합계, (3) 평생 spend 기준 top-10 고객, 주문 3 개 미만 제외 HAVING. 손으로 몇 버킷 spot-check.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.