오늘은 쉽지만, 흔히 실수가 발생하고 오해가 일어나기 좋은 문제를 풀어보도록 합니다.
다음과 같이, Customer라는 테이블이 데이터베이스에 저장이 되어 있습니다.
그리고 각 컬럼의 정보는 다음과 같습니다.
여기서 우리의 목표는, 저 referee_id값이 2가 아닌 모든 고객의 이름(name)을 추출하는 것입니다.
그래서 다음과 같은 결과가 나와야 합니다.
이 때 어떻게 SQL을 작성하면 좋을까요?
SQL이 아닌 프로그래밍 언어에 익숙하신 분들이라면 다음과 같이 생각하시는 분이 많습니다.
흔히 할 수 있는 착각입니다.
SELECT name FROM Customer where referee_id != 2;
하지만 이렇게 하면 referee_id값이 2가 아닌 모든 고객의 이름, 즉 Will Jane Bill Zack이 나오는 것이 아니라 오로지 Zack만 추출이 되게 됩니다. 왜 이럴까요? 그것을 알기 위해서는 MySQL에서 사용하는 3논리값을 알아야 합니다.
MySQL에서 사용하는 3논리 - True False Unknown
우리가 다음과 같은 쿼리를 날리면 Customer테이블의 모든 행(Row)을 Iterate하면서 조건(referee_id != 2)에 맞는 데이터를 추출합니다.
SELECT name FROM Customer where referee_id != 2;
그러면 각 행의 데이터를 iterate하면서 조건에 부합한지, 부합하지 않는 지 검사한 결과를 그림으로 그려보도록 하겠습니다.
쿼리문을 데이터베이스에 날리면, 쿼리문의 조건부분을 보고 해당 조건에 맞는 데이터(로우, Row)를 찾아내서 반환한다고 하였습니다. 하지만 조건부분에 들어 있는 컬럼이 null인 경우 해당 데이터의 논리식 대입 결과가 True나 False가 아닌, Unknown으로 반환됩니다. 논리식의 결과가 True인 데이터만 반환을 하는 것인데, 당연히 Unknown 논리식 결과가 나온 행은 반환하지 않습니다.
이처럼, 해당 데이터의 컬럼이 null인 경우, 논리식의 대입 결과가 항상 Unknown으로 나오게 된다는 것을 기억해야 합니다. 이처럼, 특정 컬림의 데이터가 null인 경우를 대비해서 MySQL에서는 IS NULL 혹은 IS NOT NULL이라는 연산자를 제공합니다.
그래서 우리가 원하는 데이터를 추출하기 위해서는 다음과 같은 쿼리문을 작성해야 합니다.
SELECT name from Customer where referee_id IS NULL or referee_id != 2;
감사합니다.
'Database > MySQL' 카테고리의 다른 글
[LeetCode 608] 트리 노드의 타입 판별 (0) | 2024.04.23 |
---|