Group by ~ Having 절
- Group by: 특정 열을 기준으로 데이터를 그룹화. group by의 기준은 여러개가 될 수도 있다.
- Having: 집계 함수(예: COUNT, SUM, AVG)를 사용하여 그룹화된 데이터를 필터링.
Having과 Where의 차이
HAVING Clause | WHERE Clause |
The HAVING clause checks the condition on a group of rows. (한 그룹 내에서 조건을 확인 한다) |
The WHERE clause checks the condition on each individual row. (모든 행에 대해 각각 조건을 확인한다) |
The HAVING is used with aggregate functions. (집계 함수와 함께 사용된다) |
The WHERE clause cannot be used with aggregate functions. (집계 함수와 함께 사용될 수 없다) |
The HAVING clause is executed after the GROUP BY clause. (그룹이 만들어진 다음에 실행된다) |
The WHERE clause is executed before the GROUP BY clause. (그룹이 만들어지기 전에 실행된다) |
예시
SELECT country FROM Customers GROUP BY country HAVING AVG(age) >= 25;
또 다른 예시를 보자.
프로그래머스의 '재구매가 일어난 상품과 회원 리스트 구하기' 문제이다.
위의 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하고자 한다.
우선 어떤 회원이 어떤 상품을 구매했는지 판단을 위해서 테이블을 회원, 상품별로 그룹을 묶는다.
group by USER_ID, PRODUCT_ID
그러면 다음과 같이 그룹이 묶인다.
여기에서 중복된 항목을 찾아야 하므로 한 그룹 내에 row가 2개 이상인 경우를 찾아 출력하면 된다.
group by USER_ID, PRODUCT_ID
having count(*) > 1