오늘은 NULL — 데이터베이스의 보이지 않는 히어로 — 를 더 파헤쳐볼 거야. 아직도 NULL이 그냥 "아무것도 없음"이라고 생각한다면, 맞긴 한데 그게 다는 아니야. 이번 강의에서는 데이터에 NULL이 있는지 체크하는 방법이랑 그걸로 뭘 할 수 있는지 배워볼 거야. 자, 값이 없는 걸 추적할 준비됐지?
일단 간단하게 시작해보자 — 네가 인터넷 쇼핑몰 데이터베이스를 다룬다고 상상해봐. 주문 테이블이 있는데, 어떤 주문은 코멘트 정보가 없고, 어떤 주문은 비고가 적혀있어. 만약 비어있는 비고가 있는 주문을 찾으려고 그냥 =, <> 같은 비교 연산자를 쓰면... 놀랄 거야. 왜냐면 NULL은 특별한 케이스거든!
SQL에서 NULL이 있는지 없는지 체크할 때는 IS NULL 이랑 IS NOT NULL 연산자를 써야 해. 이 연산자들이 NULL을 다루고 원하는 데이터를 뽑아내는 데 도움을 줘.
IS NULL로 값 체크하기
IS NULL은 컬럼이나 표현식이 NULL 값을 가지고 있는지 확인할 때 써.
SELECT *
FROM orders
WHERE comment IS NULL;
이 쿼리는 comment 컬럼 값이 NULL인 모든 행을 반환해. 비고가 없는 주문을 찾고 싶을 때 딱이야.
여기 orders 테이블 예시가 있어:
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "급한 배송" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
쿼리:
SELECT id, customer_name
FROM orders
WHERE comment IS NULL;
결과:
| id | customer_name |
|---|---|
| 2 | Maria Chi |
| 4 | Anna Song |
빈 문자열 ''이 있는 행은 포함되지 않는 거 봤지? ''은 NULL이 아니거든.
IS NOT NULL로 값 체크하기
IS NOT NULL은 반대로, 값이 NULL이 아닌지 확인해. 예를 들어, 코멘트가 적혀있는 주문만 보고 싶으면 이렇게 해:
SELECT *
FROM orders
WHERE comment IS NOT NULL;
이 쿼리는 comment 컬럼에 값이 있는(빈 문자열 ''도 포함) 행만 반환해.
예시
orders 테이블은 그대로야.
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "급한 배송" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
쿼리 실행:
SELECT id, customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
결과:
| id | customer_name | comment |
|---|---|---|
| 1 | Otto Art | "급한 배송" |
| 3 | Alex Lin | '' |
빈 문자열 ''이 포함된 행도 결과에 들어가. SQL에서는 이걸 "비어있지 않다"고 봐.
IS NULL과 IS NOT NULL 언제 써야 할까?
이런 상황에서 쓸 수 있어:
- 데이터 필터링: 값이 없는 불완전한 레코드를 빼고 싶을 때.
- 에러 처리: 가끔
NULL이 데이터 입력 실수일 수도 있으니, 그런 행만 따로 뽑고 싶을 때. - 데이터 분석: 누락된 값이 몇 개인지 세서 데이터 품질을 파악할 때.
실전 예제
실제로 몇 가지 문제를 풀어보자:
문제 1: 생년월일이 없는 학생 찾기
예를 들어, students 테이블이 있다고 해보자:
| id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-05-10 |
| 2 | Maria Chi | NULL |
| 3 | Alex Lin | 1998-12-30 |
| 4 | Anna Song | NULL |
쿼리:
SELECT name
FROM students
WHERE birth_date IS NULL;
결과:
| name |
|---|
| Maria Chi |
| Anna Song |
이 쿼리는 생년월일을 확인해야 하는 학생을 찾을 때 유용해.
문제 2: 코멘트가 있는 주문 찾기
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "급한 배송" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
orders 테이블에서 코멘트가 있는 주문을 찾으려면:
SELECT customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
결과:
| customer_name | comment |
|---|---|
| Otto Art | "급한 배송" |
| Alex Lin | '' |
일반 연산자와 비교
이제 한 번 "잘못된" 쿼리로 NULL 체크를 해보자:
SELECT *
FROM orders
WHERE comment = NULL;
놀랐지? 이 쿼리는 comment가 NULL인 행이 있어도 아무것도 반환하지 않아. 왜냐면 NULL은 일반 연산자로 비교할 수 없거든. 이런 비교에는 꼭 IS NULL을 써야 해.
GO TO FULL VERSION