sql null 값 : 어느 값인지 모른다.

코딩/Sql 2019. 7. 13. 19:45

 SQL에서 널값, null은 무엇을 의미할까요? 알 수 없는 값을 의미합니다. 그렇기 때문에, 널 값 처리는 조심을 해야 하는데요. 몇 가지 쿼리의 결과가 어떻게 나오는지 보도록 합시다. MYSQL 5.7로 실행을 하였습니다.

 

 


 먼저, null과 null은 다를까요? 알 수 없는 값과, 알 수 없는 값이 다른지 판단을 할 수 없어요.

 

 

 그렇기 때문에, NULL이 떴어요. 반대로, null과 null이 같다고 할 수 있을까요?

 

 

 그러면 이 쿼리의 출력 값은 어떻게 될까요? 제 환경에서는 NULL이 출력됩니다. 알 수 없는 값과 알 수 없는 값을 비교하면 같을 수도 있고, 다를 수도 있기 때문입니다. 상태가 정의되지 않습니다. 

 

 

 제 mysql에서는 null이 출력됩니다. 실제로, 널인지 아닌지는 is null, is not null 등으로 비교합니다. 전자는 NULL값이라면 참이 되고, 후자는 NULL이라면 false가 출력될 겁니다.

 

 

 그러면 널 값은 0일까요? 알 수 없는 값과 0을 비교하면 참일 수도 있고 아닐 수도 있어요. 따라서 unknown입니다.

 

 

 당연하게도 이 값 또한 unknown입니다. 빈 문자열하고 비교하면 어떨까요? 보통 빈 문자열은, 길이가 0인 string으로 정의가 됩니다. 그러한 문자열은 "" 밖에 없습니다.

 

 

 SQL에서는 ''을 쓰면 빈 문자열이라는 것입니다. 이것과 비교를 하면 어떨까요? 마찬가지로 왼쪽에 있는 값이 빈 문자열인지, 그렇지 않은지를 모릅니다. 'cho'일 수도 있고, 'gahui'일 수도 있기 때문에, 거짓일 수도 있어요. 하지만, ''일 수도 있어요. 그러니까 참일 수도 있어요.

 

 

 그렇기 때문에 unknown입니다. ''과 같은지 compare 하는 것도 마찬가지입니다.

 

 

 값이 정의되지 않습니다. SQL의 내부 함수들 중에, 문자열의 길이를 구하는 length 함수가 있습니다.

 

 

 이 값은 어떻게 나올까요? length('')은 0입니다. 빈 문자열의 길이는 0이기 때문입니다. 하지만, null을 넘겨주면 그 값을 알 수 없어요. 어떤 값인지 모르기 때문입니다.

 

 

 역시 알 수 없는 값이 나옵니다.

 

 


 조건 여러 개가 and나 or로 연결된 경우도 있습니다. 그렇다면 어떻게 평가될까요? 논리적으로 따져주시면 됩니다. 예를 들어서, 아래 쿼리를 생각해 봅시다.

 

 

 A or B네요. A는 알 수 없습니다. 참인지 거짓인지. 그렇지만 B는 2<3이라는 조건인데요. 이 값은 참입니다. 참이거나 참이라면 참이고, 참이거나 거짓이라도 참입니다. 즉 A or B에서 어느 한 쪽이 참이면, 다른 한 쪽이 참이던 거짓이던 아무 상관없이 참이기 때문에, 참이 리턴됩니다.

 

 

 1이 나오네요. 그러면, 아래 쿼리는 어떨까요? null이 3이 아니고 2와 3이 같은지. 사실 A는 알 수 없습니다. 알 수 없는 값과 3을 비교했기 때문입니다. 하지만 뒤에 걸린 조건절 2=3이 거짓입니다.

 

 

 A and B에서 B가 거짓입니다. A가 참이고 B가 거짓이면 거짓이고, A가 거짓이고 B가 거짓이면 거짓입니다. B가 거짓이기 때문에 앞에 조건이 참이던 거짓이던, 무조건 거짓이 되어 버립니다.

 

 

 0이 나오네요. 조건절이 여러개 걸려 있을 때, unknown이 있다면 그 절에 0 (false)을 넣어보고 1 (true)을 넣어봅니다. 그랬을 때 결과 값이 여러 개가 나온다면 unknown입니다. 예를 들어서 unknown or unknown을 생각해 보면, 앞에 조건절도 T or F가 나올 수 있고, 뒤에 조건절 또한 T or F가 나올 수 있어요.

 

 두 조건절 모두 거짓이면 F가 나오고, 그렇지 않으면 T가 나오기 때문에 unknown or unknown은 알 수 없다입니다. 정리하면, 알 수 없는 값이 NULL 값이다. 라고 생각하시면 좋을 듯 싶네요.