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

MySQL 두 테이블 간 누락된 값 찾기 – NOT IN 연산자 활용법

MySQL에서 두 테이블 간 누락된 값을 찾는 방법

두 MySQL 테이블 사이에서 한쪽 테이블에는 없는 값을 찾으려면 NOT IN 연산자를 활용하면 됩니다. 이 연산자는 특정 컬럼의 값이 서브쿼리 결과 집합에 존재하지 않는 행만 필터링해 줍니다.

실제 예제를 통해 단계별로 살펴보겠습니다.

1단계: 첫 번째 테이블 생성

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

2단계: 첫 번째 테이블에 데이터 삽입

INSERT 명령을 사용해 레코드를 추가합니다.

mysql> insert into DemoTable1 values(1);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1 values(2);
Query OK, 1 row affected (0.28 sec)
mysql> insert into DemoTable1 values(5);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1 values(6);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1 values(8);
Query OK, 1 row affected (0.16 sec)

3단계: 첫 번째 테이블 데이터 확인

SELECT 문으로 저장된 모든 레코드를 조회합니다.

mysql> select *from DemoTable1;

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

+-------+
| Value |
+-------+
| 1 |
| 2 |
| 5 |
| 6 |
| 8 |
+-------+
5 rows in set (0.00 sec)

4단계: 두 번째 테이블 생성 및 데이터 삽입

mysql> create table DemoTable2(Value int);
Query OK, 0 rows affected (1.19 sec)
mysql> insert into DemoTable2 values(1);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable2 values(2);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable2 values(3);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable2 values(4);
Query OK, 1 row affected (0.12 sec)

5단계: 두 번째 테이블 데이터 확인

mysql> select *from DemoTable2;

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

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

NOT IN으로 누락된 값 조회하기

이제 두 테이블 간의 차이, 즉 DemoTable2에는 존재하지 않는 DemoTable1의 값을 찾는 쿼리입니다.

mysql> select Value from DemoTable1 where Value not in(select Value from DemoTable2);

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

+-------+
| Value |
+-------+
| 5 |
| 6 |
| 8 |
+-------+
3 rows in set (0.07 sec)

결과 분석

DemoTable1에는 1, 2, 5, 6, 8의 값이 있고, DemoTable2에는 1, 2, 3, 4의 값이 있습니다. 따라서 DemoTable2에 존재하지 않는 5, 6, 8이 결과로 반환됩니다.

참고: LEFT JOIN 대안 방법

대량의 데이터를 다룰 때는 성능상의 이유로 LEFT JOIN 방식도 고려할 수 있습니다.

SELECT t1.Value
FROM DemoTable1 t1
LEFT JOIN DemoTable2 t2 ON t1.Value = t2.Value
WHERE t2.Value IS NULL;

이 방식은 인덱스가 설정되어 있다면 NOT IN보다 더 나은 성능을 보일 수 있습니다. 또한 NOT IN 사용 시 주의할 점은, 비교 대상 컬럼에 NULL 값이 포함되어 있으면 의도치 않게 빈 결과가 반환될 수 있다는 점입니다. 이 경우 NOT EXISTS나 LEFT JOIN 방식을 사용하는 것이 안전합니다.