데이터베이스(쉬운코드)
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의 논리 연산 결과
UNKNOWN의 논리 연산 결과
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'
);