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_ID | SUM(SALARY) | ROUND(AVG(SALARY)) |
---|---|---|
AC_MGR | 12008 | 12008 |
AC_ACCOUNT | 8300 | 8300 |
IT_PROG | 28800 | 5760 |
ST_MAN | 36400 | 7280 |
AD_ASST | 4400 | 4400 |
PU_MAN | 11000 | 11000 |
SH_CLERK | 64300 | 3215 |
주의 사항
- 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 뒤에 위치한다.