SQL에서 NULL은 다음 세 가지 주요 의미를 가집니다:
SQL에서 NULL과의 비교 연산은 "알 수 없음"으로 처리됩니다. 두 NULL 값을 비교할 때도 같다고 단정할 수 없어 "같다"고 평가하지 않습니다.
예를 들어, 다음 쿼리를 살펴봅시다:
SELECT * FROM employee WHERE birth_date = NULL;
이 쿼리는 결과를 반환하지 않습니다. SQL에서 NULL과의 비교는 항상 "알 수 없음(UNKNOWN)"으로 처리되어 TRUE가 될 수 없기 때문입니다.
따라서 NULL을 비교할 때는 = 연산자 대신 IS NULL 연산자를 사용해야 합니다:
SELECT * FROM employee WHERE birth_date IS NULL;
NULL이 아닌 값을 찾으려면 IS NOT NULL을 사용합니다:
SELECT * FROM employee WHERE birth_date IS NOT NULL;
SQL에서 NULL과의 비교 연산은 삼중 논리(Three-Valued Logic)를 따릅니다. 이는 TRUE, FALSE 외에 "알 수 없음(UNKNOWN)"이라는 세 번째 값을 포함하는 논리 체계입니다.
이처럼 NULL과의 모든 비교 연산은 UNKNOWN으로 처리됩니다. NULL과 NULL의 비교도 UNKNOWN입니다. 이는 NULL이 단순히 "비어있음"이 아닌 "알 수 없음"을 의미하기 때문입니다.
NULL이 포함된 논리 연산의 결과를 이해하기 위해 AND, OR, NOT 연산과 NULL의 관계를 살펴보겠습니다.
이러한 논리 연산의 결과는 SQL 쿼리의 실행 결과에 큰 영향을 미칩니다. 특히 WHERE 절에서 이런 논리 연산을 사용할 때 예상치 못한 결과가 나올 수 있습니다.
WHERE 절에서는 조건이 TRUE인 튜플만 선택됩니다. 조건의 결과가 FALSE나 UNKNOWN이면 해당 튜플은 선택되지 않아 예상치 못한 결과가 발생할 수 있습니다.
다음 쿼리를 예로 들어보겠습니다:
SELECT * FROM employee WHERE department_id IS NOT IN (SELECT department_id FROM employee WHERE birth_date > '2000-01-01');
이 쿼리는 2000년 이후 출생 직원이 속하지 않은 부서의 직원들을 찾습니다. 그러나 서브쿼리 결과에 NULL이 포함되면 예상과 다른 결과가 나올 수 있습니다. NULL과의 비교 연산이 항상 UNKNOWN을 반환하기 때문입니다.
이 문제를 해결하려면 서브쿼리에서 NULL을 처리하거나, NULL이 발생하지 않도록 제약조건을 설정하는 등의 방법을 사용할 수 있습니다.
SQL에서 NULL을 다루는 것은 겉보기에는 단순해 보일 수 있지만, 실제로는 매우 복잡하고 심도 있는 논리가 내재되어 있습니다. NULL은 단순히 '비어있음'을 나타내는 것이 아니라, '알 수 없음', '미적용', '미공개' 등 다양한 의미를 내포하고 있어 그 처리에 주의가 필요합니다. 특히 NULL과의 비교 연산이나 논리 연산에서는 예상치 못한 결과가 발생할 수 있어 주의가 필요합니다. NULL의 의미와 처리 방법을 정확히 이해하고 적절하게 활용하면, 더욱 정확하고 효율적인 SQL 쿼리를 작성할 수 있으며, 데이터베이스 설계와 관리에 있어서도 더 나은 결정을 내릴 수 있습니다. 따라서 SQL을 다루는 개발자나 데이터베이스 관리자에게 NULL에 대한 깊이 있는 이해는 필수적이라고 할 수 있습니다.
https://www.youtube.com/watch?v=aL0XXc1yGPs&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe