Group by
를 사용하여 행을 그룹화하고 나면 그룹화한 행에 조건을 걸어주어야 할 상황이 생긴다. 예를 들어
각 정비소마다의 리뷰 개수를 조회함. 단, 리뷰의 총 개수가 3개 이상인 정비소만 조회
위와 같은 데이터의 필터링이 필요한 경우 Group by
와 함께 Having
절을 사용하게 된다.
Having
절은 Where
절과 기능이 비슷해보이지만 둘은 결정적인 차이가 있다.
Having
절은 반드시 Group by
뒤에 와야 하며 그룹화된 행에만 적용되는 조건을 붙일 때 사용한다. 반면 Where
절은 Group by
와 상관없이 각각의 행에 조건을 적용시킬 때 사용한다. Group by
절 뒤에 Where
절은 붙을 수 없다.
따라서 위의 조회 조건을 쿼리로 표현하면 아래와 같다.
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
절에 반드시 해당 행이 언급되어야 한다는 에러 메시지를 준다.
위의 쿼리를 정상적으로 실행했을 때 나오는 데이터 결과는 아래와 같다.
이번엔 Where
절과 Having
절을 함께 사용해보려 한다.
각 정비소마다 "verygood" 점수를 받은 리뷰 개수를 조회함. 단, 리뷰의 총 개수가 3개 이상인 정비소만 조회
여기서 "verygood" 점수를 받은 리뷰
라는 조건은 그룹화 전의 각각의 행에 걸어둘 수 있는 조건이다.
따라서 아래와 같이 쿼리를 작성할 수 있다.
SELECT "Review"."repairShopId",
COUNT("repairShopId") as "reviewCount"
FROM "Review"
WHERE "reviewScore" = 'verygood'
GROUP BY "repairShopId"
HAVING COUNT("repairShopId") > 2;