집계입문

GROUP BY

특정 컬럼 값이 같은 행들을 묶어서 통계를 내는 절

정의

같은 값을 가진 행들을 하나의 그룹으로 묶고, 그룹별로 COUNT, SUM, AVG 같은 집계 함수를 적용한다. 예: "GROUP BY dept_id" 하면 부서별로 묶이고, 거기에 COUNT(*)을 쓰면 부서별 인원수가 나온다. SELECT에 적은 컬럼 중 집계 함수가 아닌 컬럼은 모두 GROUP BY에 들어가야 한다.

왜 중요한가?

리포트와 통계의 출발점. 부서별 인원수, 월별 매출, 카테고리별 판매량 같은 모든 요약 통계는 GROUP BY로 시작한다. 일반 컬럼을 GROUP BY에 안 넣고 SELECT에 적으면 오라클은 에러(ORA-00979)를 낸다.

틀리기 쉬운 포인트

  • !SELECT에 집계 함수와 일반 컬럼을 혼용할 때 GROUP BY에 일반 컬럼을 빠뜨림 (ORA-00979)
  • !WHEREHAVING을 혼동하여 그룹 조건을 WHERE에 작성
  • !GROUP BY 컬럼과 SELECT 컬럼의 불일치로 에러 발생

예시

SELECT department_id, COUNT(*), AVG(salary)
FROM employees
GROUP BY department_id
HAVING COUNT(*) >= 3;

성능 포인트

!GROUP BY 컬럼이 인덱스의 선두 컬럼과 일치하면 정렬 비용 없이 처리될 수 있다. PGA가 부족하면 Disk Sort로 떨어져 성능이 급락한다.

관련 개념

관련 문제 풀어보기

관련 카테고리