Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 WHERE IN 절로 NULL 값 조회하기

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 조건이 필요하다는 점을 기억해 두세요.