MySQL에서 <>와 NULL 비교 시 주의할 점
MySQL에서 <> 연산자(같지 않음)를 사용하여 NULL 값과 비교하면 결과는 항상 NULL이 반환됩니다. 따라서 WHERE 절에서 이 조건을 사용하면 아무런 행도 조회되지 않습니다.
NULL은 '값이 없음'을 의미하는 특수한 상태이기 때문에, 일반적인 비교 연산자로는 비교 자체가 성립하지 않습니다. 이는 SQL 표준에서 정한 규칙으로, NULL과의 모든 비교 연산(<, >, =, <> 등)의 결과는 TRUE나 FALSE가 아닌 UNKNOWN(NULL)이 됩니다.
비교 예시
다음 예제들을 통해 확인해 보겠습니다.
mysql> select 10 <> NULL; +------------+ | 10 <> NULL | +------------+ | NULL | +------------+ 1 row in set (0.00 sec) mysql> select NULL <> NULL; +--------------+ | NULL <> NULL | +--------------+ | NULL | +--------------+ 1 row in set (0.00 sec) mysql> select 'Chris' <> NULL; +-----------------+ | 'Chris' <> NULL | +-----------------+ | NULL | +-----------------+ 1 row in set (0.00 sec) mysql> select '' <> NULL; +------------+ | '' <> NULL | +------------+ | NULL | +------------+ 1 row in set (0.00 sec)
위 결과에서 볼 수 있듯이, 숫자든 문자열이든 빈 문자열('')이든 어떤 값이라도 NULL과 <>로 비교하면 항상 NULL이 반환됩니다.
실습으로 확인하기
1. 테이블 생성
먼저 테스트용 테이블을 생성합니다.
mysql> create table DemoTable846(Value int); Query OK, 0 rows affected (0.93 sec)
2. 데이터 삽입
INSERT 명령어를 사용하여 NULL 값과 일반 값을 각각 저장합니다.
mysql> insert into DemoTable846 values(NULL); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable846 values(10); Query OK, 1 row affected (0.11 sec)
3. 전체 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable846;
실행 결과는 다음과 같습니다.
+-------+ | Value | +-------+ | NULL | | 10 | +-------+ 2 rows in set (0.00 sec)
IS NOT NULL vs <> 연산자 결과 비교
IS NOT NULL 사용 시
IS NOT NULL 연산자를 사용하면 NULL이 아닌 값만 정확하게 조회됩니다.
mysql> select *from DemoTable846 where Value IS NOT NULL;
결과:
+-------+ | Value | +-------+ | 10 | +-------+ 1 row in set (0.00 sec)
<> 연산자 사용 시
반면 <> 연산자로 NULL과 비교하면, 앞서 설명했듯이 모든 비교 결과가 NULL(UNKNOWN)이 되어 조건을 만족하는 행이 하나도 없습니다.
mysql> select *from DemoTable846 where Value <> NULL; Empty set (0.00 sec)
정리
- <> NULL: 항상 NULL(UNKNOWN)을 반환하므로 WHERE 절에서 사용하면 아무 결과도 나오지 않습니다.
- IS NOT NULL: NULL 여부를 판별하는 전용 연산자로, NULL이 아닌 행만 정확히 필터링합니다.
따라서 NULL 값을 제외하고 데이터를 조회하고 싶다면 반드시 IS NOT NULL을 사용해야 하며, <> NULL이나 != NULL 같은 표현은 절대 사용해서는 안 됩니다. 이것은 초급 개발자들이 자주 저지르는 실수 중 하나이므로 꼭 기억해 두세요.