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 )
'IT 관련 > Database' 카테고리의 다른 글
[MySQL] CONNECT Storage Engine Oracle연동 (2) | 2017.12.26 |
---|---|
[MySQL] 요일 구하기 함수 weekday() 주의 (0) | 2017.12.25 |
[MySQL] csv 파일을 직접 테이블로 Import (0) | 2017.12.25 |
[Data 모델링] 엔티티(Entity), 애트리뷰(Attribute) (0) | 2017.12.18 |
[MySQL] last_insert_id() 사용시 주의 (8) | 2017.12.17 |
MariaDB Full outer join (0) | 2017.12.17 |
MySQL join 정리 (0) | 2017.12.17 |
[data 모델링] 모델링이란? (0) | 2017.12.17 |
댓글