개발 개념 정리/SQL

[SQL] GROUP BY와 집계 함수의 이해하기

개발하는 몽키 2025. 3. 19. 09:40

SQL에서 GROUP BY 와 집계함수 (COUNT(), SUM(), AVG(), MAX(), MIN())를 사용할 때 헷갈렸던 경험을 정리하였다.

처음에는 집계함수가 어떤 순서로 실행되는지, 그리고 왜 HAVING 과 WHERE 을 적절히 구분해야하는지 혼동했었다.

 

  1. 문제의 시작 :
    1. 문제는 WHERE 절에서 왜 집계함수를 사용할 수 없는지 이해하는데서 시작되었다.
    2. SQL에서 WHERE 절은 데이터를 필터링 하는데 쓰이는데, 집계함수는 데이터를 그룹화 한 후에 사용할 수 있기 때문에 WHERE에서는 사용할 수 없다는 사실을 몰랐었다.
  2. WHERE vs HAVING:
    1. WHERE 절은 그룹화되기 전에 조건을 걸기 때문에 집계 함수가 적용되지 않은 상태에서 데이터를 필터링할 수 있다.
    2. HAVING 절은 그룹화된 후에 조건을 걸기 때문에 집계 함수가 적용된 후에 조건을 걸고 싶을 때 사용할 수 있다.
  3. SQL 실행 순서:
1. FROM 데이터를 가져올 테이블을 선택한다.
2. WHERE 테이블에서 조건을 걸어서 데이터를 필터링한다.
3. GROUP BY 데이터를 그룹화하여 집계를 위한 단계를 만든다.
4. HAVING 그룹화된 데이터에 조건을 추가한다. (집계가 된 후)
5. SELECT 결과로 가져올 열을 선택한다.
6. ORDER BY 결과를 정렬한다.

 

[ 핵심은 GROUP BY ]

GROUP BY데이터를 집계하기 위해 필요한 단계이다. 이때 데이터를 그룹화 하는 작업이 이뤄지고, 집계함수를 적용할 수 있는 상태가 된다.

 

    4. 집계 함수와 그룹화:

  • 집계 함수는 데이터를 그룹화 한 후에 적용된다. 예를들어 COUNT(*)는 각 그룹별로 개수를 세는 함수이므로 데이터가 그룹화 되지 않으면 제대로 된 결과를 얻을 수 없다.
  • GROUP BY 는 데이터를 특정기준(ex. Country)으로 그룹화 라는 역할을 한다. 

 

    5. SQL 예시 분석:

SELECT Country, COUNT(*) AS Count
FROM Suppliers
GROUP BY Country
HAVING Count >= 3;
  • 위 예시에서 COUNT(*)GROUP BY로 그룹화 된 후에 계산되므로 위에서 설명했던 WHERE 절이 아닌 HAVING 절에서 그 값을 필터링 할 수 있다.
  • COUNT(*)는 각각의 Country 그룹에 대한 행의 개수를 세기 위한 함수인데 COUNT(*) 값이 3이상인 그룹만 선택하는 것이다.

 

   5. WHERE에서 집계함수를 사용하지 못하는 이유:

  • WHERE 절은 그룹화 되기 전에 실행되기 된다. 그러나 집계함수는 그룹화 된 후에 계산할 수 있기 때문에 WHERE 에서는 집계함수를 사용할 수 없다는 것을 알게되었다.

 

결론 : 

  • 집계함수는 항상 GROUP BY 절과 같이 쓰인다.
  • WHERE 에서는 데이터를 그룹화 하기 전의 상태에서만 필터링 할 수 있다.
  • 그룹화된 데이터에 조건을 걸고 싶으면 HAVING 을 사용해야 한다.