MySQL에서 WHERE IN 절과 NULL 값 함께 사용하기
MySQL에서 WHERE IN 절을 사용할 때 NULL 값을 함께 처리해야 하는 경우가 있습니다. SQL에서는 NULL을 등호(=)나 IN 절로 직접 비교할 수 없기 때문에, IS NULL 조건을 OR 연산자와 함께 사용해야 합니다.
기본 문법
NULL 값을 포함하여 조회하는 기본 문법은 다음과 같습니다:
SELECT yourColumnName1, yourColumnName2, yourColumnName3, ... N FROM yourTableName WHERE yourValue IN(yourColumnName1, yourColumnName2) OR yourColumnName1 IS NULL;
핵심은 OR 연산자로 IS NULL 조건을 추가하는 것입니다. 이렇게 하면 지정한 값에 해당하는 행과 NULL 값을 가진 행을 모두 조회할 수 있습니다.
예제 테이블 생성
먼저 실습에 사용할 테이블을 생성해 보겠습니다:
mysql> CREATE TABLE demo60 -> ( -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> first_name VARCHAR(20), -> last_name VARCHAR(20) -> ); Query OK, 0 rows affected (2.11 sec)
데이터 삽입
INSERT 명령으로 테이블에 레코드를 삽입합니다. 이때 first_name이 NULL인 레코드도 의도적으로 포함시킵니다:
mysql> INSERT INTO demo60(first_name, last_name) VALUES('John', 'Smith');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO demo60(first_name, last_name) VALUES('John', 'Doe');
Query OK, 1 row affected (0.51 sec)
mysql> INSERT INTO demo60(first_name, last_name) VALUES(NULL, 'Brown');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO demo60(first_name, last_name) VALUES('David', 'Miller');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO demo60(first_name, last_name) VALUES('David', 'Smith');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO demo60(first_name, last_name) VALUES('Chris', 'Brown');
Query OK, 1 row affected (0.12 sec)
테이블 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 확인합니다:
mysql> SELECT * FROM demo60;
위 쿼리는 다음과 같은 결과를 출력합니다:
+----+------------+-----------+ | id | first_name | last_name | +----+------------+-----------+ | 1 | John | Smith | | 2 | John | Doe | | 3 | NULL | Brown | | 4 | David | Miller | | 5 | David | Smith | | 6 | Chris | Brown | +----+------------+-----------+ 6 rows in set (0.00 sec)
WHERE IN 절에 NULL 조건 적용하기
다음은 'John'이라는 값이 first_name 또는 last_name 컬럼에 존재하거나, first_name이 NULL인 레코드를 조회하는 쿼리입니다:
mysql> SELECT -> id, -> first_name, -> last_name -> FROM demo60 -> WHERE 'John' IN(first_name, last_name) OR first_name IS NULL;
위 쿼리는 다음과 같은 결과를 출력합니다:
+----+------------+-----------+ | id | first_name | last_name | +----+------------+-----------+ | 1 | John | Smith | | 2 | John | Doe | | 3 | NULL | Brown | +----+------------+-----------+ 3 rows in set (0.00 sec)
결과 분석
조회된 결과를 자세히 살펴보면 다음과 같습니다:
- 1번, 2번 레코드: first_name이 'John'이므로
IN조건에 해당되어 조회되었습니다. - 3번 레코드: first_name이 NULL이지만
IS NULL조건 덕분에 정상적으로 조회되었습니다. - 4~6번 레코드: 'John'이 아니고 first_name도 NULL이 아니므로 결과에서 제외되었습니다.
이처럼 MySQL에서 WHERE IN 절로 NULL 값을 포함한 데이터를 조회하려면 OR ... IS NULL 조건을 추가하는 것이 가장 간단하고 확실한 방법입니다. NULL은 세 가지 논리값(TRUE, FALSE, UNKNOWN) 중 UNKNOWN으로 평가되어 일반적인 비교 연산에서 항상 거짓으로 처리되기 때문에, 반드시 별도의 IS NULL 조건이 필요하다는 점을 기억해 두세요.