NULL
SQL문의 의도는 birth_date값이 NULL인 tuple를 골라 id값을 출력학 싶었던 것이다.
그러나 결과는 Empty Set!!!!
즉, birth_date가 NULL인 것이 employee에는 없다라는 것이...다???????
결론부터 말하면 그렇게 생각하면 안된다.
SQL에서의 NULL은 조금 다르게 취급을 해 줘야 한다.
birth_date = NULL 과 같이 ' = '을 붙여 주면 안 된다.
SQL에서는 NULL 앞에는 반드시 is가 들어 가야 한다.
만약 NULL이 아닌 생일을 가진 직원의 id를 알고 싶다면 SQL문이 어떻게 되야 할까??
-> SELECT id FROM employee WHERE birth_date IS NOT NULL
NULL과 Three-valued-logic
위 SQL문을 실행을 하면, 각 tuple의 birth_date값이 1990-03-09이면 true가 반환되어 그 tuple이 선택이 될 것이고
일치하지 않으면 false가 반환되어 그 tuple이 선택되지 않을 것이다.
Q. 그럼 birth_date이 NULL인 경우에는??
A. 보통 false를 반환한다고 생각하기 쉽다.
그러나 NULL은 UNKNOWN을 반환을 한다.
SQL에서의 NULL은 여러 가지 의미를 가진다.
생일이 있는데 공개가 아직 안 됐거나, 업데이트가 되지 않아거나, 혹은 아직 알려지지 않았음을 의미한다.
즉, NULL은 값이 없다는 뜻이 아니라 값을 모르는 未知数이다.
subquery의 결과 tuple 중, dept_id가 NULL인 경우가 하나 있디고 하자.
그러므로 NOT IN (...)의 결과는 각 tuple에 대해 false or unknown을 반환을 하게 된다.
그렇게 되면, where절이 false or unknown을 반환하게 되므로
우리가 생각했던 대로 동작을 하지 않게 된다.
2000년 생이 없는 부서가 존재함에도 불구하고 어떠한 id name도 출력되지 않는다.
Solution 1. dept_id를 NOT NULL Constrains로 정의
Solution 2.
Solution 3. NOT IN -> NOT EXISTS로 변환
'CS 과목(CS科目) > 데이터 베이스(データベース)' 카테고리의 다른 글
9. SQL로 데이터 조회하기(SQLでデーター照会)PART 5 (2) | 2022.12.08 |
---|---|
8.SQL로 데이터 조회하기(SQLでデーター照会)PART 4 (0) | 2022.12.08 |
6. SQL로 데이터 조회하기(SQLでデーターを照会)PART 2 (0) | 2022.12.08 |
5. SQL로 데이터 조회하기(SQLでデーターを照会しょう)part 1 (0) | 2022.12.08 |
4. SQL로 DB에 데이터를 추가(insert)하고 수정(update)하고 삭제(delete)하는 방법(SQLでDBへデーターを挿入(insert)/修正(update)/削除(delete)する方法) (0) | 2022.12.08 |