Categories: SQL

SQL에서 NULL 값 처리하는 방법

데이터베이스 다루다 보면, 뭔가 텅 비어있는 것 같은 NULL 값 때문에 종종 헷갈리지 않나요? 마치 퍼즐 조각 하나가 빠진 것처럼 답답할 때가 많죠. 저도 그랬어요! 이 NULL 값, 도대체 뭘까요? 그냥 0이나 빈칸이랑 같은 걸까요? 사실, NULL 값은 ‘알 수 없는 값’이라는 특별한 의미를 가지고 있어요. 그래서 일반적인 숫자나 문자처럼 다루면, 예상치 못한 결과가 나올 수도 있답니다.

이번 포스팅에서는 SQL에서 이런 골칫덩이 NULL 값을 어떻게 확인하고, 또 어떤 방법으로 처리해야 하는지 자세히 알아보려고 해요. NULL 값을 이해하고 다루는 SQL 함수들도 함께 살펴볼 거예요. 실제 데이터를 활용한 예시도 준비했으니, 같이 차근차근 따라 해 보면 NULL 값 정복, 어렵지 않아요!

 

 

NULL 값 이해하기

데이터베이스 세계에서 NULL 값은 꽤나 특별한 존재예요. 마치 베일에 싸인 미지의 영역 같달까요? 🤔 단순히 0이나 빈 문자열(“”)과는 완전히 다른 개념이라는 걸 이해하는 게 정말 중요해요! NULL은 “값이 없음” 또는 “알 수 없음”을 나타내는 특수한 표시예요. 0은 숫자 값이고, “”는 길이가 0인 문자열 값이지만 NULL은 값 자체가 존재하지 않는다는 것을 의미한답니다.

NULL 값의 의미

예를 들어, 온라인 쇼핑몰에서 고객 정보를 관리한다고 생각해 보세요. 고객 중 일부는 전화번호를 제공하지 않았을 수 있죠? 이 경우 전화번호 필드에 NULL 값을 저장하여 “전화번호 정보가 없음”을 나타낼 수 있어요. 만약 0을 입력한다면? 0이라는 전화번호가 있는 것으로 오해될 수 있겠죠?! 😅 “”(빈 문자열)을 입력하는 것도 마찬가지로, 고객이 전화번호를 입력하지 않은 건지, 아니면 실제로 빈 문자열을 입력한 건지 구분하기 어려워져요. 이처럼 NULL은 데이터의 부재를 명확하게 표현하는 데 중요한 역할을 한답니다.

데이터베이스 설계와 NULL 값

NULL 값은 데이터베이스 설계 단계부터 고려해야 할 중요한 요소예요. 각 컬럼에 NULL 값을 허용할지 여부를 결정해야 하는데, 이는 데이터의 무결성과 일관성을 유지하는 데 매우 중요해요! 만약 특정 컬럼에 NULL 값을 허용하지 않도록 설정하면, 해당 컬럼에 값이 반드시 입력되어야 하므로 데이터의 완전성을 보장할 수 있어요. 예를 들어, 주문 테이블에서 “주문 수량” 컬럼에 NULL 값을 허용하지 않는다면, 모든 주문에 대해 주문 수량이 반드시 기록되어야 하겠죠? 👍

하지만 모든 컬럼에 NULL 값을 허용하지 않는 것이 항상 좋은 것은 아니에요. 때로는 특정 정보가 없더라도 다른 정보를 저장해야 할 필요가 있을 수 있죠. 예를 들어, 고객 정보 테이블에서 “생년월일” 컬럼은 NULL 값을 허용하는 것이 좋을 수 있어요. 왜냐하면 모든 고객이 생년월일 정보를 제공하는 것은 아니기 때문이죠. 만약 생년월일 컬럼에 NULL 값을 허용하지 않는다면, 생년월일 정보가 없는 고객의 정보는 아예 저장할 수 없게 되어버려요. 😭

NULL 값과 연산

NULL 값은 연산에서도 특별하게 취급돼요. NULL 값이 포함된 연산의 결과는 대부분 NULL이 되는데, 이는 “알 수 없음”과 다른 값을 연산하면 결과 역시 “알 수 없음”이 되기 때문이에요. 예를 들어, 10 + NULL의 결과는 NULL이 되고, ‘Hello’ + NULL의 결과도 NULL이 된답니다. 마치 수수께끼 같은 NULL 값! 하지만 이러한 특징을 잘 이해하고 활용하면 데이터의 정확성과 신뢰도를 높일 수 있어요. 😉

NULL 값 정리

데이터베이스 시스템마다 NULL 값을 다루는 방식에 약간의 차이가 있을 수 있지만, 기본적인 개념은 동일해요. NULL은 값이 없거나 알 수 없음을 나타내는 특수한 표시이며, 데이터의 무결성과 일관성을 유지하는 데 중요한 역할을 한다는 것을 기억해 두세요! 😊 다음에는 NULL 값을 확인하는 방법에 대해 자세히 알아볼 거예요. 기대해 주세요~! ✨

 

NULL 값 확인하는 방법

데이터베이스에서 NULL 값은 정말 골칫거리죠? 마치 숨바꼭질하는 장난꾸러기 같아요. 눈에 보이지 않아서 찾기도 어렵고, 연산에 넣으면 예상치 못한 결과를 내놓기도 하고요. 그래서 NULL 값을 제대로 확인하는 방법, 정말 중요해요! 마치 탐정이 된 것처럼 데이터베이스 속 NULL 값을 찾아내는 방법, 지금부터 함께 알아볼까요?

IS NULL 연산자

자, 먼저 가장 기본적인 방법! 바로 IS NULL 연산자를 사용하는 거예요. 이 연산자는 특정 컬럼의 값이 NULL인지 확인해주는 아주 유용한 도구랍니다. 예를 들어, Customers 테이블에서 email 컬럼이 NULL인 행을 찾고 싶다면, SELECT * FROM Customers WHERE email IS NULL;처럼 쿼리를 작성하면 돼요. 간단하죠? 이 쿼리는 email 컬럼이 NULL인 모든 고객 정보를 쏙쏙 찾아 보여줄 거예요.

IS NOT NULL 연산자

반대로, NULL이 아닌 값을 찾고 싶다면 IS NOT NULL 연산자를 사용하면 됩니다. SELECT * FROM Customers WHERE email IS NOT NULL; 이렇게요! 이 쿼리는 email 컬럼에 값이 있는 모든 고객 정보를 보여준답니다. IS NULLIS NOT NULL, 이 두 가지 연산자만 잘 기억해도 NULL 값 확인의 절반은 성공한 거나 다름없어요!

복잡한 NULL 처리

하지만, 때로는 조금 더 복잡한 상황에 맞닥뜨리기도 하죠. 여러 컬럼 중 하나라도 NULL인 경우를 찾아야 한다거나, 특정 조건에 따라 NULL 값을 다르게 처리해야 하는 경우 말이에요. 이럴 때는 어떻게 해야 할까요? 걱정 마세요! SQL에는 다양한 함수와 연산자가 준비되어 있으니까요.

COALESCE 함수

COALESCE 함수는 NULL 값을 다른 값으로 대체해주는 아주 똑똑한 함수예요. 예를 들어, COALESCE(email, '이메일 없음') 이렇게 사용하면, email 컬럼이 NULL인 경우 ‘이메일 없음’이라는 문자열로 대체되어 나타난답니다. NULL 값 때문에 계산이 엉망이 되는 것을 막아주는 고마운 존재죠! 특히 보고서를 만들 때 NULL 값 대신 0이나 특정 문자열을 표시하고 싶을 때 아주 유용하게 사용할 수 있어요.

NULLIF 함수

NULLIF 함수는 두 값이 같은 경우 NULL을 반환하고, 다른 경우 첫 번째 값을 반환하는 함수예요. 예를 들어, NULLIF(discount, 0)처럼 사용하면, discount 값이 0인 경우 NULL로 처리되고, 0이 아닌 경우에는 원래의 discount 값이 그대로 유지된답니다. 0으로 나누는 오류를 방지하거나, 특정 값을 NULL로 처리해야 할 때 유용하게 쓸 수 있겠죠?

CASE 표현식

CASE 표현식을 사용하면 조건에 따라 NULL 값을 다르게 처리할 수도 있어요. 예를 들어, CASE WHEN email IS NULL THEN '이메일 없음' ELSE email END 와 같이 사용하면, email 컬럼이 NULL인 경우 ‘이메일 없음’으로, NULL이 아닌 경우에는 원래의 email 값으로 표시할 수 있답니다. CASE 표현식은 조건이 복잡하거나 여러 개일 때 특히 유용해요!

실제 데이터 활용 예시

자, 이제 실제 데이터를 가지고 연습해 볼까요? Orders 테이블에 shipped_date 컬럼이 있다고 가정해 봅시다. 이 컬럼은 주문이 배송된 날짜를 저장하는데, 아직 배송되지 않은 주문은 NULL 값으로 저장되어 있어요. 이때 IS NULL 연산자를 사용하면 아직 배송되지 않은 주문을 쉽게 찾을 수 있겠죠? SELECT order_id FROM Orders WHERE shipped_date IS NULL; 처럼 말이에요.

배송 완료율 계산

만약 배송 완료된 주문의 비율을 계산하고 싶다면 어떻게 해야 할까요? 전체 주문 건수에서 shipped_date가 NULL이 아닌 주문 건수의 비율을 계산하면 되겠죠? 이때 COUNT 함수와 IS NOT NULL 연산자를 함께 사용하면 된답니다. SELECT (COUNT(CASE WHEN shipped_date IS NOT NULL THEN 1 END) * 100.0 / COUNT(*)) AS shipped_rate FROM Orders; 짜잔! 이 쿼리는 배송 완료된 주문의 비율을 퍼센트로 계산해 보여준답니다.

어때요? 이제 NULL 값 확인하는 방법, 조금 감이 잡히시나요? 처음에는 어렵게 느껴질 수 있지만, 여러 가지 연산자와 함수를 활용하면 생각보다 쉽게 NULL 값을 다룰 수 있답니다. 다양한 상황에 맞춰 적절한 방법을 선택하는 것이 중요해요!

 

NULL 값 처리하는 SQL 함수

휴~! 드디어 NULL 값직접 다뤄볼 시간이에요! 앞에서 NULL 값이 뭔지, 어떻게 확인하는지 알아봤으니 이제 실전으로 들어가 볼까요? 데이터베이스 다루다 보면 NULL 값 때문에 골치 아플 때가 한두 번이 아니잖아요? ^^; 특히 복잡한 쿼리라도 써야 하는 날엔… 생각만 해도 아찔하죠. (´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥`) 하지만 걱정 마세요! SQL에는 NULL 값을 능숙하게 처리할 수 있는 강력한 함수들이 준비되어 있답니다! 이 친구들만 잘 알아두면 NULL 값도 문제없어요! 😉

자, 그럼 본격적으로 NULL 값 처리 함수의 세계로 떠나볼까요~? Go Go~! 🚀

COALESCE 함수

가장 먼저 소개할 함수는 바로 COALESCE 함수예요! 🎉 이 함수는 NULL 값을 만났을 때, 미리 정해둔 값으로 바꿔주는 아주 똑똑한 친구랍니다. 예를 들어, 회원 정보 테이블에서 휴대폰 번호가 NULL인 경우 ‘010-0000-0000’으로 표시하고 싶다고 해볼게요. 이럴 때 COALESCE(phone_number, '010-0000-0000')처럼 사용하면 NULL 값인 휴대폰 번호를 ‘010-0000-0000’으로 짠! 하고 바꿔줄 수 있어요. 참 쉽죠? 😊

COALESCE 함수는 여러 개의 값을 동시에 처리할 수도 있어요! 😮 예를 들어 COALESCE(phone_number, home_number, '정보 없음') 처럼 사용하면, phone_number가 NULL인 경우 home_number를, home_number도 NULL인 경우 ‘정보 없음’을 출력한답니다. 마치 도미노처럼 순차적으로 확인해서 NULL이 아닌 첫 번째 값을 반환하는 거죠! 정말 똑똑하지 않나요?! 🤩

IFNULL 함수

COALESCE 함수와 비슷한 기능을 하는 IFNULL 함수도 있어요. IFNULL(phone_number, '010-0000-0000') 처럼 사용하면, phone_number가 NULL인 경우 ‘010-0000-0000’을 반환해요. COALESCE와 기능은 거의 같지만, IFNULL은 두 개의 값만 비교할 수 있다는 점이 다르답니다. COALESCE는 여러 개의 값을 비교할 수 있으니 상황에 맞게 골라 쓰면 되겠죠? 😉

ISNULL 함수

다음으로 소개할 함수는 바로 ISNULL 함수예요. ISNULL 함수는 COALESCEIFNULL과는 조금 다른 역할을 해요. ISNULL은 NULL 값을 다른 값으로 바꿔주는 게 아니라, 특정 컬럼의 값이 NULL인지 아닌지를 확인하는 함수랍니다. 🤔 ISNULL(phone_number)처럼 사용하면, phone_number가 NULL이면 1(TRUE)을, NULL이 아니면 0(FALSE)을 반환해요. 이 함수는 조건문과 함께 사용하면 특히 유용해요! 예를 들어, WHERE ISNULL(phone_number) = 1 이라고 하면 휴대폰 번호가 NULL인 회원만 쏙쏙 골라낼 수 있답니다. 참 편리하죠? ㅎㅎ

NULLIF 함수

이 외에도 NULLIF 함수라는 것도 있어요! 이 함수는 두 개의 값을 비교해서 같으면 NULL을, 다르면 첫 번째 값을 반환하는 조금 특이한 친구예요. 🤔 예를 들어, NULLIF(price, 0)처럼 사용하면, price가 0인 경우 NULL을, 0이 아닌 경우 price 값을 그대로 반환한답니다. 특정 값을 NULL로 처리하고 싶을 때 유용하게 쓸 수 있어요!

NVL 함수

마지막으로 소개할 함수는 NVL 함수! 오라클 데이터베이스에서 사용되는 함수인데요, COALESCEIFNULL과 기능이 거의 동일해요. NVL(phone_number, '010-0000-0000')처럼 사용하면, phone_number가 NULL인 경우 ‘010-0000-0000’을 반환한답니다. 오라클 데이터베이스를 사용하시는 분들은 기억해두면 좋겠죠? 😉

자, 이렇게 NULL 값을 처리하는 다양한 SQL 함수들을 알아봤어요! 어때요, 이제 NULL 값 처리, 더 이상 두렵지 않죠?! 😄 이 친구들만 잘 활용하면 NULL 값 때문에 쿼리가 꼬이거나 데이터 분석에 어려움을 겪는 일은 없을 거예요! 다음에는 실제 데이터를 활용한 예시를 통해 더 자세히 알아보도록 할게요. 기대해주세요! 😉

 

실제 데이터 활용 예시

자, 이제까지 NULL 값을 다루는 여러 가지 방법들을 살펴봤어요! 그럼 이론만으론 뭔가 아쉽죠? 실제 데이터를 가지고 어떻게 활용되는지 꼼꼼하게 알아볼게요~? 복잡해 보이는 개념도 예시를 통해서 접근하면 훨씬 이해하기 쉬워진답니다! 😄

온라인 쇼핑몰 데이터베이스 예시

가령 온라인 쇼핑몰 데이터베이스를 생각해 보세요. 고객 정보 테이블에는 고객 ID, 이름, 이메일, 전화번호, 그리고 선호 배송지 정보 등이 포함될 수 있겠죠? 근데 모든 고객이 모든 정보를 다 입력하는 건 아니잖아요? 🤔 어떤 고객은 전화번호 대신 이메일로만 연락을 선호할 수도 있고, 어떤 고객은 선호 배송지를 따로 등록하지 않을 수도 있어요. 이런 경우, 전화번호나 선호 배송지 정보는 NULL 값으로 저장될 수 있겠죠~?

실제 상황 예시: 이메일 마케팅

자, 그럼 이제 실제 상황을 가정해서 쿼리를 몇 개 작성해 볼까요? 예를 들어, “전화번호가 NULL인 고객에게 이메일 마케팅을 진행하려면 어떻게 해야 할까요?” 라는 질문을 생각해 보세요. 이 경우 IS NULL 연산자를 사용해서 전화번호가 NULL인 고객을 찾아낼 수 있겠죠!

SELECT email
FROM Customers
WHERE phone_number IS NULL;

이 쿼리는 Customers 테이블에서 phone_number 열이 NULL인 모든 고객의 이메일 주소를 가져옵니다. 참 쉽죠~?! 😉

실제 상황 예시: 특별 할인 쿠폰 발송

다음으로, “선호 배송지가 등록된 고객에게만 특별 할인 쿠폰을 발송하려면 어떤 쿼리를 작성해야 할까요?” 이번에는 IS NOT NULL 연산자를 활용하면 되겠네요!

SELECT customer_id
FROM Customers
WHERE preferred_shipping_address IS NOT NULL;

이 쿼리는 Customers 테이블에서 preferred_shipping_address 열이 NULL이 아닌, 즉 선호 배송지가 등록된 고객의 ID를 가져옵니다. 이렇게 가져온 고객 ID를 활용해서 타겟 마케팅을 진행할 수 있겠죠? 👍

실제 상황 예시: 휴면 계정 플래그 설정

좀 더 복잡한 상황을 가정해 볼까요? 쇼핑몰에서 특정 기간 동안 상품을 구매하지 않은 고객에게 ‘휴면 계정’ 플래그를 설정한다고 생각해 보세요. 이때 마지막 구매일 정보가 없는 고객은 신규 가입 고객일 가능성이 높으니, 이들을 제외해야겠죠? 이런 경우 COALESCE 함수를 사용하면 아주 유용해요! 🤩

UPDATE Customers
SET is_dormant = 'Y'
WHERE COALESCE(last_purchase_date, '2023-01-01') < DATE('now', '-6 months') AND  join_date < DATE('now', '-1 month');

이 쿼리는 last_purchase_date가 NULL인 경우 ‘2023-01-01’을 기본값으로 사용해서 휴면 계정 여부를 판단합니다. 즉, 마지막 구매일이 NULL인 신규 고객은 휴면 계정으로 분류되지 않도록 처리한 거죠! 그리고 가입일이 한달이 지나지 않은 고객도 제외했어요! 꽤나 똑똑한 쿼리죠?! 😎

실제 상황 예시: 배송지 선택

자, 이제 마지막으로 “고객의 선호 배송지가 NULL인 경우 기본 배송지를 사용하고, 그렇지 않은 경우 선호 배송지를 사용하는 쿼리”를 작성해 보겠습니다. CASE 문과 COALESCE 함수를 함께 사용하면 아주 간단하게 처리할 수 있어요!

SELECT customer_id,
       CASE
           WHEN preferred_shipping_address IS NULL THEN COALESCE(default_shipping_address, '배송지 없음')
           ELSE preferred_shipping_address
       END AS shipping_address
FROM Customers;

이 쿼리는 preferred_shipping_address가 NULL인 경우 default_shipping_address를 사용하고, default_shipping_address마저 NULL인 경우 ‘배송지 없음’을 출력합니다. 반대로 preferred_shipping_address가 NULL이 아닌 경우에는 해당 값을 그대로 사용하죠. 이처럼 CASE 문과 COALESCE 함수를 조합하면 NULL 값 처리를 훨씬 유연하게 할 수 있답니다! 💯

이처럼 NULL 값은 데이터베이스에서 흔하게 발생하지만, 적절한 함수와 연산자를 사용하면 효과적으로 처리할 수 있어요. 다양한 상황에 맞춰서 활용하는 연습을 해보면 데이터 분석 능력이 쑥쑥 향상될 거예요! 😊 다음에는 더욱 흥미로운 주제로 찾아올게요! 기대해 주세요~! 😉

 

자, 이렇게 NULL 값에 대해서 같이 알아봤어요! 어때요, 이제 좀 NULL 값이랑 친해진 것 같나요? 처음엔 낯설고 어려웠던 NULL 값 처리도 이제 걱정 없겠죠? SQL 함수들을 잘 활용하면 데이터 분석도 훨씬 수월해질 거예요. 마치 든든한 지원군을 얻은 기분이랄까요? 앞으로 데이터 분석하면서 NULL 값 때문에 막히는 일이 생기면, 오늘 우리가 함께 공부했던 내용들을 떠올려보세요. 분명 큰 도움이 될 거예요. 더 궁금한 점이 있다면 언제든지 질문 남겨주세요! 함께 더 재밌게 SQL을 탐험해 봐요!

 

Itlearner

Share
Published by
Itlearner

Recent Posts

SQL에서 ORDER BY를 활용한 정렬 방법

안녕하세요, 여러분! 데이터베이스 다루다 보면 정렬 때문에 골치 아플 때가 많죠? 저도 그랬어요. 특히 SQL에서…

4시간 ago

SQL에서 WHERE 절을 활용한 데이터 필터링

안녕하세요, 여러분! 데이터베이스 다루다 보면 원하는 정보만 쏙쏙 뽑아내고 싶을 때가 정말 많죠? 마치 옷장에서…

9시간 ago

SQL에서 SELECT 문 기본 사용법

안녕하세요! 데이터베이스의 세계에 발을 들여놓은 여러분, 환영합니다! 😊 오늘 함께 SQL의 기본 중의 기본, 바로…

13시간 ago

SQL에서 주석 작성하는 방법과 활용법

데이터베이스 다루다 보면 복잡한 SQL 쿼리에 머리 아파본 적 있으시죠? 저도 그랬어요. 특히 오랜만에 코드를…

17시간 ago

SQL에서 데이터 타입 종류와 차이점

안녕하세요! 데이터베이스의 세계에 발을 들여놓은 여러분, 환영해요! 혹시 SQL을 배우다가 "데이터 타입"이라는 벽에 부딪혀 막막함을…

1일 ago

SQL에서 데이터베이스와 테이블의 개념 이해하기

안녕하세요! 데이터베이스, 뭔가 딱딱하고 어렵게 느껴지셨나요? 저도 그랬어요. 마치 미로처럼 복잡해 보였거든요. 하지만 걱정 마세요!…

1일 ago