HAVING과 WHERE 비교
HAVING은 그룹을 필터링하고 WHERE는 행을 필터링한다는 차이를 구분하며, 같은 쿼리에서 두 절을 올바르게 적용합니다.
HAVING과 WHERE 비교은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
두 단계의 필터링
WHERE는 그룹화하기 전에 개별 행을 필터링합니다. HAVING은 집계한 후에 그룹을 필터링합니다. 비슷해 보이지만 서로 다른 단계에서 작동합니다.
WHERE 예시
WHERE는 원시 행을 필터링합니다. 집계 결과는 볼 수 없습니다.
-- Sum totals for rows where status is 'paid':
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY user_id;HAVING 예시
HAVING은 그룹을 필터링합니다. 집계 결과를 참조할 수 있습니다.
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- only users with ≥ 5 ordersWHERE와 HAVING 함께 사용하기
두 절을 같은 쿼리에 함께 사용할 수 있습니다.
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '90 days'
GROUP BY user_id
HAVING SUM(total) > 1000;WHERE에 집계 함수를 넣지 마세요
플래너는 그룹화 전에 WHERE를 실행하므로 집계 결과를 아직 사용할 수 없습니다.
-- WRONG:
SELECT user_id, COUNT(*) FROM orders
WHERE COUNT(*) > 5 -- ERROR
GROUP BY user_id;
-- RIGHT — move to HAVING:
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;가능하면 조건식을 WHERE로 미리 적용하기
WHERE는 그룹화 전에 필터링하므로 집계에 들어가는 행이 줄어듭니다. WHERE로 표현할 수 없는 조건에만 HAVING을 사용해야 합니다.
-- Slightly slower (filters after grouping):
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING user_id IN (1,2,3);
-- Faster (filters before grouping):
SELECT user_id, COUNT(*) FROM orders
WHERE user_id IN (1,2,3)
GROUP BY user_id;논리적 실행 순서
개념적인 순서는 다음과 같습니다.
FROM— 테이블을 선택하고 조인합니다WHERE— 행을 필터링합니다GROUP BY— 그룹을 만듭니다HAVING— 그룹을 필터링합니다SELECT— 열을 추출합니다ORDER BY— 정렬합니다LIMIT— 상위 N개로 제한합니다
GROUP BY 없이 HAVING 사용하기
GROUP BY 없이 HAVING을 사용할 수 있습니다. 이 경우 전체 테이블이 하나의 그룹이 됩니다.
SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000; -- prints only if total over 1MHAVING에서 별칭 사용하기
일부 데이터베이스에서는 HAVING이 SELECT 별칭을 참조할 수 있습니다. PostgreSQL과 MySQL에서는 가능하지만 표준 SQL에서는 불가능합니다. 가장 이식성 높은 방법은 집계 함수를 반복해서 작성하는 것입니다.
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- portable
-- HAVING order_count >= 5 -- works in PG / MySQL여러 집계 함수와 HAVING
복합적인 집계 조건에는 HAVING을 사용합니다.
SELECT user_id, COUNT(*) AS orders, SUM(total) AS revenue
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5 AND SUM(total) > 1000;성능 참고 사항
HAVING의 집계 필터는 열에 WHERE를 적용할 때처럼 인덱스를 사용할 수 없습니다. 가능한 조건은 WHERE로 옮기세요.
복습
WHERE = 행 필터링, HAVING = 그룹 필터링입니다.
- 집계 함수는 HAVING에서만 사용하고 WHERE에서는 사용하지 않습니다
- 속도를 높이려면 조건식을 WHERE로 미리 적용합니다
- 필요할 때는 둘 다 사용합니다
빠른 확인
주문을 10건보다 많이 한 사용자를 찾으려고 합니다. 어떤 절로 필터링해야 합니까?
자주 묻는 질문
“HAVING과 WHERE 비교” 강의는 무료인가요?
네 — “HAVING과 WHERE 비교” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“HAVING과 WHERE 비교”에서 뭘 배우나요?
HAVING은 그룹을 필터링하고 WHERE는 행을 필터링한다는 차이를 구분하며, 같은 쿼리에서 두 절을 올바르게 적용합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“HAVING과 WHERE 비교” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.