본문 바로가기

DB 공부

SQL에서 NULL과의 연산

반응형

SQL에서 일반적인 속성값들 외에도 null value라는 좀 특별한 값이 있다.

어떤 튜플의 어떤 속성 값이 null이라는 것은 해당 속성에 대해서 어떤 값도 갖고 있지 않는 것이라고 이해하면 좋다고 한다.

물론 진짜로 아무 값이 없는 게 아니라 null을 나타내는 어떤 것을 저장하고 있을 것이다. sqlite에서는 아예 storage type 중의 하나로 null이라는 것이 존재하여 관리하는 듯하다.

어쨌든 이것도 값의 하나인데 값들끼리는 산술 연산(Arithmetic operation)도 비교 연산(Comparison)도 가능할텐데 null과 이러한 연산을하면 어떤 결과를 가질지 SQL에서는 정의하고 있는 듯 하다.

산술 연산

기본적으로 null과 산술 연산을 한 결과는 null로 정의된다. $+, -, \div, \times, %$와 같은 연산들이 산술 연산이다.

sqlite에서는 storage class로 int, text, real, blob, null을 가지고 있고, 어떤 value가 evaluate된 결과에 대해서 typeof를 출력해보면 이 중에서 나오게 된다.

아래는 각 산술 연산을 null과 수행한 결과이다.

산술연산 외에도 간단한 문자열 관련 함수 결과도 null이 나온다.

비교 연산

비교 연산도 null과 수행이 가능하다. 1 > null 이나 not (1 <> null) 처럼 사용할 수가 있다는 뜻이다.

null과의 비교라는게 사실 말이 안되기 때문에 null과의 비교 연산 결과 또한 null과 같이 취급한다. 그런데 이런 결과를 좀 특별하게 unknown이라고도 부르는 듯하다. 별로 특별히 부르고 싶다고 생각하지 않다면 boolean 타입의 null 값이라고 생각해도 될 거 같다. sqlite에서는 boolean이 명시적으로 존재하지 않는다.

어쨌든 이 책의 3장에서는 unknown과 True, False 사이의 Boolean operation and, or, not을 정의하고 있다.

unknown을 $u$라고 쓰겠다.

  • $u \; and \; T \Rightarrow u$
  • $u \; and \; F \Rightarrow F$
  • $u \; or \; T \Rightarrow T$
  • $u \; or \; F \Rightarrow u$
  • $u \; and \; u \Rightarrow u$
  • $u \; or \; u \Rightarrow u$
  • $not \; u \Rightarrow u$

위와 같이 무조건 F인게 확실한 경우(and F), 무조건 T인게 확실한 경우(or T) 같은거 빼곤 전부 unknown, 그러니까 null이다.

하나 눈 여겨 볼 것은 false and unknown이나 true or unknown 같은 것은 결과가 null이 아니기 때문에 integer로 잘 나온다는 점이다.

그리고 where 구문에서 predicate의 결과가 null로 나올 경우 해당 튜플은 선택되지 않는다. 그리고 null = null 도 null로 나온다. 그래서 null인지 확인하는 것은 is null 혹은 is not null로 수행해야 원하는 결과를 얻을 수 있다.

아래는 여러 SQL 엔진?이 null과 관련된 몇가지 케이스를 어떻게 처리하는지에 대한 것을 정리한 테이블이다.

반응형