메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
MySQL에서 NULL은 0, 빈 문자열, 또는 거짓을 뜻하지 않습니다. 알 수 없음을 뜻합니다. 이 구분은 추적하기 어려운 버그를 일으킵니다. 쿼리가 오류 없이 실행되고 조용히 잘못된 결과를 반환하기 때문입니다.

NULL은 값이 아닙니다

NULL은 값의 부재를 나타냅니다. NULL을 무엇과 비교하든(다른 NULL과 비교하더라도) 참이나 거짓을 반환하지 않습니다. NULL을 반환합니다.
기본적으로 MySQL의 sql_mode에는 PIPES_AS_CONCAT이 포함되지 않으므로, ||는 문자열 연결이 아니라 논리 OR입니다. 'hello' || 'world'는 'helloworld'가 아니라 0으로 평가됩니다. 이는 ||가 항상 연결인 PostgreSQL 및 ANSI 표준과 다릅니다. MySQL에서 문자열 연결에는 CONCAT()을 사용하세요. 이것이 3값 논리입니다: 참, 거짓, 알 수 없음(NULL). NULL과의 모든 비교는 알 수 없음을 내고, MySQL은 WHERE 절에서 이를 거짓으로 취급합니다. 이는 필터링된 열에 NULL이 있는 행이 조용히 제외된다는 뜻입니다.
NULL 행을 포함하려면 IS NULL을 명시적으로 사용하세요:

NULL 검사하기

항상 IS NULL과 IS NOT NULL을 사용하고, = NULL이나 != NULL은 절대 사용하지 마세요:
MySQL은 두 NULL을 같다고 취급하는 <=>(NULL 안전 동등 연산자)도 제공합니다:
이것은 NULL과 NULL을 일치시키고 싶은 WHERE 절에서 유용합니다. NULL일 수 있는 두 열을 비교하는 쿼리 같은 경우입니다.

집계에서의 NULL

집계 함수(COUNT, SUM, AVG 등)는 NULL 값을 무시합니다. COUNT(*)만 예외입니다.
COUNT(*)는 3을 반환합니다. COUNT(referrer)는 2를 반환합니다. NULL 행이 제외됩니다. 이는 의도된 동작이지만, COUNT(column)이 COUNT(*)와 같을 것으로 기대하는 개발자를 놀라게 합니다.

식에서 NULL 처리하기

열이 NULL일 때 기본값으로 대체하려면 COALESCE를 사용하세요:
IFNULL(column, default)는 인수가 두 개인 경우에 동등합니다:
NULLIF(a, b)는 a = b일 때 NULL을 반환하고, 그렇지 않으면 a를 반환합니다. 0으로 나누기를 피하는 데 유용합니다:
NULL은 JOIN 동작에도 명확하지 않은 방식으로 영향을 줍니다. LEFT JOIN은 일치하는 것이 없을 때 오른쪽 열에 NULL을 반환하고, 그 NULL 열을 WHERE에서 필터링하면 조용히 INNER JOIN으로 바뀝니다. 샘플 데이터베이스로 풀어 본 ON과 WHERE의 구분은 MySQL LEFT JOIN을 참고하세요.

NULL과 인덱스

MySQL 인덱스는 NULL 값을 저장합니다. WHERE col IS NULL 쿼리는 col의 인덱스를 사용할 수 있습니다. 다만:
  • UNIQUE 인덱스에서 NULL 값은 같다고 간주되지 않습니다. 고유 열은 여러 NULL 값을 담을 수 있습니다
  • 복합 인덱스에서 어느 열 위치의 NULL이든 정상적으로 인덱싱됩니다

자주 묻는 질문

선택적 텍스트 필드에 NULL과 빈 문자열 중 무엇을 써야 하나요?

정말로 없는 데이터에는 NULL을 선호하세요. 빈 문자열('')은 “명시적으로 비어 있게 설정됨”을 뜻하며 “제공되지 않음”과 구별됩니다. 둘을 섞으면 불일치가 생깁니다. WHERE col IS NULL과 WHERE col = ''는 서로 다른 조건입니다. 하나의 관례를 골라 일관되게 적용하세요.

NOT IN은 왜 NULL과 함께 예상 밖으로 동작하나요?

NULL을 하나라도 반환하는 서브쿼리와 함께 쓴 NOT IN은 항상 빈 결과 집합을 반환합니다:
서브쿼리가 NULL을 반환할 수 있을 때는 대신 NOT EXISTS를 사용하세요:

ORDER BY는 NULL을 정렬하나요?

예. 기본적으로 MySQL은 오름차순에서 NULL 값을 먼저, 내림차순에서 마지막에 정렬합니다. MySQL은 NULLS FIRST / NULLS LAST 구문을 지원하지 않습니다(그것은 PostgreSQL입니다). NULL의 위치를 제어하려면 정렬 식을 사용하세요:
col IS NULL은 비NULL 값에 대해 0, NULL에 대해 1로 평가되므로, 이것을 오름차순으로 정렬하면 NULL이 끝으로 밀립니다.

문제 해결

함께 보기