[DB설계] 15. 특별한 값 'NULL'

표준 SQL 및 데이터베이스 입문

by AI개발자
gaebalai-sql-db (1).jpg

열(컬럼)에 넣어야 할 값이 없는 경우를 생각해 봅시다. 예로 학원에서는 입학할 때 컴퍼스를 정하죠?

컴패스마다 과목이 다르고 정원이 정해져 있습니다. 그런데 앞으로는 원격수업을 도입하거나 좀 더 유연하게 운영할 수도 있어, 캠퍼스를 정해지지 않은 학생이 생길수도 있습니다. 그런 경우처럼 불명확하거나 미정인등 여러 유이로 실제로 자주 발생하는 문제입니다.


관계형 데이터베이스에서는 이러한 '알 수 없는 값'을 NULL이라는 특별한 값 또는 상태로 표현할 수 있습니다. NULL은 '빈값'이라고도 하며, 숫자 0이나 공백과는 다릅니다. 사용할 때는 NULL로 표기하며, 'NULL'처럼 따옴표를 붙이지 않습니다. 따옴표를 붙이면 "NULL"이라는 문자열로 취급됩니다.


NULL은 '알수 없는 값'이므로 계산이나 비교에 사용할 수 없습니다. 어떤 값과도 비교할 수 없기 때문에 열의 값이 NULL인지 확인할 때는 '열명 = NULL'이 아니라 '열명 IS NULL'로 검사해야 합니다.



⑴ NULL 금지

'알 수 없음'이라는 것은 현실적으로 자주 발생하는 일이기도 하며, 편리할 수도 있지 않을까요? 그런데 무엇이 문제일까요? 데이터를 등록할 때는 어쩌면 편리할 수도 있겠지만, 데이터를 사용할 때를 생각해 봅시다. 예를 들어, UPDATE문으로 '10점 가산'을 시도할 경우 NULL에 숫자를 더할 수 있을까요?

더할 수 없습니다. 알 수 없는 값에 어떤 수를 더해도 결과는 '알 수 없음'이기 때문입니다. 문자열도 마찬가지입니다. 그렇다면 0이나 빈 문자열로 간주하면 안될까?

처리 부담을 줄이기 위해 그렇게 했던 DBMS도 있었고, 어떤 버전만의 DBMS에서는 지금도 그렇게 사용할 수도 있겠지만, 본래는 달라야 합니다. 즉, DBMS에 따라 동작이 다를 수 있다는 것입니다. 이는 정말로 혼란의 원인이 될 겁니다.


또한, NULL은 비교가 불가능합니다. NULL 데이터가 한건이라도 있으면, SELECT문이 예상치 못한 결과를 반환할 수도 있습니다. 물론 조금 더 생각하면 이해할 수 있겠지만, 어렵습니다. '알 수 없는 값'은 익숙하지 않은 개념이기 때문입니다.


그리고 이것은 중요한 문제인데, 애초에 열의 값이 결정되지 않는 데이터는 등록해도 되는지에 대한 문제도 있습니다. 알 수 없는 것을 일단 NULL로 처리하는 것이 아니라, 필요한 사항이 확실한 데이터만 등록해야 하고, 그런 테이블로 구성해야 합니다. 이런 열의 경우, NULL을 금지하는 것이 중요해 집니다. 열의 값으로 NULL을 허용할지 여부는 테이블 생성 시에 지정할 수 있습니다. 열 정의에서 'NOT NULL'을 지정하면 해당 열에 NULL입력이 금지됩니다. 아래 예제 데이터의 students 테이블정의 예제입니다. 여기에서는 mobile_phone열만 NULL을 허용하고 나머지열은 모두 NULL을 금지하고 있습니다.


sql038-4.png

또한, PRIMARY KEY가 지정된 열은 자동으로 NULL입력이 금지됩니다. PRIMARY KEY는 주키로서 데이터를 특정하는데 사용되기 때문입니다. 따라서, student_id열은 NOT NULL을 별도로 지정하지 않더라도 NULL입력이 금지됩니다.


UNIQUE 제약의 경우, NULL값은 입력이 가능하므로 중복금지와 동시에 NULL금지를 원한다면 UNIQUE와 NOT NULL을 모두 지정해야 합니다. NULL이 포함된 데이터를 다루는 SELECT문에 대해서는 나중에 다시 다루겠지만, NULL은 가끔씩 예상치 못한 결과를 초래합니다. 문제를 피하기 위해 가급적 NOT NULL을 지정하도록 합시다. 또한, NULL을 허용해야 하는 열이 있다면, 데이터베이스 설계를 다시 검토하여 왜 NULL이 필요한지 신중히 판단해야 합니다. 만약, NULL을 넣고 싶다면, 운영측면에서 문제가 발생할 수도 있다는 점도 골려해야 합니다.


대체로 운영이나 설계에 문제가 있는 경우가 많습니다. 그럼에도 불구하고, NULL은 잘 활용하면 편리하고 매우 중요한 값입니다. NULL에 관해서는 테이블 정의가 모두 완료된 후에 SELECT문을 통해 다시 다뤄봅시다.


©2024-2025 GAEBAL AI, Hand-crafted & made with Damon JW Kim.

GAEBAL AI 개발사: https://gaebalai.com

AI 강의 및 개발, 컨설팅 문의: https://talk.naver.com/ct/w5umt5


keyword
이전 14화[DB설계] 14. '열(컬럼)'의 설정