데이터베이스(쉬운코드)

7. SQL로 데이터 조회하기 3부 : three-valued logic

youbing 2024. 12. 3. 20:15
본 내용은 유튜버 쉬운코드의 강의 "데이터베이스"를 참고하여 작성하였습니다.

 

NULL의 의미

SQL에서 NULL의 의미

  • unknown
  • unavailable or withheld : 이용 불가
  • not applicable : 해당사항 없는

NULL을 찾는 비교 연산자는?

  • employee 테이블에서 id가 14, 15인 사람의 birth_date가 NULL이라고 해서 둘의 birth_date가 같은 것은 아님.

 

잘못된 방법 / 옳은 방법

  • birth_date가 NULL인 사람들을 찾으려고 birth_date = NULL로 조건식을 세우면 찾아지지 않음. -> birth_date IS NULL로 찾아야 함.

NULL과 SQL three-valued logic

  • SELECT * FROM employee WHERE birth_date = '1990-03-09'; 로 데이터를 찾게 되면 birth_date가 NULL이 뜨는 경우에는 결과를 UNKNOWN으로 나옴.
  • SQL에서 NULL과 비교 연산을 하게 되면 그 결과는 UNKNOWN이다.
  • UNKNOWN은 'TRUE일 수도 있고 FALSE일 수도 있다'라는 의미이다.
  • three-valued logic : 비교/논리 연산의 결과로 TRUE, FALSE, UNKNOWN을 가진다.

NULL의 논리 연산 결과

연산에 NULL이 들어가면 결과는 항상 UNKNOWN


UNKNOWN의 논리 연산 결과

[OR] TRUE > UNKNOWN > FALSE [AND]


where condition과 선택되는 tuple

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

NOT IN 사용 시 주의 사항

  • v NOT IN (v1, v2, v3)는 v != v1 AND v != v2 AND v != v3와 같은 의미이다. 만약 v1, v2, v3 중에 하나가 NULL이라면?
  • 3 not in (1, 3, NULL)이면 FALSE
    • 3 != 1 AND 3 != 3 AND 3 != NULL => TRUE AND FALSE AND UNKNOWN => FALSE
  • 3 not in (1, 2, NULL)이면 UNKNOWN
    • 3 != 1 AND 3 != 2 AND 3 != NULL => TRUE AND TRUE AND UNKNOWN => UNKNOWN

 

알고 싶은 것

2000년대생이 없는 부서의 ID와 이름을 알고 싶다.

  • 이런 식으로 코드를 짜게 되면 E.birth_date가 NULL인 경우도 같이 나올 수 있어 NOT IN이 포함된 조건이 FALSE나 UNKNOWN이 나올 수 있음.
  • 그래서 아래와 같이 NULL이 아닌 경우만 나올 수 있게 하는 방법이 있음.
SELECT D.id, D.name FROM department D
WHERE D.id NOT IN (
    SELECT E.dept_id FROM employee E
    WHERE E.birth_date >= '2000-01-01'
      AND E.dept_id IS NOT NULL -- 추가
  );

 

  • 다른 방법으로는 NOT IN 대신 NOT EXISTS를 사용.
SELECT D.id, D.name FROM department D
WHERE NOT EXISTS (
    SELECT * FROM employee E
      WHERE E.dept_id = D.id AND E.birth_date >= '2000-01-01'
  );