개발 개념 정리/SQL
[SQL] GROUP BY와 집계 함수의 이해하기
개발하는 몽키
2025. 3. 19. 09:40
SQL에서 GROUP BY 와 집계함수 (COUNT(), SUM(), AVG(), MAX(), MIN())를 사용할 때 헷갈렸던 경험을 정리하였다.
처음에는 집계함수가 어떤 순서로 실행되는지, 그리고 왜 HAVING 과 WHERE 을 적절히 구분해야하는지 혼동했었다.
- 문제의 시작 :
- 문제는 WHERE 절에서 왜 집계함수를 사용할 수 없는지 이해하는데서 시작되었다.
- SQL에서 WHERE 절은 데이터를 필터링 하는데 쓰이는데, 집계함수는 데이터를 그룹화 한 후에 사용할 수 있기 때문에 WHERE에서는 사용할 수 없다는 사실을 몰랐었다.
- WHERE vs HAVING:
- WHERE 절은 그룹화되기 전에 조건을 걸기 때문에 집계 함수가 적용되지 않은 상태에서 데이터를 필터링할 수 있다.
- HAVING 절은 그룹화된 후에 조건을 걸기 때문에 집계 함수가 적용된 후에 조건을 걸고 싶을 때 사용할 수 있다.
- 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 을 사용해야 한다.