sql null 값이 왜 필요할까요?

코딩/Sql 2020. 4. 27. 03:09

 db 교과서를 보니, 이런 문제가 나왔습니다. 왜 null 값이 도입되었을까? 사실 필요가 없어서, 도입되지는 않았을 겁니다. 몇 가지 상황에 대한 예를 들어보겠습니다.

 

 


 농수산물에 대한 데이터 베이스가 있다고 생각해 보겠습니다.

 

 

 테이블 하나만 고려해 보겠습니다. 각각 카데고리, 생산품의 고유 id, 생산자의 id를 의미합니다. 물론, 이것이 정보의 다는 아닙니다. 각 카데고리 id별로 어떠한 품목인지 저장하고 있는 테이블이 있을 겁니다. 그리고, product_id별로, 해당 상품의 이름을 저장하는 테이블도 있을 겁니다. 그리고, 생산자의 id와 생산자에 대한 정보를 저장하는 테이블 또한 있을 겁니다.

 

 여기에서는 그냥 간단하게 이것 하나만 고려해 보도록 하겠습니다. 농수산물 p를 생산했지만, 누가 생산했는지 알 수 없는 경우가 있을 수 있어요. 왜냐하면, p를 생산한 사람이나 단체가 없었다면, p는 나올 수도 없었기 때문입니다.

 

 

 즉, 값이 존재는 하지만 알 수 없는 경우입니다. 이 때 null 값을 넣는 것을 고려해 볼 수 있습니다. 또 다른 예를 생각해 봅시다. 서점에서 이용할 만한 데이터 베이스 중에서, 'book' table을 보겠습니다. 책에는 저자, 책 이름, ISBN, 평점과 같은 것들이 들어갑니다. 이 중에, 저자를 생각해 보겠습니다.

 

 

 더 정확하게 말하면, 저자 id를 생각해 보겠습니다. 대부분의 책들은 저자가 있습니다. 그렇지만 없는 책도 있습니다. 정말 저자가 없어서 그럴까요? 아닐 겁니다. 아니면, 다른 사람들에 의해서 구전되어 내려오는 이야기들도 있을 거에요. 저자는 있습니다. 그런데, 모르는 경우입니다. 전래동화 같은 것들입니다. 이 때에도 null 값을 넣는 것을 고려해 볼 만 합니다. 위의 두 경우 모두 값이 존재하지만 알 수 없는 경우입니다.

 

 

 


 값이 존재하지 않는 경우에도 null을 고려할 만 합니다. world 데이터 베이스를 생각해 보겠습니다.

 

 

 각 나라에는 수도가 있습니다. 예를 들어서, 한국의 수도는 서울입니다. 한 번 Code와 Capital을 조회해 보겠습니다.

 

 

 2331이 나오군요. city 테이블에서 ID가 2331인 것을 찾아보겠습니다.

 

 

 서울이 나옵니다. 대부분은 수도가 존재합니다.

 

 

 그런데, Capital이 null을 가지는 경우도 존재할까요? country 테이블에서, 코드, 이름, 수도만 뽑아와 보겠습니다.

 

 

 널 값을 가지는 나라가 존재합니다. Antarctica는 남극입니다. 국가 코드는 있는데, 수도는 없습니다. 그러면 Capital에 NULL이 들어갑니다. 0이나 -1은 값이 있는 것입니다. NULL은 0이나 -1과는 다른 어떠한 상태라고 봐도 무난합니다. NULL 값이 들어가야 하는 또 다른 예제가 없을까요? sakila에 있는 rental 데이터를 보겠습니다.

 

 

 테이블 전체에 있는 데이터를 불러와 보겠습니다.

 

 

 return_date가 NULL인 경우가 존재한다는 것을 알 수 있습니다. last_update가 된 시점인 2016년 2월 15일 21:30:53까지 반납하지 않았습니다. 그 시점에서, rental_id가 11496인 고객이 언제 반납할 지 알 수 있나요? 그 시점에서는 '반납'을 하지 않았습니다. 따라서, NULL값으로 채울 필요가 있습니다.

 

 물론 말도 안 되는 값인 2100년으로 채울 수도 있겠지만, 그 경우에는 '2100년에 반납할 예정'이라고 해석이 됩니다. '2100년에 반납할 예정' 이라는 뉘앙스와 아직 반납하지 않았다. 그래서 언제 반납할 지 모른다. 라는 뉘앙스는 다릅니다.

 

 


 값을 알고 있다와 모르고 있거나 존재하지 않는 상태는 다릅니다. 값을 모르거나 값이 없는 상태를 표현하기 위해서 NULL 값을 넣는 것을 고려해 볼만합니다. 단, NULL값은 말 그대로 UNKNOWN 값이기 때문에, 널 값인지 검사한 다음에, NULL이면 다른 값으로 치환해서 계산하기도 합니다.