데이터 모델링의 이해 - NULL
Last updated
Last updated
데이터베이스 상에서 NULL은 값이 저장되지 않은 상태를 의미합니다. 오라클 데이터베이스 상에서 모든 자료형에서 사용이 가능하며, 칼럼에 저장된 값이 NULL이라고 함은, 해당 칼럼에 "값이 존재하지 않다" 혹은 "값을 알수없다"와 같은 의미로써 사용됩니다. 여기서 "값이 존재하지 않다"라고 하는 개념은 값이 ''(빈문자열)혹은 0과 같다는 의미가 아닙니다. 실제로 저장된 데이터가 아무것도 없음을 의미합니다.
즉 NULL은 값이 존재하지 않은 상태이기 때문에 정상적인 값들과 동등비교, 대소비교, 산술연산등을 수행할 수 없습니다. 대신 데이터베이스는 특별한 방식으로 NULL값들을 처리하는 방법을 정해 두었습니다.
NULL + 1 , NULL -1 , NULL * 1, NULL / 1등 NULL값과 다른값들 간의 산술연산의 결과는 항상 NULL입니다.
NULL값은 다른 값들과 비교연산을 수행할 수 없습니다. (=, !=, <> , ^= , > , <, <= , >= ). 따라서 특정 칼럼의 값이 NULL인 행을 찾기 위해선 IS NULL
, IS NOT NULL
연산자를 사용하여야 합니다.
COUNT, SUM과 같은 집계함수 사용시 NULL값은 포함되지 않습니다. 아래 예시 테이블을 구현해 두고 비교해도록 하겠습니다.
NULL
NULL
2
NULL
1
NULL
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이 반환됩니다.
NULL값과 빈 문자열('')은 분명 다릅니다. 다만, Oracle에서는 테이블에 데이터를 추가시 빈문자열('')을 추가하데 되면 빈 문자열이 아닌 NULL값이 추가됩니다. (SQL Server, MySql등 기타 dbms에서는 빈문자열이 그대로 들어감)
NULL값은 TRUE, FALSE값과 함께 논리연산에 사용될 때는 알수없음(UNKNOWN)으로 사용이 됩니다. 즉 , 참인지 거짓인지 알수 없다 라는 의미입니다.
SQL에서는 이렇게 논리연산을 할 때 참,거짓, 알수없음 3가지 값으로 논리연산을 수행하며 처리결과는 다음과 같습니다.
AND 연산자는 두 항중 1개라도 FALSE가 들어가는 경우 결과값이 항상 FALSE입니다.
즉 , NULL AND FALSE와 FALSE AND NULL 모두 결과값이 FALSE입니다.
하지만 두 항 중 한쪽이 TRUE인 경우 반대 항이 TRUE인지 아닌지 확인해야 하는 데요, 이때 TRUE AND NULL 혹은 NULL AND TRUE처럼 NULL값이 들어간 경우 TRUE인지 FALSE인지 알 수 없으므로 결과값도 알수없음(NULL)이 나오게 됩니다.
TRUE
TRUE
FALSE
NULL
FALSE
FALSE
FALSE
FALSE
NULL
NULL
FALSE
NULL
OR연산자는 두 항중 하나라도 TRUE인 경우 결과 값이 항상 TRUE인 연산자입니다. 즉 TRUE OR NULL, NULL OR TRUE등의 비교 연산을 수행 시 결과 값은 항상 TRUE입니다.
하지만 두 항중 한쪽이 FALSE인 경우 나머지 한쪽 항이 TRUE인지 아닌지 확인해 줘야하는데요, 이때 FALSE OR NULL, NULL OR FALSE와 같이 NULL값이 들어간 경우 결과 값도 알수없음(NULL)이 반환됩니다.
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
FALSE
NULL
NULL
TRUE
NULL
NULL
NULL
1
2
값1
이 NULL과 같을 경우 값2를 반환해주며, NULL이 아닐 경우 값1을 그대로 반환하는 함수입니다.
0 -> NULL에서 0으로 대체
1
2
값1이 NULL이 아닐 경우 값2를 , NULL일경우 값3을 반환해주는 함수입니다.
0 -> NULL이므로 100 반환
100
100
값1과 값2가 같으면 NULL을 반환하며, 같지 않다면 값1을 반환해주는 함수입니다.
NULL -> NULL과 1은 일치하지 않으므로 NULL반환(값1)
NULL -> 1과 1은 일치하므로 NULL반환
2 -> 2와 1은 일치하지 않으므로 2반환(값1)
값 1, 2 ,3 ... 들 중 NULL이 아닌 첫번째 요소를 반환해주는 함수
SELECT COALSECE(NULL, NULL , 1, 2, 3) FROM DUAL --> 1
SELECT COALSECE(NULL, 'AAAA', 1, 2, 3) FROM DUAL --> AAA