Skip to Content
Suffering builds character

9.GROUP BY, HAVING

1. GROUP BY 절

그룹화(Grouping), 테이블에서 특정 컬럼을 기준으로 데이터들을 묶어서 조회(Grouping)하고자 할 때는 GROUP BY 키워드를 사용

rental 테이블을 조회해서 가장 대여를 많이 한 고객에게 사은품을 주어야하는데, 그러한 고객을 찾기 위한 방법

rental 테이블 기본 형태 조회

sql
SELECT * FROM rental LIMIT 20;

rental 테이블에서 customer_id, rental_date열 데이터를 위에서부터 30행 조회

sql
SELECT customer_id FROM rental LIMIT 30;

rental 테이블에서 customer_id를 그룹핑하여 조회

sql
SELECT customer_id FROM rental GROUP BY customer_id;

→ 총 회원 수는 599명

rental 테이블에서 customer_id 및 각 customer가 대여(rental)한 횟수를 카운트하여 별도의 열로 조회

sql
SELECT customer_id, count(rental_date) FROM rental GROUP BY customer_id;

→ count( )는 그룹핑된 customer_id의 행 수(599개)를 카운트하고, ( * )는 그룹핑된 customer_id 열에 각각 매칭되어있는 행의 개수를 셈

rental 테이블에서 customer_id 및 각 customer가 대여(rental)한 횟수를 카운트하여 대여한 횟수를 기준으로 내림차순하여 조회

sql
SELECT customer_id, count(*) FROM rental GROUP BY customer_id ORDER BY 2 DESC;

→ customer_id가 148번인 회원이 46회로 가장 많이 대여, 318번 회원이 12번으로 가장 적게 대여하였음

“이렇게 그룹핑된 결과셋 데이터에서 대여 횟수가 40회 미만인 회원들은 제외하고 조회하기 위해 조건식을 작성해야 하는 위치?”

대여 횟수가 40번 미만인 데이터는 제외(필터링)하여 조회(잘못된 WHERE 절 사용 예시)

sql
SELECT customer_id, count(*) FROM rental WHERE count(*) < 40 GROUP BY customer_id;

→ ERROR 발생, 위 Query가 실행되는 순서상 WHERE 절이 적용되는 시점이 그룹핑되는 시점보다 먼저 적용되기 때문에 WHERE 절에서 count(*)를 참조 불가

2. HAVING 절

그룹핑한 열에 대한 필터링 조건은 별도의 키워드 HAVING을 사용해야함

대여 횟수가 40번 미만인 데이터는 제외(필터링)하여 조회, 두번째 열인 count(*) 기준으로 정렬

sql
SELECT customer_id, count(*) FROM rental GROUP BY customer_id HAVING count(*) > 40 ORDER BY 2 DESC;
Last updated on