학습 목표
NULL을 제외하는 집계와 행 전체를 세는 집계를 구별한다.
본문
핵심 이론
COUNT(*)는 행 수이고 COUNT(col)은 col이 NULL이 아닌 행 수다. COUNT(DISTINCT col)은 NULL을 제외한 서로 다른 값 수다.
SUM·
GROUP BY는 같은 그룹 키를 묶는다. NULL 그룹 키들도 한 그룹으로 묶인다. WHERE는 그룹 생성 전 행을, HAVING은 집계 후 그룹을 제한한다.
NULL이 포함된 논리는 UNKNOWN을 가질 수 있다. WHERE에서 TRUE만 남으므로 FALSE와 UNKNOWN 모두 제외된다. 빈 입력에 대한 COUNT는 0이고 일반적인 SUM·
NULL이 있는 집계는 분모부터 다르다
값이 10·
| 처리 단계 | 대상 | 판단 |
|---|---|---|
| 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]
SELECT COUNT(DISTINCT n), SUM(n), AVG(n) FROM Score;
정답과 풀이 보기
예시 정답
2 | 30 | 10.0
풀이 과정
NULL은 세 집계 모두에서 값으로 사용되지 않는다. 서로 다른 값은 8과 14로 두 개다. SUM은 중복 8도 포함해 30이고 AVG의 분모는 4가 아닌 세 개의 비NULL 값이어서 10이다.