IT 관련/Database

NULL 데이터에 대한 이해

nullzone 2017. 12. 17.
반응형

DB에서 null 값은 매우 특별한 값이다.


null 값은 과연 어떤 값일까?

공백문자일까?, 0 일까?, empty 값일까?


그냥 null data는 말 그대로 값이 존재 하지 않는다 라고 이해 해야한다.

값이 존재 하지 않는다라고 이해를 하면...

값이 존재 하지 않으니 인덱스를 생성 할수도 없다.

당연히 비교 자체가 불가 하다.


흔히들 SQL문을 작성해서 원하는 결과가 나오지 않으면(속도가 느린 것은 나중문제고) 데이터가 이상하다며, 데이터 검증을 하고 있는 모습을 간혹 보는데


아래는 흔히들 null 에 대한 실수를 하는 예이다.


아래와 같이 tableA 의 column b_id에 null 값이 섞여 있는 데이블이 있다고 하면


SELECT * FROM tableA

 a_id  A_col     b_id  
------  ------  --------
     1  a1        (NULL)
     2  a2             1
     3  a3             2
     4  a4             3
     5  a5             4
     6  a6        (NULL)


그럼 아래 쿼리의 결과는?

     
SELECT count(b_id) FROM tableA

count(b_id)  
-------------
            4

null 값은 데이터 자체가 없는 것이므로 당연히 쿼리의 결과는 null을 제외한 4가 된다.



그럼 아래 쿼리의 결과는?


SELECT DISTINCT b_id FROM tableA

b_id  
--------
  (NULL)
       1
       2
       3
       4

distinct 시에는 해당 컬럼에 데이터가 없는 값을 포함하여 5개의 결과가 리턴된다. 



그럼 아래 쿼리의 결과는?

       
SELECT count(DISTINCT b_id) FROM tableA

count(DISTINCT b_id)  
----------------------
                     4

null 값은 데이터 자체가 없는 것이므로 count 함수에서는 제외되고 4가 된다.



그럼 아래 쿼리의 결과는?


SELECT * FROM tableA WHERE b_id NOT IN ( 1, NULL )

  a_id  A_col     b_id  
------  ------  --------

리턴되는 결과는 없다.

가장 많이 하고 흔한 실수를 하는 부분이다.
 


아래처럼 3개의 row가 리턴될 것이라 생각했다면 의도 했던 쿼리는 아래와 같을 것이다.

 
SELECT * FROM tableA WHERE b_id NOT IN ( 1) AND b_id > ''
a_id  A_col     b_id  
------  ------  --------
     3  a3             2
     4  a4             3
     5  a5             4


위의 쿼리를 보고 난 저런 쿼리는 않쓰지 하며 자위 하고 있을런지 모르지만  아래 같은 쿼리는 실무에서 자주 발생한다.  당신이 사용 한 쿼리중 아래 같은 쿼리를 사용 한적은 없는지?

사용했다면 null값에 대해서 정확히 이해 하고 사용했는지? 


SELECT * FROM tableA WHERE b_id NOT IN ( SELECT b_id FROM tableC )



반응형

댓글