MySQL에서 데이터를 조회할 때 자주 마주치는 상황이 있습니다. 바로 NULL 값이 들어 있는 컬럼을 필터링하거나 NULL이 아닌 데이터만 추출해야 할 때입니다. 이럴 때 사용하는 문법이 바로 IS NULL, IS NOT NULL입니다.
IS NULL과 IS NOT NULL은 SQL 쿼리 최적화, 데이터 무결성 검사, 누락 데이터 탐색 등의 실전 상황에서 꼭 필요한 문법입니다.

✅ NULL이란 무엇인가?
SQL에서 NULL은 값이 없음(nothing)을 의미합니다. 이는 0이나 빈 문자열과는 완전히 다른 개념으로, "알 수 없음" 또는 "정의되지 않음"을 나타냅니다.
SELECT * FROM users WHERE email IS NULL;
이 쿼리는 email 컬럼이 값이 없는(정의되지 않은) 모든 사용자를 조회합니다.
🔎 참고로 알아두세요
- NULL = NULL은 FALSE입니다.
- IS NULL만이 NULL을 정확히 비교하는 방법입니다.
- = NULL, <> NULL 은 항상 FALSE 또는 UNKNOWN으로 처리됩니다.
✅ IS NULL 조건절
IS NULL은 특정 컬럼이 NULL인 레코드만 필터링합니다.
SELECT user_id, name
FROM users
WHERE phone_number IS NULL;
🔍 활용 예시: 회원가입은 완료했지만 아직 연락처 정보를 입력하지 않은 사용자 조회
✅ IS NOT NULL 조건절
반대로 IS NOT NULL은 컬럼에 실제 값이 존재하는 행만 조회합니다.
SELECT user_id, name
FROM users
WHERE birth_date IS NOT NULL;
🔍 활용 예시: 생년월일 정보가 있는 사용자만을 대상으로 생일 프로모션 메시지를 발송할 때
✅ NULL은 비교 연산자가 통하지 않는다!
아래 쿼리를 보세요.
SELECT * FROM users WHERE email = NULL; -- ❌ 작동 안 함
이 쿼리는 결과가 없습니다. 왜냐하면 NULL은 어떤 값과도 같다고 판단하지 않기 때문입니다. 오직 IS NULL을 사용해야 정확한 비교가 가능합니다.
✅ 다양한 예제와 활용법
1. 주문이 등록되지 않은 고객 조회
SELECT customer_id, name
FROM customers
WHERE last_order_date IS NULL;
이 쿼리는 한 번도 주문을 하지 않은 고객을 찾을 때 유용합니다. 마케팅 타겟팅이나 리텐션 분석에서 많이 사용됩니다.
2. NULL과 NOT NULL 조건을 조합한 쿼리
SELECT *
FROM employees
WHERE manager_id IS NOT NULL
AND termination_date IS NULL;
🔍 해석: 퇴사하지 않고, 상사가 배정된 직원 목록을 조회합니다.
3. IFNULL 함수와 함께 사용
SELECT name, IFNULL(phone_number, '미입력') AS 연락처
FROM users;
이 쿼리는 phone_number가 NULL인 경우 "미입력"으로 대체하여 출력합니다. UI 단에서 친절한 표시를 원할 때 유용합니다.
✅ 성능 팁과 주의사항
- IS NULL 조건을 자주 사용하는 컬럼이라면 해당 컬럼에 인덱스를 설정해도 효율이 떨어질 수 있습니다.
- NOT NULL 제약조건은 테이블 설계 시 데이터 무결성에 매우 유용합니다.
- JOIN 문에서 NULL 처리를 할 때는 LEFT JOIN 결과의 NULL 여부를 잘 활용해야 합니다.
✅ JOIN과 IS NULL을 활용한 실전 예제
SELECT u.name
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;
🔍 해석: 주문 이력이 없는 사용자 목록 조회
이처럼 LEFT JOIN 후 IS NULL 조건을 사용하면 데이터 누락 확인이나 비활성 사용자 추적이 가능합니다.
✅ 공식문서로 더 공부하기
- MySQL NULL 공식 문서: https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html
- Comparison Functions and Operators: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html
'DB' 카테고리의 다른 글
| [MySQL] LOCK IN SHARE MODE 완전 정복 – 공유잠금, 읽기전용 (0) | 2025.06.30 |
|---|---|
| [MySQL] SELECT FOR UPDATE 완벽 가이드 – 동시성 제어의 핵심 키워드 (0) | 2025.06.30 |
| [MySQL] JSON 컬럼 SELECT 조회 완벽 가이드 (0) | 2025.06.26 |
| [MySQL] LIKE와 REGEXP 차이부터 고급 패턴 검색까지 완벽 정리 (0) | 2025.06.26 |
| [MySQL] SELECT 문에서 EXISTS와 IN 조건절 (1) | 2025.06.26 |
| [MySQL] SELECT + 서브쿼리 활용법 (쿼리 안에 쿼리) (0) | 2025.06.26 |
| [MySQL] SELECT JOIN 완벽 정리 – INNER JOIN, LEFT JOIN, RIGHT JOIN 차이와 실전 예제 (0) | 2025.06.25 |
| [MySQL] SELECT + DATE_FORMAT / NOW() 함수 완벽 정리(날짜포맷, 현재시간) (0) | 2025.06.25 |