SQL에서 NULL 값은 "알 수 없는" 또는 "존재하지 않는" 값을 나타냅니다. NULL은 특별한 방식으로 동작합니다:
NULL과 어떤 값과의 비교는 = 또는 <>를 사용해도 항상 결과가 UNKNOWN이 됩니다. TRUE나 FALSE가 아닙니다.NULL의 존재 여부는 IS NULL 또는 IS NOT NULL로 확인해야 합니다.NULL과의 모든 산술 또는 논리 연산은 NULL 값을 반환합니다.예시:
SELECT * FROM users WHERE name = NULL; -- 어떤 행도 반환되지 않음 SELECT * FROM users WHERE name IS NULL; -- 올바름 SELECT 1 + NULL; -- 결과: NULL
NULL을 대체하기 위해 COALESCE(foo, 0) (첫 번째 비-NULL 값을 반환) 또는 SQL Server에서 ISNULL(foo, 'default')와 같은 함수를 사용합니다.
질문: WHERE some_column <> 'value' 조건이 some_column이 NULL인 행에서 어떤 결과를 반환하나요?
답변:
이 행에서는 조건이 충족되지 않습니다: NULL과의 비교는 UNKNOWN을 반환하기 때문에, TRUE가 아닙니다. 따라서 NULL이 있는 행은 결과에 포함되지 않습니다.
예시:
-- some_column | ... -- NULL | ... -- 'abc' | ... -- 'value' | ... SELECT * FROM table WHERE some_column <> 'value'; -- NULL이 있는 행은 포함되지 않음
역사
WHERE status <> 'closed' 조건은 status = NULL인 계좌(예: 새로운 신청)를 고려하지 않아 오류가 발생했습니다. 그 결과 활성 계좌 수가 15% 적게 계산되었습니다.역사
COALESCE(user_name, '존경하는 고객')가 배제되어 거의 천 명의 고객이 이름이 전혀 없는 메시지를 받았고, 이를 자동화 오류로 인식했습니다.역사
데이터베이스 마이그레이션 중 LEFT JOIN이 예상보다 더 많은 행을 반환했습니다. 왼쪽 테이블에 NULL을 가진 필드가 있었고, WHERE b.field = 'X'와 같은 필터가 JOIN 후 이러한 행을 제거하여 일부 데이터가 손실되었습니다.