9장(데이터 그룹핑)
이 연산 테이블에 있는 모든 데이터 또는 WHERE절 조건에 일치하는 특정 데이터만을 대상으로 하여 수행할 수 있다.
그런데 만약 원하는 것이 각 판매처의 제품 수를 구하는 것이라면? 또는 하나의 제품만을 파는 판매처나 10개 이상을 파는 판매처가 몇 개인지 확인하고 싶다면 어떻게 해야 할까. 이 때 그룹핑이 필요하다. 그룹핑은 데이터를 논리적으로 나눠주기 때문에 각 그룹에 대한 집계 연산을 할 수 있다.
그룹 생성하기
그룹은 SELECT 구문에서 GROUP BY절을 사용해서 생성 가능
GROUP BY를 사용하면 그룹핑 되어 자동으로 각 그룹에 대해 계산하기 때문에, 그룹을 따로 명시할 필요가 없다. GROUP BY절은 DBMS에게 먼저 데이터를 그룹핑하게 한 후 각 그룹에 대한 계산을 하라고 지시한다.
그룹 필터링
WHERE은 행을 필터링하고, HAVING은 그룹을 필터링한다는 점에서 차이가 있다. 문법은 동일하지만 키워드만 다르다.
아까의 구문과 비슷하지만 마지막 줄에 HAVING절이 추가가 됐다. COUNT(*) >= 2는 2개 이상을 주문한 그룹만 가져온다.
WHERE절의 특정한 행의 값이 아니라, 그룹핑된 집계 값으로 필터링하기 때문에 WHERE절 사용 불가
가격이 4달러 이상인 제품을 두 개 이상 가진 판매처를 구하는 예제
WHERE절이 prod_price가 4달러 이상인 행을 가져온다. 그리고 vend_id로 그룹핑 해서 4달러 이상인 제품이 2개 이상인 곳을 필터링 하는 것이다.
WHERE 절이 없다면 더 많은 행이 검색이 될 것이다.
이렇게 말이다. GROUP BY절이 있을 때만 HAVING을 사용하고, 행 단위를 필터링 할 때는 WHERE을 사용하도록 하자
그룹핑과 정렬
GROUP BY와 ORDER BY가 같은 결과를 가져온다 할지라도, 이 둘은 매우 다르다는 것을 이해하는 것이 중요하다.
ORDER BY를 잊지 말자. GROUP BY절을 사용할 때마다 ORDER BY절을 명시해야 한다. 그렇게 해야 데이터가 제대로 정렬 되었다고 확신할 수 있다.
세 개 이상의 제품을 주문한 경우, 주문 번호와 주문 수량을 가져오는 예제
주문 수량으로 정렬하려면 ORDER BY절만 덧붙이면 된다.
깔끔하게 필터링 되었다.
SELECT절 순서
SELECT : 가져올 컬럼이나 수식
FROM : 데이터를 가져올 테이블
WHERE : 행 레벨 필터링
GROUP BY : 그룹 지정
HAVING : 그룹 레벨 필터링
ORDER BY : 정렬 순서