[DB] three-values logic

RepDay1·2023년 3월 22일
0

데이터베이스

목록 보기
2/4
post-thumbnail

Ref. 쉬운코드 백발백중 시리즈

SQL에서 NULL의 의미?

크게 세 가지의 의미를 가진다고 볼 수 있음

  • unknown : 어떤 값이 들어올지 "알 수 없는" 상태
    (ex : 사람의 생일)
  • unavailable or withheld : 공개를 하지 않는 값
    (ex : 사람의 주민번호 등 숨겨야하는 개인정보)
  • not applicable : 해당 사항이 없음
    (ex : 집전화가 없는 집의 경우, 집 전화 번호는 NULL)

==> 즉 SQL에서의 NULL은 같다 다르다를 단정 지을 수 없음
그럼 SQL에서 NULL인 데이터를 찾고자 하면 어떻게 해야 되나?

mysql > SELECT id FROM employee WHERE birth_data = NULL;

-> Empty set

이처럼, SQL에서는 NULL에 대해 =, != 와 같은 연산자를 사용 하면 안됨

mysql > SELECT id FROM employee WHERE birth_date IS NULL;

-> id
14
15

생일이 NULL인 직원의 생일을 가져 온다면? IS 키워드를 사용해야됨

즉, NULL에 대해서는 =, != 대신 IS, IS NOT을 사용해야된다.

three-valued logic이란?

  • SQL에서 NULL과 비교 연산을 하게 되면 그 결과는 UNKNOWN

  • UNKNOWN은 true일 수도 있고, false일 수도 있다는 의미

  • three-valued logic : 비교/논리 연산 결과로 true,false,unknown을 가지는것

  • EX

mysql > SELECT * FROM employee WHERE birth_date = '1990-03-15';

-> UNKNOWN

  • NULL 비교 연산의 결과

  • UNKNOWN의 비교연산 결과

WHERE 절의 조건

  • where절에 있는 condition(s)의 결과가 true인 튜플만 선택됨
    ==> **즉 결과가 false이거나 unknwon인 튜플은 선택되지 않음

SQL NOT IN 사용시 주의점

  • v NOT IN(v1,v2,v3)는 v != v1 AND v != v2 AND v != v3 이란 의미

  • 여기서 만약 v1,v2,v3 중 하나가 NULL이면 ?

  • 2000년대생이 없느 부서의 ID와 이름을 알고 싶다면?
    만약 E.dept_id에 NULL이 포함될 경우는 unknown이나 false가 되고, where절은 true인 경우만 반환함 고로 그 어떤 부서도 반환을 하지 않음

mysql > select D.id, D.name
		from department AS D
        where D.id NOT IN(select E.dept_id
                          from employee E
                          where E.birth_date >= '2000-01-01'
                          );
                                
                               

다음 방법들로 원하는 값 가져 올 수 있다.

  • dept_id가 NULL값을 갖지 못하도록 NOT NULL제약을 건다.
  • 서브쿼리 where절에 다음을 추가
AND E.birth_date IS NOT NULL
  • NOT IN 대신 NOT EXISTS 사용.
    (NOT) IN : 실제 데이터들의 값을 비교하여 일치하는지 확인
    (NOT) EXISTS : 해당 ROW 가 존재하는지만 확인하여, TRUE 혹은 FALSE 를 반환
profile
이 블로그는 제가 개인적으로 학습한 내용을 올린 글들이 주를 이룰 것입니다. 때문에 틀린 내용이 있을 가능성이 매우 높다는 점 유의해주시기 바랍니다. 사소한 내용이라도 틀린 내용이 있다면, 댓글로 지적해주시면 너무 감사할 것 같습니다. 지적해주시면 계신 방향으로 큰 절 올리겠습니다.

0개의 댓글