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

MySQL에서 EXCEPT가 작동하지 않는 이유와 NOT IN으로 대체하는 방법

MySQL에서는 다른 데이터베이스(예: PostgreSQL, SQL Server)에서 지원하는 EXCEPT 연산자를 사용할 수 없습니다. 하지만 걱정할 필요가 없습니다. NOT IN 연산자를 활용하면 EXCEPT와 동일한 결과를 얻을 수 있습니다.

이 글에서는 두 개의 테이블을 만들고, NOT IN 연산자를 사용해 첫 번째 테이블에는 있지만 두 번째 테이블에는 없는 값을 조회하는 방법을 단계별로 살펴보겠습니다.

1. 첫 번째 테이블 생성하기

먼저 DemoTable1이라는 테이블을 생성합니다.

mysql> create table DemoTable1
   (
   Number1 int
   );
Query OK, 0 rows affected (0.71 sec)

INSERT 명령을 사용해 몇 개의 레코드를 삽입합니다.

mysql> insert into DemoTable1 values(100);
Query OK, 1 row affected (0.14 sec)

mysql> insert into DemoTable1 values(200);
Query OK, 1 row affected (0.13 sec)

mysql> insert into DemoTable1 values(300);
Query OK, 1 row affected (0.13 sec)

SELECT 문으로 테이블의 모든 레코드를 확인합니다.

mysql> select *from DemoTable1;

실행 결과는 다음과 같습니다.

+---------+
| Number1 |
+---------+
|     100 |
|     200 |
|     300 |
+---------+
3 rows in set (0.00 sec)

2. 두 번째 테이블 생성하기

이어서 비교에 사용할 두 번째 테이블인 DemoTable2를 생성합니다.

mysql> create table DemoTable2
   (
   Number1 int
   );
Query OK, 0 rows affected (0.52 sec)

마찬가지로 INSERT 명령으로 레코드를 삽입합니다.

mysql> insert into DemoTable2 values(100);
Query OK, 1 row affected (0.17 sec)

mysql> insert into DemoTable2 values(400);
Query OK, 1 row affected (0.14 sec)

mysql> insert into DemoTable2 values(300);
Query OK, 1 row affected (0.11 sec)

SELECT 문으로 테이블의 모든 레코드를 확인합니다.

mysql> select *from DemoTable2;

실행 결과는 다음과 같습니다.

+---------+
| Number1 |
+---------+
|     100 |
|     400 |
|     300 |
+---------+
3 rows in set (0.00 sec)

3. NOT IN 연산자로 차집합 구하기

이제 NOT IN 연산자를 사용해 DemoTable1에는 존재하지만 DemoTable2에는 없는 값만 조회하는 방법을 알아보겠습니다. 이것이 바로 EXCEPT 연산자를 대체하는 핵심 쿼리입니다.

mysql> select Number1 from DemoTable1
where Number1 not in (SELECT Number1 FROM DemoTable2);

실행 결과는 다음과 같습니다.

+---------+
| Number1 |
+---------+
|     200 |
+---------+
1 row in set (0.04 sec)

DemoTable1의 값 중 100과 300은 DemoTable2에도 존재하므로 제외되고, 오직 200만 결과로 반환된 것을 확인할 수 있습니다.

주의 사항: NULL 값 처리

NOT IN을 사용할 때 한 가지 주의할 점이 있습니다. 서브쿼리의 결과에 NULL 값이 포함되어 있으면 NOT IN 조건은 어떤 행도 반환하지 않습니다. 이는 NULL과의 비교 결과가 알 수 없음(UNKNOWN)으로 평가되기 때문입니다.

따라서 컬럼에 NULL이 존재할 가능성이 있다면 아래와 같이 IS NOT NULL 조건을 함께 사용하거나, NOT EXISTS 또는 LEFT JOIN ... WHERE ... IS NULL 방식을 사용하는 것이 더 안전합니다.

mysql> select Number1 from DemoTable1
where Number1 not in (SELECT Number1 FROM DemoTable2 WHERE Number1 IS NOT NULL);

정리

MySQL에서 EXCEPT 연산자를 직접 사용할 수는 없지만, NOT IN 연산자를 활용하면 동일한 차집합 결과를 손쉽게 얻을 수 있습니다. 다만 NULL 값 처리에 유의하고, 필요에 따라 NOT EXISTS나 LEFT JOIN 방식도 함께 고려하면 더욱 견고한 쿼리를 작성할 수 있습니다.