집계·GROUP BY·HAVING·NULL
NULL을 제외하는 집계와 행 전체를 세는 집계를 구별한다.
실기 학습 목표
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]
SELECT COUNT(DISTINCT n), SUM(n), AVG(n) FROM Score;
예시 정답
2 | 30 | 10.0
풀이 과정
NULL은 세 집계 모두에서 값으로 사용되지 않는다. 서로 다른 값은 8과 14로 두 개다. SUM은 중복 8도 포함해 30이고 AVG의 분모는 4가 아닌 세 개의 비NULL 값이어서 10이다.
답안 점검
위 풀이 예시의 답을 가린 뒤, 핵심 이론의 규칙을 적용해 직접 풀어 보세요. 코드와 계산 문제는 중간값·단위·최종 출력의 순서를, 용어 문제는 지문의 핵심 단서와 답의 의미를 점검하세요. 해설과 다른 부분이 있으면 어느 조건을 놓쳤는지 확인하고 연결된 실기 문제로 다시 연습하세요.