데이터 베이스 공부

장숭혁·2024년 8월 14일
0

TIL작성

목록 보기
53/60

1. SQL에서의 NULL의 의미

  • unknown (알려지지 않음) - 생일

  • unavailable or withheld (공개 하지 않음) - 민감한 정보

  • not applicable (해당 사항 없음) - 집전화 없는 경우

-> 생일 열(row)이 null로 되어 있을때 어떤 두사람을 같다(==), 다르다(!=)로 처리하면 안된다. 그렇기에 sql에서는 같다 다르다로 단정 지을 수 없다.

-> SELECT id FROM employee WHERE birth_date = null; -> Empty set 출력
-> SELECT id FROM employee WHERE birth_date IS null; -> 해당 되는 id 출력

three-valued logic : 비교/논리 연산의 결과 TRUE,FALSE, UNKNOWN을 가진다.
null과 비교연산을 수행할 경우 unknown이 나오게 된다.

where 절에 있는 conditions의 결과가 True인 튜플만 선택된다.

  • and 연산의 FALSE 연산 OR 연산의 TRUE 연산이 기존 알고 있던 예상되로 출력되고 나머지는 예상외의 unknown이 출력 될 수 있다. not연산도 unknown은 unknown이 출력되므로 주의해야 한다.(True와 false 중 어떤 값인지 모르기 때문)

  • NOT IN 사용 시 주의

"3 not in(1,2, null)" 은 unknown으로 나온다. null이 3일 수도 있기 때문이다.

  • sql 문 예시
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'
            );

-NOT IN 은 and 연산으로서 하나에 값이라도 있을경우 false가 출력되는데 이때 birth_date 테이블 열에 null이 저장되어 있을경우 unknown이 출력되므로 이 sql문은 결과적으로 unknown 혹은 false만 출력된다.


- 해결방법 1. E.dept_id가 not null인 상태를 만든다. 2. IS NOT NULL의 조건을 추가한다. ``` 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' AND E.dept_id IS NOT NULL ); ```
  1. NOT IN -> NOT EXISTS로 변환
SELECT D.id, D.name
FROM department AS D
WHERE D.id NOT EXISTS(
			SELECT E.dept.ID
            FROM employee E
            WHERE E.birth_date >= '2000-01-01' 
            );
  • Kotlin 언어의 null 안정성과 관련이 있을 것 같다는 생각을 하였다. ?를 사용하여 null을 허용할 수 있는 타입을 명시적으로 지정하는데, 데이터베이스에서 발생할 수 있는 NULL 값으로 인한 오류를 예방하는 데 도움이 될 것이다.
profile
코딩 기록

0개의 댓글

관련 채용 정보