본문 바로가기
C.W.K.
Stream
Lesson 14 of 16 · published

HAVING으로 집계 결과 거르기

~10 min · queries, aggregation

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

WHERE는 묶기 전, HAVING은 묶은 뒤

논리적 평가는 FROM/JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT/OFFSET 순서야. 그래서 WHERE 시점에는 집계값도 SELECT에서 만든 별칭도 아직 없고, 집계 조건은 HAVING에 둬야 해. “최근 주문만 모아 고객별로 세고, 주문이 5건 넘는 고객만 보여줘”라는 순서를 그대로 SQL에 옮기면 돼.

집계 함수는 HAVING에서

WHERE COUNT(*) > 5는 아직 그룹이 만들어지기 전이라 쓸 수 없어. COUNT 조건은 HAVING에 둬. 먼저 완료된 주문만 WHERE로 좁히고, 묶은 뒤 5건 기준을 적용하면 계산량과 뜻이 모두 분명해져.

Code

WHERE와 HAVING 함께 쓰기·sql
SELECT u.name,
       COUNT(o.id)  AS order_count,
       SUM(o.total) AS total_spent
FROM   users u
JOIN   orders o ON o.user_id = u.id
WHERE  o.status = 'paid'              -- 행 필터
GROUP  BY u.name
HAVING COUNT(o.id) >= 3                -- 그룹 필터
   AND SUM(o.total) > 500;
다중 조건 HAVING·sql
-- 평균 3 별 미만이지만 리뷰 5 개 이상인 product
SELECT p.title,
       COUNT(r.id)            AS review_count,
       ROUND(AVG(r.rating), 2) AS avg_rating
FROM   products p
JOIN   reviews r ON r.product_id = p.id
GROUP  BY p.title
HAVING AVG(r.rating) < 3 AND COUNT(r.id) >= 5
ORDER  BY avg_rating;

External links

Exercise

WHERE, GROUP BY, HAVING, ORDER BY, LIMIT을 모두 쓰는 질의를 작성해. 완료된 주문이 5건 이상인 고객만 남기고 총 지출액이 큰 상위 10명을 보여 줘.

Progress

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

댓글 0

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

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