집계·GROUP BY·HAVING·NULL

정보처리실무 · SQL·데이터베이스

이 페이지의 목차

학습 목표

NULL을 제외하는 집계와 행 전체를 세는 집계를 구별한다.

본문

핵심 이론

COUNT(*)는 행 수이고 COUNT(col)은 col이 NULL이 아닌 행 수다. COUNT(DISTINCT col)은 NULL을 제외한 서로 다른 값 수다.

SUM·AVG·MIN·MAX는 NULL을 제외한다. AVG의 분모는 해당 열의 비NULL 값 수다. 예를 들어 10,NULL,20의 COUNT(*)는 3, COUNT(col)은 2, AVG는 15다.

GROUP BY는 같은 그룹 키를 묶는다. NULL 그룹 키들도 한 그룹으로 묶인다. WHERE는 그룹 생성 전 행을, HAVING은 집계 후 그룹을 제한한다.

NULL이 포함된 논리는 UNKNOWN을 가질 수 있다. WHERE에서 TRUE만 남으므로 FALSE와 UNKNOWN 모두 제외된다. 빈 입력에 대한 COUNT는 0이고 일반적인 SUM·AVG는 NULL이다.

NULL이 있는 집계는 분모부터 다르다

값이 10·NULL·20인 집합에서 COUNT(*)는 3, COUNT(값)는 2, SUM은 30, AVG는 30/2=15다. AVG는 NULL을 0으로 바꿔 세 개로 나누지 않는다. 값이 10·10·NULL이면 COUNT(DISTINCT 값)는 서로 다른 비NULL 값 하나만 센다.

처리 단계대상판단
WHERE개별 행이 행을 집계에 넣을 것인가
GROUP BY같은 그룹값의 행들어떤 묶음으로 계산할 것인가
HAVING집계된 그룹이 그룹을 결과에 남길 것인가

그룹마다 원본 값 목록·행 수·비NULL 수·합계를 적으면 HAVING 조건을 쉽게 대조할 수 있다. NULL도 GROUP BY에서는 하나의 그룹으로 묶일 수 있으나 NULL=NULL 비교가 참이라는 뜻은 아니다.

집계 대상 행이 전혀 없는 경우도 별도로 확인한다. GROUP BY 없는 전체 집계에서는 COUNT(*)=0, SUM= NULL인 결과 한 행이 나올 수 있다. GROUP BY로 만들어질 그룹 자체가 없으면 결과 행도 없다. NULL·숫자 0·결과 행 없음은 서로 바꾸어 답하지 않는다.

풀이 예시

아래 테이블에 대해 SQL을 실행한 결과를 열의 순서대로 쓰시오. NULL은 NULL로 표기한다.

[Score]

n
8
NULL
14
8

[실행할 SQL]

SQL
SELECT COUNT(DISTINCT n), SUM(n), AVG(n) FROM Score;
정답과 풀이 보기

예시 정답

예시·텍스트
2 | 30 | 10.0

풀이 과정

NULL은 세 집계 모두에서 값으로 사용되지 않는다. 서로 다른 값은 8과 14로 두 개다. SUM은 중복 8도 포함해 30이고 AVG의 분모는 4가 아닌 세 개의 비NULL 값이어서 10이다.