데이터 모델링의 이해 - NULL

NULL?

데이터베이스 상에서 NULL은 값이 저장되지 않은 상태를 의미합니다. 오라클 데이터베이스 상에서 모든 자료형에서 사용이 가능하며, 칼럼에 저장된 값이 NULL이라고 함은, 해당 칼럼에 "값이 존재하지 않다" 혹은 "값을 알수없다"와 같은 의미로써 사용됩니다. 여기서 "값이 존재하지 않다"라고 하는 개념은 값이 ''(빈문자열)혹은 0과 같다는 의미가 아닙니다. 실제로 저장된 데이터가 아무것도 없음을 의미합니다.

즉 NULL은 값이 존재하지 않은 상태이기 때문에 정상적인 값들과 동등비교, 대소비교, 산술연산등을 수행할 수 없습니다. 대신 데이터베이스는 특별한 방식으로 NULL값들을 처리하는 방법을 정해 두었습니다.

NULL값을 처리하는 방법들

1. NULL과 산술연산

NULL + 1 , NULL -1 , NULL * 1, NULL / 1등 NULL값과 다른값들 간의 산술연산의 결과는 항상 NULL입니다.

2. NULL과 비교연산자

NULL값은 다른 값들과 비교연산을 수행할 수 없습니다. (=, !=, <> , ^= , > , <, <= , >= ). 따라서 특정 칼럼의 값이 NULL인 행을 찾기 위해선 IS NULL, IS NOT NULL 연산자를 사용하여야 합니다.

3. 집계함수와 NULL

COUNT, SUM과 같은 집계함수 사용시 NULL값은 포함되지 않습니다. 아래 예시 테이블을 구현해 두고 비교해도록 하겠습니다.

A
B

NULL

NULL

2

NULL

1

NULL

SELECT COUNT(A) A의 갯수, COUNT(B) B의 갯수 ,SUM(A) A의 합 , SUM(B) B의 합 FROM TB;

A의 갯수
B의 갯수
A의 합
B의 합

2

0

3

NULL

  • TB테이블에서 A칼럼에 NULL값이 아닌 요소는 2개이므로 2가 반환됩니다.

  • TB테이블에서 B칼럼은 모두 NULL로 이루어져 있으므로 0이 반환됩니다.(0이 기본값)

  • TB테이블에서 A칼럼의 NULL인 요소는 SUM처리에서 제외되었으므로 3이 반환됩니다.

  • TB테이블에서 B칼런은 모두 NULL이므로 SUM처리에서 제외되었으나 NULL값이 기본값이므로 NULL이 반환됩니다.

4. NULL과 빈문자열

NULL값과 빈 문자열('')은 분명 다릅니다. 다만, Oracle에서는 테이블에 데이터를 추가시 빈문자열('')을 추가하데 되면 빈 문자열이 아닌 NULL값이 추가됩니다. (SQL Server, MySql등 기타 dbms에서는 빈문자열이 그대로 들어감)

5. NULL과 논리연산

NULL값은 TRUE, FALSE값과 함께 논리연산에 사용될 때는 알수없음(UNKNOWN)으로 사용이 됩니다. 즉 , 참인지 거짓인지 알수 없다 라는 의미입니다.

SQL에서는 이렇게 논리연산을 할 때 참,거짓, 알수없음 3가지 값으로 논리연산을 수행하며 처리결과는 다음과 같습니다.

AND 연산 샘플

AND 연산자는 두 항중 1개라도 FALSE가 들어가는 경우 결과값이 항상 FALSE입니다.

즉 , NULL AND FALSE와 FALSE AND NULL 모두 결과값이 FALSE입니다.

하지만 두 항 중 한쪽이 TRUE인 경우 반대 항이 TRUE인지 아닌지 확인해야 하는 데요, 이때 TRUE AND NULL 혹은 NULL AND TRUE처럼 NULL값이 들어간 경우 TRUE인지 FALSE인지 알 수 없으므로 결과값도 알수없음(NULL)이 나오게 됩니다.

AND연산
TRUE
FALSE
NULL

TRUE

TRUE

FALSE

NULL

FALSE

FALSE

FALSE

FALSE

NULL

NULL

FALSE

NULL


OR 연산 샘플

OR연산자는 두 항중 하나라도 TRUE인 경우 결과 값이 항상 TRUE인 연산자입니다. 즉 TRUE OR NULL, NULL OR TRUE등의 비교 연산을 수행 시 결과 값은 항상 TRUE입니다.

하지만 두 항중 한쪽이 FALSE인 경우 나머지 한쪽 항이 TRUE인지 아닌지 확인해 줘야하는데요, 이때 FALSE OR NULL, NULL OR FALSE와 같이 NULL값이 들어간 경우 결과 값도 알수없음(NULL)이 반환됩니다.

AND연산
TRUE
FALSE
NULL

TRUE

TRUE

TRUE

TRUE

FALSE

TRUE

FALSE

NULL

NULL

TRUE

NULL

NULL

NULL 처리 함수들 - Null Value Logic

TB테이블 샘플

A

NULL

1

2

1. NVL(값1, 값2)

  • 값1이 NULL과 같을 경우 값2를 반환해주며, NULL이 아닐 경우 값1을 그대로 반환하는 함수입니다.

SELECT NVL(A, 0) RESULT FROM TB;

RESULT

0 -> NULL에서 0으로 대체

1

2

2. NVL2(값1 , 값2 , 값3)

  • 값1이 NULL이 아닐 경우 값2를 , NULL일경우 값3을 반환해주는 함수입니다.

SELECT NVL2(A , 100, 0) RESULT FROM TB;

RESULT

0 -> NULL이므로 100 반환

100

100

3. NULLIF(값1, 값2)

  • 값1과 값2가 같으면 NULL을 반환하며, 같지 않다면 값1을 반환해주는 함수입니다.

SELECT NULLIF(A , 1) RESULT FROM TB;

RESULT

NULL -> NULL과 1은 일치하지 않으므로 NULL반환(값1)

NULL -> 1과 1은 일치하므로 NULL반환

2 -> 2와 1은 일치하지 않으므로 2반환(값1)

4. COALESCE(값1, 값2, 값3, .....)

  • 값 1, 2 ,3 ... 들 중 NULL이 아닌 첫번째 요소를 반환해주는 함수

  • SELECT COALSECE(NULL, NULL , 1, 2, 3) FROM DUAL --> 1

  • SELECT COALSECE(NULL, 'AAAA', 1, 2, 3) FROM DUAL --> AAA

Last updated