그룹지어 통계낼 땐 GROUP BY

윤빈·2026년 1월 16일

SQL & Database

목록 보기
4/25

특정 그룹을 뽑고 싶으면 WHERE 써서 필터링하면 되는데
그룹 별로 뽑고 싶으면 GROUP BY 문법을 사용하면 편리하다

GROUP BY

SELECT 고객등급 FROM card 
GROUP BY 고객등급 
고객등급 카테고리끼리 그룹이 지어진 것을 볼 수 있다.
SELECT 고객등급, COUNT(고객명) FROM card 
GROUP BY 고객등급
집계함수를 더해서 각 등급마다 고객이 몇 명인지 출력할 수 있다.
SELECT 고객등급, AVG(사용금액) FROM card 
GROUP BY 고객등급 
각 등급마다 평균 사용금액이 얼마인지 출력할 수 있다.

GROUP BY는 category column에 주로 사용함


category column은 여러 항목 중 어떤 항목에 속하는지 분류하기 위해 만든 컬럼이다.

이 테이블에서는 고객등급이 category column에 가장 가깝다.
가격이나 재고 컬럼도 category column이라고 볼 수 있지만, 중복된 데이터들이 많아서 그룹을 지을 수 있는 컬럼이 좋다.


GROUP BY 한 결과도 필터링 가능

GROUP BY로 그룹지어서 출력한 것도 필터링할 수 있는데
뒤에 HAVING 조건문을 쓰면 된다.
GROUP BY 뒤에만 붙일 수 있는 특별한 조건문이다.

SELECT 고객등급, COUNT(고객명) FROM card 
GROUP BY 고객등급 
HAVING 고객등급 = 'vip' 

아까 출력한 3개의 행 중에 고객등급 = "vip"인 1개의 행만 필터링해준다.


HAVING vs WHERE

HAVING과 WHERE은 용도가 비슷하다. 둘 다 조건에 맞는 것만 필터링하는 문법이다.

  1. HAVING
    GROUP BY 결과를 필터링하고 싶을 때 쓴다.
    그래서 GROUP BY 뒤에만 붙일 수 있다.
  2. WHERE
    테이블 전체 데이터 출력시 필터링하고 싶을 때 쓴다.
    그래서 SELECT FROM 뒤에만 붙일 수 있다.
SELECT 고객등급, COUNT(고객명) FROM card 
WHERE 연체횟수 = 0 
GROUP BY 고객등급 
HAVING 고객등급 = 'vip' 

위의 코드는
연체횟수가 0인 행을 필터링하고
그 결과를 고객등급으로 그룹화하고
그 결과를 고객등급 = "vip"인 행만 필터링해서
고객등급과 각 고객등급에 고객이 몇명인지 출력한다.

profile
취준하려면 이런건하나씩있어야한다길래

0개의 댓글