0Pricing
SQL Academy · 강의

NULL의 진정한 의미

알 수 없는 값이며 0도 아니고 빈 값도 아닙니다.

NULL의 진정한 의미은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

NULL 알아보기

NULL은 SQL에서 "알 수 없음"을 나타내는 방식입니다. 0도 아니고 빈 문자열도 아니며 false도 아닙니다 — 값이 없음을 나타냅니다.

열에 알려진 값이 없을 때마다 데이터베이스는 그 위치에 NULL을 저장합니다. NULL의 동작 방식을 배우는 것은 올바른 질의를 작성하기 위한 가장 중요한 단계 중 하나입니다.

-- A customers table where some phone numbers are unknown
SELECT id, name, phone
FROM customers;

-- id | name    | phone
-- ---+---------+------------
--  1 | Alice   | 555-0101
--  2 | Bob     | NULL        <- phone unknown
--  3 | Carol   | NULL

NULL은 0이 아닙니다

흔한 실수는 NULL을 숫자 0처럼 취급하는 것입니다. 둘은 완전히 다릅니다.

  • 0은 알려진 값인 0입니다.
  • NULL은 값이 누락되었거나 알 수 없음을 의미합니다.

계정 잔액이 0이면 고객에게 돈이 없는 것입니다. NULL이면 아직 잔액을 알 수 없다는 뜻입니다.

SELECT id, balance
FROM accounts;

-- id | balance
-- ---+--------
--  1 | 0        <- known: empty wallet
--  2 | NULL     <- unknown: not recorded yet

NULL은 빈 문자열이 아닙니다

텍스트 열에서는 NULL과 빈 문자열 ''도 서로 다릅니다.

  • ''은 길이가 0인 문자열로, 알려져 있고 실제로 존재하는 값입니다.
  • NULL은 문자열이 아예 제공되지 않았음을 의미합니다.

빈 메모를 의도적으로 저장할 수도 있고, 메모 자체를 완전히 남기지 않을 수도 있습니다. SQL은 이 둘을 구분합니다.

SELECT id, note, length(note) AS note_len
FROM tickets;

-- id | note | note_len
-- ---+------+----------
--  1 | ''   |        0   <- empty but present
--  2 | NULL |     NULL   <- absent; length is also unknown

3값 논리

일반 논리에는 true와 false라는 두 가지 결과가 있습니다. SQL에는 세 번째 결과인 알 수 없음이 추가됩니다.

NULL이 포함된 모든 비교는 unknown을 반환합니다. 가지고 있지 않은 값과 비교할 수 없기 때문입니다. 이를 3값 논리라고 합니다.

-- Each comparison with NULL returns UNKNOWN, not true/false
SELECT
  NULL = 5      AS eq,      -- unknown
  NULL <> 5     AS neq,     -- unknown
  NULL = NULL   AS self_eq, -- unknown (!)
  NULL > 0      AS gt;      -- unknown

NULL = NULL은 참이 아닙니다

가장 놀라운 규칙은 NULL = NULL이 참이 아니라는 것입니다. 결과는 unknown입니다.

왜 그럴까요? 두 값이 모두 알 수 없는 상태라면 서로 같은지 말할 수 없습니다 — 무엇이든 될 수 있기 때문입니다. 무언가가 NULL인지 확인하려면 = 대신 IS NULL을 사용해야 합니다.

-- Wrong: never returns rows, because NULL = NULL is unknown
SELECT * FROM customers WHERE phone = NULL;

-- Right: use IS NULL
SELECT * FROM customers WHERE phone IS NULL;

WHERE는 TRUE 행만 유지합니다

WHERE 절은 조건이 참일 때만 행을 유지합니다. 조건이 false 또는 unknown인 행은 제거됩니다.

따라서 =를 사용해 NULL 열을 필터링하면, 표시될 것으로 예상한 행이 조용히 제거될 수 있습니다.

-- Bob and Carol have NULL phones, so phone = '555-0101'
-- is UNKNOWN for them and they are excluded.
SELECT name
FROM customers
WHERE phone = '555-0101';

-- Returns only Alice

산술 연산에서 NULL 전파

표현식에서 NULL은 전염성이 있습니다. NULL이 포함된 거의 모든 산술 또는 문자열 연산은 NULL을 생성합니다.

입력값 중 하나를 모르면 결과도 알 수 없습니다.

SELECT
  10 + NULL    AS sum,    -- NULL
  100 * NULL   AS prod,   -- NULL
  NULL / 2     AS div,    -- NULL
  'Hi ' || NULL AS greet; -- NULL (string concat)

NULL은 어디에서 오는가

NULL은 다음과 같은 몇 가지 흔한 상황에서 나타납니다:

  • NULL을 허용하는 열을 생략한 INSERT
  • 한쪽에 일치하는 행이 없는 외부 조인
  • 행이 0개인 집계(예: 빈 집합에 대한 SUM은 NULL을 반환합니다)

NULL의 발생 원인을 알면 이를 어떻게 처리할지 결정하는 데 도움이 됩니다.

-- Omitting phone inserts NULL automatically
INSERT INTO customers (id, name) VALUES (4, 'Dan');

SELECT id, name, phone FROM customers WHERE id = 4;
-- 4 | Dan | NULL

NULL 방지: NOT NULL

열에 항상 값이 있어야 한다면 NOT NULL로 선언하십시오. 그러면 데이터베이스는 값을 비워 두려는 모든 행을 거부합니다.

이는 데이터를 깨끗하게 유지하고 나중에 NULL로 인해 발생하는 예기치 않은 문제를 피하는 강력한 방법입니다.

CREATE TABLE users (
  id    integer PRIMARY KEY,
  email text NOT NULL,   -- must always be provided
  bio   text             -- nullable: optional
);

-- This fails: email cannot be NULL
INSERT INTO users (id, bio) VALUES (1, 'hi');

NULL과 DISTINCT / GROUP BY

SQL이 NULL을 같은 것으로 취급하는 경우가 한 가지 있습니다. 바로 그룹화와 중복 제거입니다.

DISTINCT와 GROUP BY에서는 모든 NULL 값이 하나의 그룹으로 묶입니다. 다른 곳에서는 NULL = NULL이 알 수 없음이 되지만, 이 특수한 처리가 그룹화를 유용하게 만듭니다.

SELECT phone, count(*)
FROM customers
GROUP BY phone;

-- phone    | count
-- ---------+------
-- 555-0101 |     1
-- NULL     |     2   <- all NULLs grouped together

개념 정리 복습

NULL을 볼 때마다 다음 규칙을 기억하십시오:

  • NULL은 0이나 빈 값이 아니라 알 수 없음을 의미합니다.
  • NULL과 비교하면 알 수 없음이 되므로 IS NULL / IS NOT NULL을 사용하십시오.
  • WHERE는 참인 행만 유지합니다.
  • NULL을 사용한 산술 연산의 결과는 NULL입니다.
  • 그룹화에서는 NULL을 하나의 그룹으로 취급합니다.
-- The two correct NULL tests
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;

빠른 확인

표준 SQL에서 NULL = NULL이라는 표현식의 결과는 무엇입니까?

복습

이제 NULL이 실제로 무엇인지 이해했습니다. NULL은 누락되었거나 알 수 없는 값을 나타내는 표식이며, 0 및 ''과는 다릅니다.

SQL의 3값 논리, = NULL이 절대 작동하지 않는 이유, 산술 연산에서 NULL이 전파되는 방식, 그리고 WHERE가 알 수 없는 행을 제거하는 방식도 살펴보았습니다. 다음으로 IS NULL과 IS NOT NULL을 사용해 NULL을 검사하는 올바른 방법을 배웁니다.

-- Remember the golden rule
SELECT * FROM customers WHERE phone IS NULL;     -- correct
-- SELECT * FROM customers WHERE phone = NULL;   -- always empty!

자주 묻는 질문

“NULL의 진정한 의미” 강의는 무료인가요?

네 — “NULL의 진정한 의미” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“NULL의 진정한 의미”에서 뭘 배우나요?

알 수 없는 값이며 0도 아니고 빈 값도 아닙니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“NULL의 진정한 의미” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. NULL의 진정한 의미
  2. IS NULL과 IS NOT NULL
  3. COALESCE와 NULLIF
  4. 집계와 JOIN에서의 NULL
← SQL Academy(으)로 돌아가기