✏️ [Database] Three-valued logic

2026. 7. 23. 00:37·Backend/Database

이 글은 Velog에서 이전한 글입니다. Velog 원문 보기

내용

  • SQL에서 null의 의미
  • null과 three-valued logic !
  • true, false 그리고 unkonown
  • where 절과 three-valued logic의 관계
  • not in 사용 시 주의 사항

⭐️ SQL에서 NULL의 의미

  • unknown
  • unavailable or withheld
  • not applicable

employee 테이블이 있다고 합시다. 테이블에는 id, name, birth_date 등의 attribute가 있다고 하겠습니다.

이때 id가 14인 직원은 생일 정보를 기입하지 않아서 birth_date가 NULL이고
id가 15인 직원 또한 생일 정보가 누락돼서 birth_data가 NULL이라고 하겠습니다.
둘 다 생일 정보가 모두 NULL이니까 두 직원의 생일이 같다고 할 수 있을까요?
아닙니다. 같을수도 있지만 다를수도 있습니다.

때문에 SQL에서는 NULL 비교를 할 때 같다, 다르다를 단정지을 수 없습니다.

생일 정보가 NULL인 직원의 id를 가져오는 쿼리문

SELECT id FROM employee WHERE birth_data = NULL;

## 결과 ##
Empty set

생일 정보가 NULL인 직원의 id를 가져오는 쿼리문을 실행했더니 결과로 Empty가 나왔습니다. 그렇다면 생일 정보가 NULl인 직원은 없다고 할 수 있을까요?
아닙니다. 이런 문제가 있기 때문에 NULL은 '=' 비교 연산자를 사용하면 안됩니다.

NULL을 비교 연산하는 방법

SELECT id FROM employee WHERE birth_date IS NULL

NULL을 비교 연산하는 경우에는 '='가 아닌 'IS'를 사용해야합니다.

⭐️ NULL과 Three-Valued Logic

위 사진은 EMPLOYEE 테이블의 사진입니다.

이때 아래의 쿼리문을 실행한다고 합시다

SELECT * FROM employee where bitrh_data = '1990-03-09;

이 쿼리문은 생년월일이 1990년 03월 09일인 직원을 모두 조회하는 쿼리입니다. 그런데 여기서 질문이 있습니다

id가 14, 15인 직원은 생일을 비교하는 단계에서 True, False 둘 중에서 어떤 결과가 나올까요?
이전에서 언급한 것처럼 생일 정보가 NULL이기 때문에 생년월일이 1990년 03월 09일 일수도 있고 아닐수도 있습니다. 때문에 여기서 새로운 개념이 나옵니다.

📌 UNKNOWN

  • SQL에서 NULL과 비교 연산을 하게 되면 그 결과는 UNKNOWN이다
  • UNKNOWN은 'TRUE 일수도 있고 FALSE일 수도 있다'라는 의미이다
  • three-valued logic: 비교/논리 연산의 결과로 TRUE, FALSE, UNKNOWN을 가진다.

UNKNOWN의 논리 연산 결과

📌 WHERE 절과 Three-valued logic의 관계

WHERE절의 condition(s)

  • where절에 있는 condition(s)의 결과가 TRUE인 tuple(s)만 선택 된다.
  • 즉, 결과가 FALSE거나 UNKNOWN이면 tuple은 선택되지 않는다.

특히나 두번째 설명이 매우 중요합니다. WHERE 절의 결과가 FASLE인 것만 선택되지 않는 것이 아니라 결과가 UNKNOWN인 tuple도 선택되지 않습니다.

이 점을 정확히 알아야 예상치 못한 동작이 발생했을 때 대처가 가능합니다.

📌 NOT IN 사용 시 주의 사항

v NOT IN (v1, v2, v3)는 아래와 같은 의미이다.

  • v != v1 AND v != v2 AND v != v3

만약 v1, v2, v3 중에 하나가 NULL이라면?


출처
글에 사용된 내용 및 사진은 모두 아래 영상의 자료입니다.
유튜브-쉬운코드
시니어 백엔드 개발자가 알려주는 데이터베이스 개론 & SQL

'Backend > Database' 카테고리의 다른 글

✏️ [Spring DB] 프로젝트 생성  (0) 2026.07.23
✏️ [Database] 테이블 조인(join)  (0) 2026.07.23
✏️ [Database] subquery (쿼리 안의 쿼리)  (0) 2026.07.23
✏️ [Database] 데이터 조회하기 (SELECT)  (0) 2026.07.23
✏️ [Database] 테이블에 데이터 추가 / 수정 / 삭제하기  (0) 2026.07.23
'Backend/Database' 카테고리의 다른 글
  • ✏️ [Spring DB] 프로젝트 생성
  • ✏️ [Database] 테이블 조인(join)
  • ✏️ [Database] subquery (쿼리 안의 쿼리)
  • ✏️ [Database] 데이터 조회하기 (SELECT)
pp8817
pp8817
공부한 내용, 개발 관련 지식, 트러블 슈팅 등을 기록합니다. 이전 블로그: https://velog.io/@pp8817/posts
  • pp8817
    끄적이는 개발 log
    pp8817
  • 전체
    오늘
    어제
    • 분류 전체보기 (273)
      • Project (71)
        • 척척학사 (29)
        • Book (23)
        • Saynow (3)
        • YAPP 27기 (4)
        • 나의 작은 프로젝트 (10)
        • Landit (2)
      • Backend (88)
        • Spring (13)
        • Spring MVC (13)
        • Spring Security (4)
        • JPA (26)
        • Database (19)
        • HTTP·Web (13)
        • Architecture (0)
      • Language·CS (59)
        • Java·Kotlin (5)
        • CS Interview (17)
        • Backend Interview (5)
        • Concepts (32)
      • Algorithm (25)
        • Algorithm (24)
        • 소마 알고리즘 스터디 (1)
      • Infra (8)
      • Troubleshooting (11)
      • Retrospective (6)
      • Etc (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    척척학사
    java
    HTTP WEB 기본 지식
    interview
    Spring MVC
    게시판
    CS Interview
    http
    Algorithm
    Project
    OS
    트러블슈팅
    Spring
    BOJ
    Book
    jpa
    나의 작은 프로젝트
    Python
    object
    개념 정리!
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
pp8817
✏️ [Database] Three-valued logic
상단으로

티스토리툴바