0Pricing
SQL Academy · 강의

흔한 함정: 집계에서의 NULL

AVG가 NULL을 무시하고 COUNT(열)이 NULL을 건너뛰며 NULL을 허용하는 열로 그룹화할 때 예상 밖의 결과가 생기는 고전적인 NULL 함정을 피합니다.

흔한 함정: 집계에서의 NULL은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

집계 함수는 NULL을 제외합니다

COUNT(*)를 제외한 모든 집계 함수는 NULL 입력을 무시합니다. 이것이 원하는 결과일 때도 있지만, 버그가 될 때도 있습니다.

흔한 함정: COUNT(*)와 COUNT(col)

열에 NULL이 있으면 두 결과가 달라집니다.

SELECT COUNT(*)         FROM users;      -- 1000
SELECT COUNT(email)     FROM users;      -- 950  (50 users have NULL email)

버그: AVG는 NULL을 0으로 세지 않습니다

평점 [5, 5, NULL] → AVG = 5입니다. (5+5+0)/3 = 3.33이 아닙니다. 이것이 원하는 결과인지 결정해야 합니다.

SELECT AVG(rating) FROM reviews;        -- 5
SELECT AVG(COALESCE(rating, 0)) FROM reviews;   -- 3.33

빈 테이블 = NULL 집계 결과

일치하는 행이 없으면 SUM/AVG/MIN/MAX는 0이 아니라 NULL을 반환합니다. COALESCE로 처리할 수 있습니다.

SELECT COALESCE(SUM(total), 0) AS revenue
FROM orders
WHERE user_id = 999999;       -- safe even when user has no orders

NULL 열의 SUM

모든 행의 값이 NULL이면 SUM은 0이 아니라 NULL을 반환합니다. 이것도 같은 함정입니다.

NULL 그룹화 키와 GROUP BY

NULL은 별도의 그룹을 형성합니다.

SELECT country, COUNT(*) FROM users
GROUP BY country;
-- → ('US', 100), ('CA', 30), (NULL, 5)

NULL이 있을 때 고유 값 세기

COUNT(DISTINCT col)은 NULL을 무시합니다.

INSERT INTO t (c) VALUES (1),(2),(NULL),(NULL),(2);
SELECT COUNT(DISTINCT c) FROM t;   -- 2 (NULL not counted)

여러 열의 DISTINCT

NULL을 포함하는 튜플은 NULL이 아닌 열이 같더라도 다른 튜플과 구별되는 고유 값으로 취급됩니다.

SELECT COUNT(*) FROM (
  SELECT DISTINCT a, b FROM t
) sub;

선택적 테이블에 대한 암시적 조심스러운 조인

LEFT JOIN은 집계 결과를 바꿀 수 있는 NULL을 추가할 수 있습니다. 해당 행을 셀지 아니면 제외할지 결정해야 합니다.

SELECT u.id, COUNT(o.id) AS orders
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id;          -- COUNT(o.id) gives 0 for users with no orders

조건부 개수에 FILTER 사용하기

가독성 면에서 FILTER가 CASE를 SUM 안에 넣는 방식보다 낫습니다.

SELECT COUNT(*) FILTER (WHERE status = 'paid') AS paid_count,
       COUNT(*) FILTER (WHERE status = 'refunded') AS refund_count
FROM orders;

집계 함수는 항상 NULL로 테스트하기

새 집계 쿼리를 추가할 때는 NULL이 포함된 샘플을 대상으로 실행하세요. 깨끗한 테스트 데이터에서는 이 버그가 거의 나타나지 않습니다.

복습

NULL과 집계 함수의 조합은 SQL에서 가장 흔한 버그입니다.

  • 집계 함수는 NULL을 제외합니다(COUNT(*) 제외)
  • 빈 결과는 0이 아니라 NULL입니다
  • 0을 원하면 COALESCE로 감쌉니다
  • LEFT JOIN의 집계 결과를 주의 깊게 확인합니다

빠른 확인

Reviews의 평점이 [5, 5, NULL, 1]일 때 AVG(rating)는 무엇을 반환합니까?

자주 묻는 질문

“흔한 함정: 집계에서의 NULL” 강의는 무료인가요?

네 — “흔한 함정: 집계에서의 NULL” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“흔한 함정: 집계에서의 NULL”에서 뭘 배우나요?

AVG가 NULL을 무시하고 COUNT(열)이 NULL을 건너뛰며 NULL을 허용하는 열로 그룹화할 때 예상 밖의 결과가 생기는 고전적인 NULL 함정을 피합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“흔한 함정: 집계에서의 NULL” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. COUNT, SUM, AVG, MIN, MAX
  2. 단일 열과 여러 열을 기준으로 GROUP BY 사용
  3. HAVING과 WHERE 비교
  4. 흔한 함정: 집계에서의 NULL
← SQL Academy(으)로 돌아가기