자격증/SQLD

SQLD NULL 연산 정리, 오답률 1위 유형

공감(공부하는감자) 2026. 6. 20. 18:16

안녕하세요, 공부하는 감자입니다 🥔

기출을 채점하다 보면 유독 한 영역에서 빨간 펜이 몰립니다. NULL이에요.

매회 2~3문제씩 꾸준히 나오는데 체감 오답률은 전 영역 통틀어 제일 높습니다. 이유는 단순해요.

NULL은 직관과 반대로 움직이거든요. 엑셀에 익숙하면 빈 셀을 0으로 생각하게 되고, Java 같은 언어를 해봤으면 null == null이 true라고 기억하고 있죠.

SQL은 둘 다 아닙니다.

좋은 소식은, 규칙 다섯 개만 정확히 잡으면 이 2~3문제를 매번 가져갈 수 있다는 거예요.

규칙 5개

1. 비교는 IS NULL만 통합니다.

SELECT NULL = NULL;      -- NULL (TRUE가 아님)
SELECT NULL <> NULL;     -- NULL
SELECT NULL IS NULL;     -- TRUE
SELECT NULL IS NOT NULL; -- FALSE

WHERE col = NULL이라고 쓰면 비교 결과가 NULL이 되어 행이 전부 걸러집니다. 에러도 안 나고 그냥 빈 결과가 나와서 더 무서운 함정이에요.

2. 산술 연산에 NULL이 끼면 결과는 무조건 NULL.

SELECT 7 + NULL;   -- NULL
SELECT NULL * 3;   -- NULL
SELECT NULL - 100; -- NULL

이게 "NULL 전파"입니다. 더하든 곱하든 예외가 없어요.

3. COUNT(*)와 COUNT(컬럼)은 다릅니다.

SALES 테이블의 amt 컬럼 값이 [100, 200, NULL, 300]이라고 하면,

SELECT COUNT(*)   FROM SALES;  -- 4 (행 전체)
SELECT COUNT(amt) FROM SALES;  -- 3 (NULL 제외)
SELECT SUM(amt)   FROM SALES;  -- 600 (NULL 무시)
SELECT AVG(amt)   FROM SALES;  -- 200 (600 / 3)

AVG의 분모는 NULL을 뺀 행 수입니다. SUM ÷ COUNT(컬럼)이지, SUM ÷ COUNT(*)가 아니에요. 이 차이만 노리는 문제가 따로 있을 정도입니다.

4. NVL · COALESCE · NULLIF 삼형제.

SELECT NVL(NULL, 0);                   -- 0
SELECT COALESCE(NULL, NULL, 'x', 'y'); -- 'x' (처음 만나는 NULL 아닌 값)
SELECT NULLIF(7, 7);                   -- NULL (둘이 같으면 NULL)
SELECT NULLIF(7, 2);                   -- 7 (다르면 첫 번째)

NVL은 기본값 치환, COALESCE는 여러 후보 중 첫 생존자, NULLIF는 특정 값을 NULL로 바꾸는 용도. 셋의 방향이 다르다는 걸 기억하세요.

5. 정렬에서 NULL의 자리 (Oracle 기준).

오름차순이면 NULL이 맨 뒤, 내림차순이면 맨 앞에 옵니다. NULLS FIRST/NULLS LAST로 바꿀 수 있고요.

MySQL이나 PostgreSQL은 기본 동작이 다를 수 있다는 것 정도만 알아두면 됩니다.

시험이 NULL을 써먹는 방식

규칙을 알아도 문제 형태로 만나면 또 헷갈려요. 자주 나오는 조합을 모았습니다.

AVG 분모 함정. point 컬럼이 [40, 60, NULL, NULL, 200]일 때 AVG(point)는 (40+60+200)/3 = 100입니다. NULL을 0으로 쳐서 300/5 = 60이라고 계산하게 유도하는 보기가 꼭 같이 나와요.

산술 보정. pay가 2000이고 incentive가 NULL이면 pay + incentive는 NULL입니다. 2000을 만들려면 pay + NVL(incentive, 0)으로 보정해야 하죠. "결과가 NULL인 이유"나 "원하는 값을 만드는 방법" 둘 다 출제됩니다.

JOIN에서 NULL 키. 조인 키가 NULL인 행은 NULL = NULL이 성립하지 않으니 INNER JOIN에서 무조건 탈락합니다. 살리려면 OUTER JOIN뿐이에요.

NOT IN 폭탄. 개인적으로 제일 악랄하다고 생각하는 유형입니다.

SELECT * FROM MEMBER WHERE grade NOT IN (1, 2, NULL);  -- 0행!

목록에 NULL이 하나라도 있으면 grade != NULL 부분이 UNKNOWN이 되어 전체 결과가 비어버립니다. NOT EXISTS나 IS NOT NULL 조건으로 회피해야 해요.

시험에서 NOT IN이 보이면 NULL부터 의심하세요.

CASE WHEN에서도 동일. CASE WHEN col = NULL THEN ...은 절대 그 분기로 안 갑니다. WHEN col IS NULL이어야 해요.

덤으로 알아둘 것

  • NULL은 0도, 빈 문자열도 아닙니다. 완전히 별개의 "값 없음" 상태예요
  • UNIQUE 제약이 걸린 컬럼에도 NULL은 여러 개 들어갈 수 있습니다 (Oracle 기준). NULL끼리는 같다고 판정되지 않으니까요

푸는 요령

쿼리에 NULL이 등장하면 일단 함정이라고 가정하고 들어가는 게 안전합니다. 저는 이런 순서로 봐요.

  1. = NULL이 보이면 바로 오답 후보로 분류
  2. COUNT·AVG가 나오면 괄호 안이 *인지 컬럼명인지 확인
  3. 산술식에 NULL 가능 컬럼이 있으면 NVL 보정 여부 체크
  4. NOT IN이 보이면 서브쿼리나 목록의 NULL 포함 여부 확인

NULL 문제는 빨리 풀면 손해 보는 유형이에요. 다른 문제보다 10초씩 더 쓰더라도 천천히 확인하는 게 정답률에 남는 장사입니다.

유형이 정해져 있어서 반복 연습 효과가 크기도 한데, 저는 문어CBT 모의고사에서 틀린 NULL 문제가 자동으로 오답에 쌓이길래 그것만 몰아서 다시 풀었어요. 무료라 부담도 없었고요.

 

SQLD·정처기·컴활·ADsP 무료 CBT 모의고사

기출 변형 문제, 자동 채점, 회차별 실력 추적까지 가입 없이 바로 풀어보세요.

sqldpass.com

규칙 다섯 개, 함정 패턴 네댓 개. 이것만 손에 익으면 SQLD에서 제일 많이 틀리는 영역이 제일 확실한 점수원으로 바뀝니다.