VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
NULL은 값이 아닙니다
NULL은 값의 부재를 나타냅니다. NULL을 무엇과 비교하든(다른 NULL과 비교하더라도) 참이나 거짓을 반환하지 않습니다. NULL을 반환합니다.sql_mode에는 PIPES_AS_CONCAT이 포함되지 않으므로, ||는 문자열 연결이 아니라 논리 OR입니다. 'hello' || 'world'는 'helloworld'가 아니라 0으로 평가됩니다. 이는 ||가 항상 연결인 PostgreSQL 및 ANSI 표준과 다릅니다. MySQL에서 문자열 연결에는 CONCAT()을 사용하세요.
이것이 3값 논리입니다: 참, 거짓, 알 수 없음(NULL). NULL과의 모든 비교는 알 수 없음을 내고, MySQL은 WHERE 절에서 이를 거짓으로 취급합니다. 이는 필터링된 열에 NULL이 있는 행이 조용히 제외된다는 뜻입니다.
IS NULL을 명시적으로 사용하세요:
NULL 검사하기
항상IS NULL과 IS NOT 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은 항상 빈 결과 집합을 반환합니다:
NOT EXISTS를 사용하세요:
ORDER BY는 NULL을 정렬하나요?
예. 기본적으로 MySQL은 오름차순에서 NULL 값을 먼저, 내림차순에서 마지막에 정렬합니다. MySQL은 NULLS FIRST / NULLS LAST 구문을 지원하지 않습니다(그것은 PostgreSQL입니다). NULL의 위치를 제어하려면 정렬 식을 사용하세요:
col IS NULL은 비NULL 값에 대해 0, NULL에 대해 1로 평가되므로, 이것을 오름차순으로 정렬하면 NULL이 끝으로 밀립니다.
문제 해결
함께 보기
- MySQL JOIN 성능과 흔한 실수 — 조인에서 NULL이 일으키는 잘못된 행 수 버그
- MySQL의 CHECK 제약 조건 — NOT NULL과 다른 열 규칙 강제하기
- MySQL의 진짜 불리언 — 불리언 집계가 NULL을 다루는 방식
- MySQL INNER JOIN — 내부 조인이 NULL을 보여주는 대신 행을 빼는 이유
- MySQL 연산자 — NULL과의 비교가 NULL을 반환하는 이유
- MySQL IS NULL — WHERE 절에서 빠진 값 검사하기
- MySQL LEFT JOIN — 외부 조인의 NULL이 어디서 오는지