[SQL] HAVING절 :: 집계 함수 결과를 원하는 조건으로 필터링하기 (w/ GROUP BY)
* velog에서 포스팅했던 글을 옮겨왔습니다.
유저별로 구매한 상품과 가격에 대해 알고 있는 테이블 orders가 있다
먼저, 유저별로 구매액의 합산을 구하려면?
select와 from절만으로 충분하다.
FROM
주문 내역 중에서(orders)
SELECT GROUP BY
고객 별로(id) 구매액의 합산(sum price)을 보여줘
SQL 쿼리문
select
id,
sum(price)
from
orders
group by id
조회 결과
하지만 데이터를 뽑다 보면 이렇게 단순하게 전체 리스트보다는, 최소 1개 이상의 조건이 들어가는 경우가 더 많다.
그럴 때 사용할 수 있는 것이 having 절과 기본 구문인 where 절이다.
HAVING 절과 WHERE 절의 차이
이 두 개는 각각의 목적이 다르다.
내가 이해한 내용 바탕으로 간단하게 비교해보자면,
HAVING 절은
- 집계함수로 먼저 계산된 결과에 대해
- 조건에 충족하는 값만 조회
WHERE 절은
- 조건에 충족하는 값에 대해서만
- 집계함수로 계산
위와 같이 값을 조회할 때 접근 순서가 다르다.
그리고 이렇게 다른 순서는 꽤 다른 결과를 가져온다.
각각의 예시를 통해 설명할 것인데,
완성된 쿼리문을 먼저 보여주고 이를 단계적으로 해석해보겠다.
1. HAVING 절 예시
완성된 쿼리문 :: 구매액의 합산이 10,000원이상인 고객을 보여줘
select
id,
sum(price)
from
orders
group by id
having sum(price) >= 10000
1-1. 고객 별로 합산한 구매액 리스트에서
FROM
주문 내역에서
SELECT GROUP BY
고객 별로 구매액의 합산을 보여줘
1-2. 구매액 합산이 10,000원 이상인 경우만 보여줘
HAVING
합산(sum price)이 10,000원 이상( >= 10000)
최종 조회 결과
웬디랑 해리는 주문한 금액의 합이 각각 16,900원과 13,900원으로 10,000원 이상인 고객이다.
2. WHERE 절 예시
완성된 쿼리문 :: 전체 주문내역에서 구매액이 10,000원 이상인 고객의 고객별 합산을 보여줘
select
id,
sum(price)
from
orders
where price >= 10000
group by id
2-1. 주문 내역 중에서
FROM
주문 내역 중에서
WHERE
구매액이 10,000원 이상인 건에 대해서만 ( price >= 10000)
주문금액이 10,000원이 넘는 경우는 웬디랑 해리 각각 1개씩 밖에 없다.
2-2. 해당 주문 건들을 고객 기준으로 합산해줘
SELECT GROUP BY
고객 별로 (id) 구매액의 합산으로(sum price) 보여줘
최종 조회 결과
공교롭게도 동일하게 웬디랑 해리가 결과에 나오지만, 각각 주문 1건에 대한 결과인 것
HAVING 절 작성할 때 유의해야 하는 점은,
having절 작성 방법
- 반드시 GROUP BY 절과 같이 작성해야 하고
- WHERE 절보다 뒤에 나와야 하며
- <검색조건>에는 SUM, AVG, MAX, MIN, COUNT와 같은 집계함수가 와야
한다.