MySQL에서 EXCEPT의 대안은?
MySQL은 표준 SQL의 EXCEPT 집합 연산자를 지원하지 않습니다. 따라서 두 테이블 간의 차집합을 구하려면 NOT IN 연산자를 사용해야 합니다. 이 글에서는 실제 예제를 통해 NOT IN 연산자로 EXCEPT와 동일한 결과를 얻는 방법을 단계별로 살펴보겠습니다.
1단계: 첫 번째 테이블 생성
먼저 데모용 테이블을 생성합니다.
mysql> create table DemoTable
(
Number1 int
);
Query OK, 0 rows affected (0.71 sec)
2단계: 레코드 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable values(100);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(200);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(300);
Query OK, 1 row affected (0.13 sec)
3단계: 테이블 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable;
실행 결과는 다음과 같습니다.
+---------+
| Number1 |
+---------+
| 100 |
| 200 |
| 300 |
+---------+
3 rows in set (0.00 sec)
4단계: 두 번째 테이블 생성 및 데이터 삽입
비교 대상이 될 두 번째 테이블을 생성합니다.
mysql> create table DemoTable2
(
Number1 int
);
Query OK, 0 rows affected (0.52 sec)
마찬가지로 레코드를 삽입합니다.
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)
두 번째 테이블의 내용도 확인해 보겠습니다.
mysql> select * from DemoTable2;
+---------+
| Number1 |
+---------+
| 100 |
| 400 |
| 300 |
+---------+
3 rows in set (0.00 sec)
5단계: NOT IN으로 차집합 구하기
EXCEPT 대신 NOT IN 연산자를 사용하여 첫 번째 테이블에는 존재하지만 두 번째 테이블에는 없는 값을 조회합니다.
mysql> select Number1 from DemoTable
where Number1 not in (SELECT Number1 FROM DemoTable2);
실행 결과는 다음과 같습니다.
+---------+
| Number1 |
+---------+
| 200 |
+---------+
1 row in set (0.04 sec)
결과 해석
DemoTable에는 100, 200, 300이 있고 DemoTable2에는 100, 400, 300이 저장되어 있습니다. 두 테이블을 비교했을 때 DemoTable에만 존재하는 값은 200 하나입니다. 이것이 바로 EXCEPT(차집합) 연산과 동일한 결과입니다.
NOT IN 사용 시 주의사항
NOT IN은 서브쿼리 결과에 NULL 값이 포함되어 있으면 예상과 달리 빈 결과를 반환할 수 있습니다. 컬럼에 NULL이 들어갈 가능성이 있다면 LEFT JOIN ... IS NULL 방식이나 NOT EXISTS를 사용하는 것이 더 안전합니다.
select t1.Number1
from DemoTable t1
left join DemoTable2 t2 on t1.Number1 = t2.Number1
where t2.Number1 is null;
참고 사항
MariaDB 10.3부터는 EXCEPT와 INTERSECT 연산자가 기본 지원됩니다. 반면 MySQL 환경에서는 NOT IN 또는 NOT EXISTS를 활용하는 것이 표준적인 대안이며, 데이터 특성에 맞게 적절한 방식을 선택하는 것이 중요합니다.