티끌모아 태산

SQL로 데이터 조회하기, NULL 본문

CS 지식/데이터베이스

SQL로 데이터 조회하기, NULL

goldpig 2023. 9. 16. 18:11
728x90

  이번시간에는 SQL에서 NULL의 의미를 알아보고 비교 연산에서의 결과에 대해서 알아보도록 하겠습니다.

NULL

  1. unknown: 알려지지 않음.
  2. unavailable or withheld: 공개하지 않음, 이용할 수 없음.
  3. not applicable: 해당 사항x, 적용 불가

이렇게 SQL에서 NULL의 의미는 이렇게 다양한것을 알 수 있다. 업데이트 하지 않았거나, 보안상 공개하지 않았다거나 등등

NULL과의 비교 연산

SELECT id FROM employee WHERE birth_date = NULL;

이런식으로 작성하면 아무결과값을 받을 수 없다. NULL과 비교 연산을 하기 위해서는 'IS' 또는 "IS NOT" 을 사용해야 한다.

SELECT id FROM employee WHERE birth_date IS NULL;

NULL 과 Three-Valued Logic

출처:https://www.youtube.com/watch?v=y_7rOoOodCY&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=7, 쉬운코드

여기서 NULL값을 갖는 튜플은 False를 반환할 것 같지만 UNKNOWN 을 반환한다. -> ❗️이때 UNKNWON은 'true' 일 수 도있고 'false'일 수도 있다. 이 점을 인지하는 것이 중요하다. 그래서 three-valued logic은 비교/논리 연산의 결과로 TRUE, FALSE, UNKNOWN을 갖는다.

출처:https://www.youtube.com/watch?v=y_7rOoOodCY&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=7, 쉬운코드
출처:https://www.youtube.com/watch?v=y_7rOoOodCY&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=7, 쉬운코드

이렇게 비교/논리 연산에서의 UNKNOWN이 포함되면 어떤 결과값이 나오는지 인지하고 있는 것이 중요하다. 왜냐하면 예를들어, WHERE절은 condition(s)의 결과가 TRUE인 튜플들만 선택된다. ⭐️즉, 결과값이 FALSE거나 UNKNOWN이면 튜플을 선택되지 않는다. 

 

출처:https://www.youtube.com/watch?v=y_7rOoOodCY&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=7, 쉬운코드
출처:https://www.youtube.com/watch?v=y_7rOoOodCY&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=7, 쉬운코드

이렇게 NULL 값이 들어가면 UNKNOWN을 반환하게 된다. ❗️TRUE를 반환할 것 같지만 UNKNOWN을 반환한다. 지난 시간의 예제에서 '2000년대생이 없는 부서의 ID와 이름을 알고 싶다' 했을 때, 코드는 다음과 같았다.

SELECT D.id, D.name FROM department AS D WHERE D.id NOT IN (
	SELECT E.dept_id FROM employee E WHERE birth_date >= '2000-01-01'
);

임직원 테이블에서 생일이 2000년대 이후인 임직원들의 부서 ID를 가져와서 그 부서 ID에 포함되지 않는 부서의 ID와 name을 가져온다는 것이다. 하지만 만약 '2000년대 이후인 임직원들의 부서 ID'에서 NULL값을 포함한다면 FALSE나 UNKNOWN을 반환하기 때문에 이를 사전에 방지해줄 필요가 있다. 그리고 이에 대해서는 여러가지 방법이 있다. IS NOT NULL 을 넣어서 NULL값이 나오지 않게 방지해준다.

SELECT D.id, D.name FROM department AS D WHERE D.id NOT IN (
	SELECT E.dept_id FROM employee E WHERE birth_date >= '2000-01-01'
    AND E.dept_id IS NOT NULL
);

 

728x90

'CS 지식 > 데이터베이스' 카테고리의 다른 글

SQL 데이터 조회: JOIN  (1) 2023.09.17
⭐️SQL 데이터 조회: subquery  (0) 2023.09.14
SQL 데이터 조회  (0) 2023.09.10