
DB를 다루다보면 NULL 값으로 인해 예상치 못한 경우가 발생하는 경우가 많습니다. NULL 값의 특성을 이해하지 못하면 데이터 연산 오류를 경험할 수 있으므로 반드시 NULL 값의 특성에 대해 이해하고 있어야 합니다.
NULL이 포함된 연산의 결과는 항상 NULL 입니다.
NULL은 공백이나 숫자 0 과는 다른 의미입니다. 일반적으로 DB에서 NULL은 '아직 정의되지 않은 미지의 값' 혹은 '현재 데이터를 입력하지 못한 상태'를 의미합니다. 주문 테이블의 주문번호와 주문금액은 NOTNULL 컬럼이고 주문취소금액은 NULL을 허용하는 컬럼일 때 다음의 쿼리 결과를 예상해봅시다.
SELECT
주문금액 - 주문취소금액 as COL1
, NVL(주문금액 - 주문취소금액, 0) as COL2
, NVL(주문금액,0) - NVL(주문취소금액,0) as COL3
FROM 주문
주문 취소금액이 NULL 이 아닌 레코드에 대한 쿼리 결과값은 모두 동일합니다. 하지만 주문취소금액이 NULL인 레코드의 결과는 동일하지 않습니다. 이유는 NULL 값의 연산 결과는 언제나 NULL 이기 때문입니다. NULL 값으로 가능한 연산은 IS NULL 또는 IS NOT NULL 연산밖에 없습니다.
-- null 값을 전혀 고려하지 않고, 주문금액에서 주문취소금액을 제외한 방식입니다. null이 존재하는 행의 결과는 Null 값을 반환합니다.
주문금액 - 주문취소금액
-- 주문금액에서 주문취소금액을 제외한 결과에 대해 NVL 처리합니다. null이 존재하는 행의 결과는 NVL(Null,0) 으로 0을 반환합니다.
NVL(주문금액-주문취소금액 , 0)
-- 속성별로 NVL 처리하고, 이후 주문금액에서 주문취소금액을 제외합니다. null이 존재하는 행의 계산결과는 NVL(주문금액, 0) - NVL(null, 0)로 --- 주문금액을 반환합니다.
NVL(주문금액,0) - NVL(주문취소금액,0)
집계함수는 NULL 값을 제외하고 집계합니다.
주문 테이블의 주문취소금액이 전부 null이라면 아직 취소된 주문이 없는 상태입니다. 이 데이터를 바탕으로 다음 최종주문금액의 총합을 산출하는 쿼리의 결과를 예측할 수 있습니다.
SELECT SUM(주문금액) - SUM(주문취소금액) as COL1 -- NULL
, NVL(SUM(주문금액 - 주문취소금액), 0) as COL2 -- 0
, NVL(SUM(주문금액),0) - NVL(SUM(주문취소금액), 0) as COL3 -- SUM(주문금액)
FROM 주문
COL1의 경우, 주문취소금액을 합산한 결과가 NULL 이므로 총주문금액에서 뺀 결과 또한 NULL입니다.
COL2의 경우, 각 행의 연산결과가 NULL 이므로 연산결과를 합산한 결과 또한 NULL 입니다. NVL(NULL, 0) 의 결과는 0입니다.
COL3의 경우, NVL(SUM(주문금액),0) 의 결과는 주문금액의 합계이고 NVL(SUM(주문취소금액), 0) 결과는 0 이므로 주문금액의 합계입니다.
주문취소금액의 평균을 구하는 SQL의 결과를 예측해 볼 수 있습니다.
SELECT
SUM(NVL(주문취소금액, 0)) / COUNT(*) as COL1
,AVG(NVL(주문취소금액, 0)) AS COL2
FROM 주문
COL1은 평균의 모수를 전체주문으로할 경우에 해당합니다. COUNT 함수는 속성이 null인 행을 제외하지 않습니다.
'DB > 데이터모델링' 카테고리의 다른 글
| 실전문제 - 데이터모델의 이해(데이터 모델의 이해, 엔터티, 속성, 관계, 식별자) (1) | 2024.06.10 |
|---|---|
| 데이터모델링이론 - 식별자의 구분 본질식별자와 인조식별자 (0) | 2024.01.30 |
| 데이터모델링이론 - 엔터티의 논리적 연결 관계를 표현하는 조인 (0) | 2024.01.16 |
| 데이터모델링이론 - 데이터 모델링시 정규화가 필요한 이유 (제1정규화, 제2정규화, 제3정규화, 반정규화) (0) | 2024.01.15 |
| 데이터모델링이론 - 인스턴스를 식별하는 식별자와 식별자관계 (1) | 2024.01.11 |