본문 바로가기

Library/Database

NULL in SQL

NULL은 아직 정의되지 않은 값에 대해서 표현될 수 있는 값이다. 하지만, 이 때문에 산술연산과 기타 연산에서 미묘한 문제를 일으킨다. NULL과 NULL의 대소비교 결과는 무엇인가? NULL과 산술연산 결과는 어떻게 정의되어야 하는가? 간략한 논리부터 이야기하면, AND, OR, NOT 연산에서 unknown이 가장 우선순위가 높다고 할 수 있다. 즉, AND의 피연산자 중에 NULL이 의미하는 unknown이 존재하면 나머지 다른 하나의 피연산자에 상관없이 결과는 unknown이 된다.

여기서 특이한 것은 중복 문제와 NULL의 처리인데, 이것은 놀랍게도 두 NULL이 있다면 (NULL = NULL) 이것은 true이고, 중복된 행이라고 판단한다. 이것은 예외 사항이다. 두 NULL인 unknown을 비교하는 것은 unknown이 된다는 것과 다르다.

NULL 연산에서 혼동하기 쉬운 부분은, NULL = NULL은  unknown이지만, 튜플에서는 true로 간주하여 중복을 허락한다는 점이다. OR 연산에서, unknown OR true의 결과는 true, unknown OR false의 결과는 unknown이다. 산술 연산에서, NULL + unknown의 결과는 unknown이 되어야 할 것 같지만, 이것의 결과는 NULL이다. 또, COUNT에서도 NULL은 제외된다.

natural Join과 다르게 outer Join은, join 대산에 대해서 동일한 값이 존재하지 않으면, 임의의 NULL 튜플에 이 값을 대입하여 생성한다. natural joion이 양쪽 테이블에 매치되는 값이 있어야 튜플에 포함되는 것과 비교된다. (이것은 left outer join이다) 또, full outer join의 경우, 양쪽에 매치되는 값이 있다면, 양쪽에 NULL을 설정하여 테이블을 형성한다. left outer join이 한쪽에만 NULL을 설정하여 생성되는 것과 다른 성질이다.