DBMS를 사용하다 보면 Null값으로 인한 많은 특이사항들을 접하게 된다. Null값이 가지는 특성을 이해하지 못한다면 데이터 오류를 경험할 수 있으므로 반드시 숙지해야 할 부분중 하나이다. 다음 모델을 보고 사례별로 Null값에 대해 알아보자.
위의 주문모델을 보면 주문금액과 주문최소금액이 Null허용인 것을 알 수 있다.
Null 값을 가질 수 있는 속성은 몇가지 특성이 존재한다.
Null값은 공백이나 숫자0과는 전혀 다른 의미이다. 아직 정의되지 않은 미지의 값 또는 현재 데이터를 입력하지 못하는 경우를 의미한다. 즉 Null은 값이 존재하지 않음을 말한다.
-주문데이터-
주문번호 | 주문금액 | 주문취소금액 |
---|---|---|
1100001 | 100,000 | 20,000 |
1100002 | 15,000 |
SELECT 주문금액-주문취소금액 COL1
,NVL(주문금액-주문취소금액,0) COL2
,NVL(주문금액,0)-NVL(주문취소금액,0) COL3
FROM 주문
위의 주문데이터를 바탕으로 위의 SQL의 결과를 예측해보자.
-SQL 수행결과-
COL1 | COL2 | COL3 |
---|---|---|
80,000 | 80,000 | 80,000 |
0 | 15,000 |
수행결과를 보면 최종 주문금액이 다르게 출력되는것을 볼 수 있다.
COL1 쿼리문을 보면 Null값이 존재하지않는 첫번재 행은 정상적으로 출력되었다. 하지만 Null값이존재하는 두번째행에서 15,000-null = null 이라는 Null값을 반환하게된다. 이처럼 Null에 대한 특성을 인지하지 않는다면 COL1,COL2처럼 잘못된 결과를 반환할 수 있다는 것을 숙지해야 한다.
-주문데이터-
주문번호 | 주문금액 | 주문취소금액 |
---|---|---|
1100001 | 100,000 | |
1100002 | 15,000 | |
1100003 | 40,000 | |
1100004 | 45,000 | |
1100005 | 100,000 |
SELECT SUM(주문금액) - SUM(주문취소금액) COL1
,NVL(SUM(주문금액-주문취소금액),0) COL2
,NVL(SUM(주문금액),0) - NVL(SUM(주문취소금액),0) COL3
FROM 주문
위의 주문데이터를 바탕으로 위의 SQL의 결과를 예측해보자.
COL1,2,3은 최종주문금액 총합을 구하는 식이다.
COL1 | COL2 | COL3 |
---|---|---|
0 | 300,000 |
이 경우 SUM함수는 정의된 컬럼의 값을모두 합산하는 함수로서 Null값이 들어올 경우 이는 제외하고 처리한다. 즉 집계함수의 경우 Null값을 제외한다는 특성을 이해해야만 올바른 결과를 출력할 수 있다.
이 밖에도 Null값에 문제가 발생하는 경우는 많다. 중요한 것은 속성에 Null값이 존재한다면 이처럼 많은 사항을 고려해야 한다는 점이다. 그렇기에 모델을 생성할때 업무를 정확히 파악하여 Null허용 여부를 판단해야 한다.
출처: SQL전문가가이드