본문 바로가기
자격증 준비/SQLD

GROUP BY란 무엇인가: SQL 초보자도 이해하는 그룹화 개념 정리

by 코딩사무소장 2026. 3. 14.
반응형

GROUP BY란 무엇인가: SQL 초보자도 이해하는 그룹화 개념 정리

SQL을 공부하다 보면 GROUP BY를 꼭 만나게 됩니다. COUNT, SUM, AVG 같은 집계 함수와 함께 자주 나오기 때문에 처음에는 “왜 갑자기 그룹을 나누는지”, “언제 써야 하는지” 헷갈리기 쉽습니다. 결론부터 말하면 GROUP BY는 같은 값을 가진 행끼리 묶어서 집계하기 위한 구문입니다. 이 글에서는 SQL 초보자와 SQLD 준비생이 헷갈리지 않도록 GROUP BY의 의미, 왜 필요한지, 예제, 자주 하는 실수까지 한 번에 정리해보겠습니다.

이 글은 이런 분께 추천합니다
  • GROUP BY가 왜 필요한지 헷갈리는 분
  • 집계 함수와 GROUP BY 관계를 정리하고 싶은 분
  • SQLD에서 GROUP BY 문제를 자주 틀리는 분
  • 부서별 합계, 카테고리별 개수 같은 조회를 이해하고 싶은 비전공자

GROUP BY란 무엇인가

GROUP BY는 같은 값을 가진 행들을 하나의 그룹으로 묶는 구문입니다.

예를 들어 직원 테이블이 있다고 할 때, 전체 직원 수만 알고 싶은 것이 아니라 부서별 직원 수를 알고 싶을 수 있습니다. 이럴 때 department_id가 같은 행끼리 묶어서 집계해야 하는데, 그 역할을 하는 것이 GROUP BY입니다.

쉽게 말하면 GROUP BY는 “비슷한 것끼리 묶어서 계산하기”입니다.

왜 GROUP BY가 필요할까

집계 함수만 쓰면 전체 데이터를 한 번에 요약할 수 있습니다. 하지만 실무나 시험에서는 보통 전체 합계보다 그룹별 합계, 그룹별 평균, 그룹별 개수를 더 자주 구하게 됩니다.

  • 부서별 직원 수
  • 카테고리별 상품 수
  • 학과별 평균 점수
  • 월별 매출 합계

이런 계산은 같은 기준끼리 묶어야 하기 때문에 GROUP BY가 필요합니다.

가장 기본적인 예제

부서별 직원 수를 구하는 가장 기본적인 쿼리는 아래처럼 볼 수 있습니다.

SELECT department_id, COUNT(*) AS cnt
FROM employees
GROUP BY department_id;

이 쿼리는 employees 테이블에서 department_id가 같은 행끼리 묶은 뒤, 각 그룹마다 COUNT(*)를 계산합니다.

즉,

  1. department_id가 같은 직원끼리 그룹을 만든다
  2. 각 그룹에 몇 명이 있는지 센다

GROUP BY는 집계 함수와 같이 생각해야 한다

GROUP BY는 보통 COUNT, SUM, AVG, MAX, MIN 같은 집계 함수와 함께 나옵니다.

예를 들어 부서별 평균 급여를 구하고 싶다면 이렇게 작성할 수 있습니다.

SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;

이 경우 GROUP BY가 없다면 부서별 평균이 아니라 전체 평균만 구하게 됩니다.

GROUP BY를 쓰면 SELECT에 아무 컬럼이나 넣을 수 있을까

초보자가 가장 많이 헷갈리는 부분 중 하나가 바로 이것입니다. 결론부터 말하면 GROUP BY에 없는 일반 컬럼은 보통 SELECT에 마음대로 넣을 수 없습니다.

예를 들어 아래 쿼리는 문제가 될 수 있습니다.

SELECT department_id, name, COUNT(*)
FROM employees
GROUP BY department_id;

department_id 기준으로 그룹을 만들었는데, name은 같은 그룹 안에 여러 개가 있을 수 있기 때문입니다. 그래서 보통 SELECT에는 아래 둘만 들어갈 수 있다고 먼저 생각하면 쉽습니다.

  • GROUP BY에 사용한 컬럼
  • 집계 함수로 계산한 값

GROUP BY를 쓸 때는 “무엇으로 묶었는가”“무엇을 요약했는가”를 같이 봐야 합니다.

GROUP BY와 WHERE는 어떻게 다를까

WHERE는 행을 먼저 필터링하는 구문이고, GROUP BY는 행을 묶는 구문입니다.

예를 들어 2024년 이후 입사자만 대상으로 부서별 직원 수를 구하고 싶다면, 먼저 WHERE로 행을 줄인 뒤 GROUP BY를 해야 합니다.

SELECT department_id, COUNT(*) AS cnt
FROM employees
WHERE hire_year >= 2024
GROUP BY department_id;

즉, WHERE는 그룹화 전에 적용되고, GROUP BY는 그 이후에 동작한다고 이해하면 쉽습니다.

GROUP BY와 HAVING은 어떻게 다를까

GROUP BY는 그룹을 만드는 구문이고, HAVING은 그룹 결과에 조건을 거는 구문입니다.

예를 들어 부서별 직원 수를 구한 뒤, 인원이 5명 이상인 부서만 보고 싶다면 HAVING을 씁니다.

SELECT department_id, COUNT(*) AS cnt
FROM employees
GROUP BY department_id
HAVING COUNT(*) >= 5;

이 흐름을 기억하면 WHERE와 HAVING 차이도 함께 정리됩니다.

GROUP BY를 표로 정리하면

구분 설명 예시
GROUP BY 같은 값끼리 그룹화 부서별, 카테고리별
WHERE 행 필터링 2024년 이후 입사자만
HAVING 그룹 결과 필터링 인원 5명 이상 부서만

초보자가 자주 하는 실수

자주 하는 실수 1

GROUP BY 없이 일반 컬럼과 집계 함수를 함께 쓰는 것

예를 들어 department_id와 COUNT(*)를 같이 보여주고 싶다면 보통 GROUP BY department_id가 필요합니다.

자주 하는 실수 2

WHERE와 HAVING 역할을 헷갈리는 것

WHERE는 행 조건, HAVING은 그룹 조건이라고 구분해야 합니다.

자주 하는 실수 3

GROUP BY를 단순 암기만 하는 것

GROUP BY는 “같은 기준끼리 묶어서 계산한다”는 의미를 이해하는 것이 더 중요합니다.

비전공자는 이렇게 외우면 쉽다

  • GROUP BY = 같은 값끼리 묶기
  • WHERE = 묶기 전에 거르기
  • HAVING = 묶은 뒤에 거르기
  • 집계 함수와 함께 나올 때 가장 중요하다고 기억하면 쉽습니다.

핵심 요약

  • GROUP BY는 같은 값을 가진 행끼리 묶는 구문입니다.
  • 집계 함수와 함께 쓰면 그룹별 개수, 합계, 평균 등을 구할 수 있습니다.
  • GROUP BY를 쓸 때는 보통 GROUP BY 컬럼과 집계 함수만 SELECT에 두는 것이 안전합니다.
  • WHERE는 행 조건, HAVING은 그룹 조건입니다.
  • GROUP BY는 “같은 기준끼리 묶어서 계산한다”로 이해하면 쉽습니다.

FAQ

GROUP BY는 왜 필요한가요?

전체가 아니라 부서별, 카테고리별처럼 그룹별 집계를 하기 위해 필요합니다.

GROUP BY 없이 COUNT나 SUM을 쓸 수 있나요?

네. 가능하지만 그 경우 전체 데이터에 대한 하나의 결과만 나오게 됩니다.

GROUP BY와 HAVING 차이는 무엇인가요?

GROUP BY는 그룹을 만드는 구문이고, HAVING은 그룹 결과에 조건을 거는 구문입니다.

GROUP BY를 쓸 때 SELECT에 아무 컬럼이나 넣어도 되나요?

보통은 GROUP BY에 포함된 컬럼이나 집계 함수 결과만 두는 것이 맞습니다.

SQLD에서도 GROUP BY가 자주 나오나요?

네. 집계 함수, HAVING, 서브쿼리와 함께 매우 자주 출제되는 핵심 개념입니다.

반응형