[TIL] SQL HAVING은 GROUP BY와 어떻게 함께 쓰이나

syong·2022년 9월 13일
0

TIL

목록 보기
30/32
post-custom-banner

Group by를 사용하여 행을 그룹화하고 나면 그룹화한 행에 조건을 걸어주어야 할 상황이 생긴다. 예를 들어

각 정비소마다의 리뷰 개수를 조회함. 단, 리뷰의 총 개수가 3개 이상인 정비소만 조회

위와 같은 데이터의 필터링이 필요한 경우 Group by와 함께 Having절을 사용하게 된다.

Having절은 Where절과 기능이 비슷해보이지만 둘은 결정적인 차이가 있다.

Having절은 반드시 Group by 뒤에 와야 하며 그룹화된 행에만 적용되는 조건을 붙일 때 사용한다. 반면 Where절은 Group by와 상관없이 각각의 행에 조건을 적용시킬 때 사용한다. Group by절 뒤에 Where절은 붙을 수 없다.

Case 1(Having)

따라서 위의 조회 조건을 쿼리로 표현하면 아래와 같다.

SELECT "Review"."repairShopId",
COUNT("repairShopId") as "reviewCount"
FROM "Review"
GROUP BY "repairShopId"
HAVING COUNT("repairShopId") > 2;

Having절은 Group by절과 항상 관계된 채로 사용되기 때문에 Having절 뒤에 붙은 조건이 Group by절에서 그룹화되지 않은 엉뚱한 행으로 조건을 걸어줄 경우 아래와 같은 에러를 만난다.

Group by절에서 언급하지 않은 visitCount라는 새로운 행에 관련된 조건을 걸어주면 Group by절에 반드시 해당 행이 언급되어야 한다는 에러 메시지를 준다.

위의 쿼리를 정상적으로 실행했을 때 나오는 데이터 결과는 아래와 같다.

Case2(Where + Having)

이번엔 Where절과 Having절을 함께 사용해보려 한다.

각 정비소마다 "verygood" 점수를 받은 리뷰 개수를 조회함. 단, 리뷰의 총 개수가 3개 이상인 정비소만 조회

여기서 "verygood" 점수를 받은 리뷰 라는 조건은 그룹화 전의 각각의 행에 걸어둘 수 있는 조건이다.

따라서 아래와 같이 쿼리를 작성할 수 있다.

SELECT "Review"."repairShopId", 
COUNT("repairShopId") as "reviewCount" 
FROM "Review"  
WHERE "reviewScore" = 'verygood' 
GROUP BY "repairShopId" 
HAVING COUNT("repairShopId") > 2;
post-custom-banner

0개의 댓글