SQLD 자격증을 공부하다 생각도 못 한 부분에서 해메여서 다시 되짚어 보고자 한다.
공부하다 헷갈렸던 부분은 다름 아닌 Null 에 대해서였다.
Null 의 뜻을 아무것도 없는 상태 또는 아무것도 없는 값으로 알고 있었다.
그러다 이게 틀린 정보라는걸 이제서야 알았다.
이번을 계기로 제대로 Null 을 박살내보자.
먼저 Null 과 0 과 ' '(공백) 은 어떤 차이가 있을까?
우선 가장 본질적으로 차이점을 본다면 0 과 ' '(공백) 은 엄연히 유효한 데이터이다.
이유는 0 은 숫자 데이터이며 ' '(공백) 은 문자 데이터이기 때문이다.
그럼 Null 은? 앞에서 말했듯 Null 은 아무것도 없는 상태인줄 알았으나
그게 아니라 정의되지 않아 알 수 없는 데이터를 뜻하는 것이었다.
이게 무슨 소리냐? 같은 말 아니냐? 할 수 있는데 아무것도 없는 값과 정의되지 않아 알 수 없는 데이터는 엄연히 다르다.
아무것도 없는 상태는 아무런 값이 들어오지 않은 상태를 뜻하며,
정의되지 않은 데이터는 말 그대로 정의되지 않은 알 수 없는 값이 들어온 상태란 뜻이다.
아직도 제대로 차이점이 눈에 안보인다면 예제 문제를 하나 들어 살펴보자.
먼저 아래와 같이 'TEST_TABLE'이라는 테이블이 있고
이 테이블은 VARCHAR2(30) 자료형을 가진 컬럼 COL1 과
NUMBER 자료형을 가졌으며 DEFAULT가 '20' 으로 설정되있는 컬럼 COL2 가 있다고 가정하자.
[ TEST_TABLE ]
컬럼1 : COL1 VARCHAR2(30)
컬럼2 : COL2 NUMBER DEFAULT 20
이러한 TABLE을 가지고 아래의 SQL 쿼리를 수행한다면?
// 1.COL1 컬럼에 'A'를, COL2 컬럼에 NULL을 집어넣는다.
INSERT INTO TEST_TABLE ( COL1, COL2 ) VALUES ( 'A', NULL) ;
// 2.COL1 컬럼에 'B'를, COL2 컬럼에 NULL을 집어넣는다.
INSERT INTO TEST_TABLE ( COL1, COL2 ) VALUES ( 'B', NULL );
// 3.COL1 컬럼에 'C'를 집어넣고, COL2 컬럼에는 아무 값도 집어넣지 않는다.
INSERT INTO TEST_TABLE ( COL1 ) VALUES ( 'C' ) ;
// 4.위에서 생성한 ROW 3개의 COL2 데이터 합을 조회한다.
SELECT SUM ( COL2 ) FROM TEST_TABLE ;
그럼 4번 쿼리를 수행한 결과는 어떻게 나올까?
기존에 필자는 컬럼의 DEFAULT 기능은 아무런 값이 들어오지 않을경우 초기값을 설정한다는 것을 알고 있었으므로
1번 쿼리, 2번 쿼리, 3번 쿼리를 수행 할 때 전부 DEFAULT에 맞춰 '20'씩 세 번 다 들어가는줄 알고 있었다.
이유는 NULL 을 집어 넣는다는건 아무런 값도 안 집어 넣는다고 알고 있었기 때문이다.
아래처럼 말이다.
여기서 COL2 컬럼의 값을 SUM 하면 당연히 '20 + 20 + 20' 이니까 '60'이 나온다 생각했었다.
하지만 SUM의 결과는 '20'.
이러한 결과가 나온 이유를 알아보도록 하자.
앞서 말했듯 DEFAULT 란 아무런 값도 들어오지 않을 경우를 위해 사용한다.
하지만 1번 쿼리와 2번 쿼리에서 NULL 을 집어 넣는데 이는 COL2 컬럼의 입장에선 DEFAULT 제약조건에 걸리지 않는 것.
이게 무슨말인가 하니 COL2 컬럼의 입장에선 아무런 값도 들어오지 않은게 아니라 정의되지 않은 알 수 없는 값이 들어온 셈이다.
그렇기에 DEFAULT 의 제약에 걸리지 않고 NULL 이 들어가게 되고,
3번 쿼리를 수행할 때 COL2 컬럼에 아무런 값이 들어가지 않았으니 DEFAULT 값인 '20'이 들어가게 되는 것이다.
즉 1번 쿼리, 2번 쿼리, 3번 쿼리를 수행하면 아래와 같은 데이터가 생성된다.
이러니 COL2 컬럼의 SUM 을 구하면 'NULL + NULL + 20' 이니 당연히 '20'이 나올 수 밖에.
이렇게 NULL 에 대한 자문자답을 마치며
NULL 은 아무것도 없는 값이 아니라 정의되지 않아 알 수 없는 값임을 명심하자.
'Coding Story > DATABASE' 카테고리의 다른 글
[ Oracle ] 오라클 INSERT, UPDATE, DELETE 문법 (0) | 2020.12.16 |
---|---|
[ Database ] SQLD DB 계층형 질의 (4) | 2020.10.29 |
[ Oracle ] 오라클 함수 (0) | 2020.10.28 |
[ Database ] 인덱스 Index (0) | 2020.10.28 |
[ Oracle ] SQL 서브쿼리 SELECT, FROM, WHERE (3) | 2020.10.28 |