SQL DEFAULT, NOT NULL

주성현·2022년 11월 22일
0

SQL

목록 보기
3/4

사용이유

테이블 생성 후 행(ROW,레코드)을 추가하면 값이 없는 열(COLUMN) 에는 (NULL)로 표시됩니다.

NULL은 0이나 비어있는 문자열 "" 하고는 구분되며 말 그대로 값이 없다는 걸 의미합니다.

테이블을 생성할 때 비워두면 안되는 곳은 반드시 값을 입력하라고 지시하기 위해서 NOT NULL이 라고 표시합니다.

NOT NULL 과 ""(공백)의 차이

우선 가장 본질적으로 차이점을 본다면 0 과 ' '(공백) 은 엄연히 유효한 데이터이다.
이유는 0 은 숫자 데이터이며 ' '(공백) 은 문자 데이터이기 때문이다.

그럼 Null 은? 앞에서 말했듯 Null 은 아무것도 없는 상태인줄 알았으나
그게 아니라 정의되지 않아 알 수 없는 데이터를 뜻하는 것이었다.

이게 무슨 소리냐? 같은 말 아니냐? 할 수 있는데 아무것도 없는 값과 정의되지 않아 알 수 없는 데이터는 엄연히 다르다.

아무것도 없는 상태는 아무런 값이 들어오지 않은 상태를 뜻하며,
정의되지 않은 데이터는 말 그대로 정의되지 않은 알 수 없는 값이 들어온 상태란 뜻이다.

예제

'TEST_TABLE'이라는 테이블안에
VARCHAR2(30) 자료형을 가지 칼럼 COL1과
NUMBER 자료형을 가졌으며 DEFAULT가 '30'으로 설정되어있는 컬럼 COL2 가 있다고 가정하자.

[TEST_TABLE]
칼럼1: COL1 VARCHAR2(30)
칼럼2: COL2 NUMBER DEFAULT 30

이러한 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에 맞춰 '30'씩 세 번 다 들어가는중 알고 있었다.
이유는 NULL 을 집어 넣는다는건 아무런 값도 안 집어 넣는다고 알고 있었기 때문이다.

NOCOL1COL2
1A30
2B30
3C30

여기서 COL2 칼럼의 값을 SUM 하면 당연히 30+30+30이니까 90이 나온다고 생각했지만
결과는

NOCOL1COL2
1ANULL
2BNULL
3C30

30 이였다
이러한 결과가 나온 이유는

앞서 말했듯 DFAULT 란 아무런 값도 들어오지 않을 경우를 위해 사용한다.
하지만 1번 쿼리와 2번 쿼리에서 NULL을 집어 넣는데 이는 COL2 컬럼의 입장에서 DEFAULT 제약조건에 걸리지 않는 것 이게 무슨 말이냐면 COL2 컬럼의 입장에서 아무런 값도 들어오지 않은게 아니라 정의되지 않은 알 수 없는 값이 들어온 셈이다.
그렇기에 DEFAULT 의 제약에 걸리지 않고 NULL이 들어가게 되고,
3번 쿼리를 수행할 때 COL2 컬럼에 아무런 값이 들어가지 않았으니 DEFAULT 값인 30 이 들어가게 되는 것이다.

정리

NULL은 아무것도 없는 값이 아니라 정의되지 않아 알 수 없는 값임을 명심하자.

profile
하이

0개의 댓글

관련 채용 정보