✏️ [Database] Three-valued logic

박상민·2023년 11월 22일
0

Database

목록 보기
8/9
post-thumbnail

내용

  • 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

profile
스프링 백엔드를 공부중인 대학생입니다!

0개의 댓글