2025-08-19 00:29

Tags: SQL

GROUP BY

  • 각 행을 특정 조건에 따라 그룹으로 분리하여 계산하도록 하는 구문식
  • GROUP BY 절에 그룹을 지정할 컬럼을 전달(여러 개 전달 가능)
  • 만약 그룹 연산에서 제외할 대상이 있다면 미리 WHERE 절에서 해당 행을 제외함 (WHERE 절이 GROUP BY 절보다 먼저 수행되므로)
  • 그룹에 대한 조건은 WHERE 절에서 사용할 수 없음
  • SELECT 절에 집계 함수를 사용하여 그룹별로 결과 표현
  • GROUP BY 절을 사용하면 데이터가 요약되므로 요약되기 전 데이터와 함께 출력할 수 없음
  • 그룹 함수의 결과를 조건으로 사용할때 사용하는 절은 HAVING

예제) 직군(JOB_ID)별 급여 총 합과 급여 평균 출력

SELECT JOB_ID, SUM(SALARY),  
ROUND(AVG(SALARY))  
FROM EMPLOYEES  
GROUP BY JOB_ID;
JOB_IDSUM(SALARY)ROUND(AVG(SALARY))
AC_MGR1200812008
AC_ACCOUNT83008300
IT_PROG288005760
ST_MAN364007280
AD_ASST44004400
PU_MAN1100011000
SH_CLERK643003215

주의 사항

GROUP BY와 집계 함수 쉽게 이해하기

  • GROUP BY로 그룹화를 한 이후에는 그룹화 기준이 아닌 칼럼을 SELECT 절에 사용할 수 없다.
SELECT POSITION, COUNT(*) 인원수, HEIGHT
FROM PLAYER
GROUP BY POSITION

오류

  • 이렇게 작성하면 포지션별로 묶어 각 포지션별 인원수와 키를 출력하려는 건데, 이 때 포지션별 키는 단 하나의 값이 아니라 여러 값이 존재한다.
  • 즉, 같은 묶음의 상태라고 하더라도 하나의 칼럼값에 해당하는 데 이 값은 한 개나 여러 개가 될 수 있다.
SELECT POSITION, COUNT(*) 인원수, ROUND(AVG(HEIGHT),2) 평균
FROM PLAYER
GROUP BY POSITION
  • 그룹화되지 않은 칼럼을 사용하고 싶다면 집계 함수로 통계할 값 그룹에서 해당 함수를 요약해야 한다.

GROUP BY 절과 HAVING 절의 정리

  • GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용한다.
  • 집계 함수의 통계 정보는 NULL 값도 가진 행을 제외하고 수행한다.
  • ALIAS 명칭 사용을 못 한다.
  • 집계 그룹 함수는 WHERE 절에는 올 수 없다 사용한다.
  • WHERE 절은 전체 테이블을 GROUP으로 나누기 전에 행들을 미리 제거한다.
  • HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시할 수 있다.
  • GROUP BY절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력한다.
  • HAVING 절은 일반적으로 GROUP BY 뒤에 위치한다.