본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
  • 상위 문서: SQL
Group Function
여러 행을 그룹으로 묶어 하나의 결과를 돌려주는 함수와, 소계·총계를 함께 만드는 GROUP BY 확장 기능
함수 설명
COUNT(*) / COUNT(컬럼) 행 수. COUNT(컬럼)은 NULL을 세지 않는다.
SUM, AVG 합계, 평균(NULL 제외)
MAX, MIN 최댓값, 최솟값
STDDEV, VARIANCE 표준편차, 분산(Oracle 함수명. 표준 SQL은 STDDEV_SAMP, VAR_SAMP 등)
  • COUNT(*)를 제외한 집계 함수는 NULL을 무시한다.

GROUP BY와 HAVING

편집 원본 편집
SELECT 부서, COUNT(*) AS 인원, AVG(급여) AS 평균급여
FROM 사원
WHERE 입사년도 >= 2020     -- 그룹을 만들기 전에 행을 거른다
GROUP BY 부서
HAVING COUNT(*) >= 3;      -- 그룹을 만든 뒤 그룹을 거른다
  • 처리 순서: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
  • 집계 함수 조건은 WHERE에 쓸 수 없고 HAVING에 쓴다.
  • GROUP BY를 쓰면 SELECT 절에는 GROUP BY 컬럼과 집계 함수만 올 수 있다.

ROLLUP, CUBE, GROUPING SETS

편집 원본 편집

판매 테이블

지역 제품 수량
서울 A 10
서울 B 20
부산 A 30

나열한 컬럼의 오른쪽부터 하나씩 빼며 계층별 소계를 만든다. n개 컬럼이면 n+1단계의 그룹이 생기며, 컬럼 순서가 바뀌면 결과도 바뀐다.

SELECT 지역, 제품, SUM(수량) AS 합계
FROM 판매
GROUP BY ROLLUP(지역, 제품)
ORDER BY 지역, 제품;

나열한 컬럼의 모든 조합으로 소계를 만든다. n개 컬럼이면 2n가지 그룹이 생긴다.

SELECT 지역, 제품, SUM(수량) AS 합계
FROM 판매
GROUP BY CUBE(지역, 제품)
ORDER BY 지역, 제품;
지역 제품 합계 그룹 기준 ROLLUP CUBE
부산 A 30 (지역, 제품) ○ ○
부산 NULL 30 (지역) 소계 ○ ○
서울 A 10 (지역, 제품) ○ ○
서울 B 20 (지역, 제품) ○ ○
서울 NULL 30 (지역) 소계 ○ ○
NULL A 40 (제품) 소계 ○
NULL B 20 (제품) 소계 ○
NULL NULL 60 총계 ○ ○
  • ROLLUP은 6행, CUBE는 8행이다. CUBE만 제품별 소계(A 40, B 20)를 더 만든다.
  • 표의 정렬은 Oracle 기준이다. Oracle은 오름차순 정렬에서 NULL을 맨 뒤에 둔다.

원하는 그룹 기준만 골라 각각 집계한 뒤 합친다(UNION ALL과 같은 효과).

SELECT 지역, 제품, SUM(수량) AS 합계
FROM 판매
GROUP BY GROUPING SETS((지역), (제품));
-- 결과: (부산, NULL, 30), (서울, NULL, 30), (NULL, A, 40), (NULL, B, 20)
  • ROLLUP(지역, 제품) = GROUPING SETS((지역, 제품), (지역), ())
  • CUBE(지역, 제품) = GROUPING SETS((지역, 제품), (지역), (제품), ())

소계·총계를 만들면서 생긴 NULL이면 1, 실제 데이터 값이면 0을 돌려준다. 원래 데이터의 NULL과 소계 행을 구분할 때 쓴다.

SELECT CASE GROUPING(지역) WHEN 1 THEN '전체' ELSE 지역 END AS 지역,
       CASE GROUPING(제품) WHEN 1 THEN '소계' ELSE 제품 END AS 제품,
       SUM(수량) AS 합계
FROM 판매
GROUP BY ROLLUP(지역, 제품);
  • MySQL은 GROUP BY 지역, 제품 WITH ROLLUP 문법을 쓰며, CUBE와 GROUPING SETS는 지원하지 않는다. GROUPING 함수는 8.0부터 지원한다.
  • 실기 SQL: GROUP BY와 HAVING으로 조건에 맞는 그룹을 조회하는 문장 작성
  • ROLLUP과 CUBE의 결과 행 수 차이(n+1단계, 2n가지)와 소계 행의 NULL
  • 필기: WHERE와 HAVING의 차이, COUNT(*)와 COUNT(컬럼)의 NULL 처리 차이