- 0
- 178 단어
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에 대해 알아보게 됩니다.