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

MySQL에서 테이블에 존재하지 않는 값만 조회하는 방법 – UNION ALL과 NOT EXISTS 활용하기

MySQL에서 특정 값들이 이미 테이블에 저장되어 있는지 확인하고, 테이블에 존재하지 않는 값만 조회해야 하는 경우가 있습니다. 이럴 때는 UNION ALL로 조회하고자 하는 값들을 가상의 목록으로 만들고, WHERE NOT EXISTS 조건을 사용해 이미 테이블에 있는 값은 제외하면 됩니다.

핵심 개념 정리

이 기법의 동작 원리는 다음과 같습니다.

  • UNION ALL: 여러 개의 SELECT 결과를 하나로 합쳐서 임시 파생 테이블(derived table)을 생성합니다. 여기서는 확인하고 싶은 값들을 나열하는 용도로 사용됩니다.
  • NOT EXISTS: 서브쿼리의 결과가 존재하지 않는 경우에만 참을 반환합니다. 즉, 해당 값이 실제 테이블에 없을 때만 행을 출력합니다.

1. 테스트용 테이블 생성

먼저 자동 증가(AUTO_INCREMENT) 컬럼 하나를 가진 간단한 테이블을 만들어 보겠습니다.

mysql> create table DemoTable1918
    (
    Value int NOT NULL AUTO_INCREMENT PRIMARY KEY
    );
Query OK, 0 rows affected (0.00 sec)

2. 샘플 데이터 삽입

AUTO_INCREMENT 컬럼에는 값을 직접 지정하지 않아도 자동으로 순번이 채워집니다. INSERT 문을 다섯 번 실행해 보겠습니다.

mysql> insert into DemoTable1918 values();
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1918 values();
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1918 values();
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1918 values();
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1918 values();
Query OK, 1 row affected (0.00 sec)

3. 저장된 데이터 확인

SELECT 문으로 전체 레코드를 조회합니다.

mysql> select * from DemoTable1918;

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

+-------+
| Value |
+-------+
|     1 |
|     2 |
|     3 |
|     4 |
|     5 |
+-------+
5 rows in set (0.00 sec)

현재 테이블에는 1부터 5까지의 값이 들어 있습니다.

4. 테이블에 없는 값만 조회하는 쿼리

이제 6, 7, 8이라는 값 중에서 테이블에 존재하지 않는 것만 골라내는 쿼리입니다. UNION ALL로 세 값을 나열한 파생 테이블을 만들고, NOT EXISTS로 실제 테이블과 비교합니다.

mysql> select tbl.Value
    from ( select 6 as Value union all select 7 union all select 8 ) tbl
    where not exists ( select 1 from DemoTable1918 tbl1
    where tbl1.Value=tbl.Value);

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

+-------+
| Value |
+-------+
|     6 |
|     7 |
|     8 |
+-------+
3 rows in set (0.00 sec)

6, 7, 8은 모두 테이블에 없는 값이므로 그대로 출력되었습니다. 만약 이 중 하나라도 테이블에 이미 존재한다면 해당 값은 결과에서 자동으로 제외됩니다.

추가 팁: NOT IN과의 차이점

같은 결과를 WHERE tbl.Value NOT IN (SELECT Value FROM DemoTable1918) 형태로 구현할 수도 있습니다. 하지만 NOT IN은 서브쿼리 결과에 NULL이 포함되면 의도치 않게 아무 행도 반환하지 않는 문제가 있고, 대량 데이터에서 성능이 떨어질 수 있습니다. 반면 NOT EXISTS는 NULL 처리에 안전하고 인덱스를 효율적으로 활용할 수 있어 일반적으로 더 권장되는 방식입니다.