HAVING은 SQL에서 GROUP BY를 통해 만들어진 그룹에 조건을 적용할 때 사용하는 구문입니다. WHERE가 개별 행을 대상으로 조건을 지정한다면 HAVING은 GROUP BY로 묶인 결과를 대상으로 조건을 지정한다는 차이가 있습니다. 따라서 특정 지역의 회원 수가 일정 인원 이상인 경우나 상품별 판매량이 일정 수량 이상인 경우처럼 그룹별 집계 결과를 기준으로 데이터를 필터링할 때 사용합니다.

HAVING의 기본 개념

GROUP BY는 같은 값을 가진 데이터를 하나의 그룹으로 묶고, COUNT(), SUM(), AVG() 등의 집계 함수를 이용하여 그룹별 통계값을 계산할 수 있습니다.

예를 들어 지역별 회원 수를 조회하면 다음과 같이 작성할 수 있습니다.

SELECT city, COUNT(*) AS member_count
FROM member
GROUP BY city;

위 쿼리는 회원을 지역별로 그룹화한 뒤 각 지역에 속한 회원 수를 계산합니다.

여기에서 회원 수가 100명 이상인 지역만 확인하고 싶다면 HAVING을 사용할 수 있습니다.

SELECT city, COUNT(*) AS member_count
FROM member
GROUP BY city
HAVING COUNT(*) >= 100;

이 쿼리는 먼저 회원을 지역별로 그룹화하고 각 지역의 회원 수를 계산한 다음, 회원 수가 100명 이상인 그룹만 결과에 표시합니다.

HAVING은 GROUP BY와 함께 사용되는 경우가 많으며 집계 함수의 결과를 조건으로 지정할 수 있다는 특징이 있습니다. 따라서 COUNT(), SUM(), AVG(), MAX(), MIN() 등의 결과를 기준으로 그룹을 필터링할 때 활용할 수 있습니다.

WHERE와 HAVING의 차이

HAVING을 이해할 때 가장 중요한 부분은 WHERE와의 차이입니다. 두 구문 모두 조건을 지정한다는 공통점이 있지만 조건을 적용하는 대상이 다릅니다.

WHERE는 개별 행을 대상으로 조건을 적용합니다. 예를 들어 20세 이상인 회원만 조회하려면 다음과 같이 작성합니다.

SELECT *
FROM member
WHERE age >= 20;

이 경우 각각의 회원 데이터를 확인하여 나이가 20세 이상인 행만 조회합니다.

반면 HAVING은 GROUP BY를 통해 만들어진 그룹을 대상으로 조건을 적용합니다.

SELECT city, COUNT(*) AS member_count
FROM member
GROUP BY city
HAVING COUNT(*) >= 100;

위 쿼리에서는 개별 회원의 나이를 확인하는 것이 아니라 지역별로 만들어진 그룹의 회원 수를 확인합니다.

따라서 WHERE와 HAVING은 다음과 같이 구분할 수 있습니다.

  • WHERE: 개별 행에 조건을 적용합니다.
  • GROUP BY: 데이터를 특정 기준으로 그룹화합니다.
  • HAVING: 그룹화된 결과에 조건을 적용합니다.
  • ORDER BY: 최종 조회 결과를 정렬합니다.

특히 집계 함수의 결과를 조건으로 사용해야 하는 경우에는 HAVING을 사용해야 합니다. 예를 들어 주문 금액의 합계가 1,000,000원 이상인 지역을 찾는 경우 다음과 같이 작성할 수 있습니다.

SELECT city, SUM(price) AS total_price
FROM orders
GROUP BY city
HAVING SUM(price) >= 1000000;

이 쿼리는 지역별 주문 금액을 합산한 뒤 합계가 1,000,000원 이상인 지역만 조회합니다.

WHERE와 HAVING을 함께 사용하기

WHERE와 HAVING은 서로 다른 역할을 하기 때문에 하나의 SQL 문장에서 함께 사용할 수도 있습니다.

예를 들어 2026년에 발생한 주문만 대상으로 지역별 주문 금액을 계산하고, 그중 총 주문 금액이 1,000,000원 이상인 지역만 조회한다고 가정할 수 있습니다.

SELECT city, SUM(price) AS total_price
FROM orders
WHERE order_date >= '2026-01-01'
GROUP BY city
HAVING SUM(price) >= 1000000;

이 쿼리에서는 먼저 WHERE를 통해 2026년 1월 1일 이후의 주문만 선택합니다. 이후 선택된 주문 데이터를 지역별로 그룹화하고 SUM()을 이용하여 지역별 주문 금액을 계산합니다. 마지막으로 HAVING을 사용하여 주문 금액의 합계가 1,000,000원 이상인 그룹만 남깁니다.

이처럼 WHERE와 HAVING을 함께 사용하면 조건에 맞는 원본 데이터만 대상으로 그룹을 만들고, 그룹별 집계 결과에도 추가적인 조건을 적용할 수 있습니다.

HAVING은 COUNT()뿐만 아니라 다양한 집계 함수와 함께 사용할 수 있습니다. 평균 주문 금액을 기준으로 그룹을 필터링하려면 AVG()를 사용할 수 있습니다.

SELECT city, AVG(price) AS average_price
FROM orders
GROUP BY city
HAVING AVG(price) >= 50000;

위 쿼리는 지역별 평균 주문 금액을 계산하고 평균 주문 금액이 50,000원 이상인 지역만 조회합니다.

또한 판매량이 많은 상품만 확인하는 경우에도 사용할 수 있습니다.

SELECT product_name, SUM(quantity) AS total_quantity
FROM orders
GROUP BY product_name
HAVING SUM(quantity) >= 1000;

이 경우 상품별 판매 수량을 합산한 뒤 총 판매 수량이 1,000개 이상인 상품만 조회합니다.

HAVING은 데이터 분석이나 통계 정보를 조회할 때 특히 유용합니다. 단순히 특정 데이터를 찾는 것이 아니라 데이터를 그룹별로 집계한 다음 그 결과를 다시 필터링해야 하는 상황에서 사용하기 때문입니다.

결국 HAVING은 GROUP BY와 함께 사용하여 그룹화된 데이터에 조건을 적용하는 SQL 구문입니다. WHERE가 개별 행을 필터링하는 역할이라면 HAVING은 집계된 그룹을 필터링하는 역할을 합니다. 따라서 WHERE → GROUP BY → HAVING → ORDER BY의 역할을 구분해서 이해하는 것이 중요합니다. 다음 단계에서는 실제 데이터를 데이터베이스에 추가하는 INSERT에 대해 알아보게 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

글쓴이

rjsan46@koreabites.com

관련 게시물

GROUP BY란 무엇인가

GROUP BY는 SQL에서 특정 컬럼의 값이 같은 데이터를 하나의 그룹으로 묶어 조회할 때 사용하는 구문입니다. 단순히 데이터를 조회하거나 정렬하는 것과 달리 여러...

모두 읽어보기

ORDER BY란 무엇인가

ORDER BY는 SQL에서 조회한 데이터를 원하는 기준에 따라 정렬할 때 사용하는 구문입니다. 데이터를 단순히 조회하는 것에서 그치지 않고 가격이 높은 순서, 이름이...

모두 읽어보기

WHERE란 무엇인가

WHERE는 SQL에서 원하는 조건에 맞는 데이터만 선택하여 조회하기 위해 사용하는 조건절입니다. 데이터베이스에는 수많은 행이 저장될 수 있기 때문에 전체 데이터를 조회하는 것보다...

모두 읽어보기

SELECT란 무엇인가

SELECT는 SQL에서 데이터베이스에 저장된 데이터를 조회할 때 사용하는 가장 기본적인 명령어입니다. 데이터베이스에는 많은 양의 데이터가 저장될 수 있기 때문에 필요한 정보를 선택해서...

모두 읽어보기

SQL이란 무엇인가

SQL은 데이터베이스에 저장된 데이터를 조회하고 추가하거나 수정하고 삭제하기 위해 사용하는 언어입니다. 관계형 데이터베이스에서는 테이블을 이용해 데이터를 관리하며, SQL을 통해 이러한 데이터를 원하는...

모두 읽어보기

NULL이란 무엇인가

데이터베이스에서 NULL은 데이터가 존재하지 않거나 현재 값을 알 수 없는 상태를 나타내는 특별한 값입니다. 일반적인 숫자나 문자처럼 특정한 값을 의미하는 것이 아니라...

모두 읽어보기