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

MySQL LEFT OUTER JOIN으로 두 테이블 비교 후 누락된 ID 찾는 방법

두 개의 테이블을 비교하여 한쪽에 존재하지 않는 ID(누락된 값)를 확인하려면 MySQL의 LEFT OUTER JOIN을 활용하면 됩니다. 이 방법은 데이터 동기화 검증이나 두 데이터셋 간 차이를 분석할 때 매우 유용하게 사용됩니다.

아래에서 샘플 필드를 가진 테이블을 생성하고 레코드를 삽입한 뒤, 실제로 누락된 ID를 조회하는 전체 과정을 단계별로 살펴보겠습니다.

1. 첫 번째 테이블(First_Table) 생성

먼저 Id 컬럼 하나만 가진 간단한 테이블을 생성합니다. 테이블 생성 쿼리는 다음과 같습니다.

mysql> create table First_Table
-> (
-> Id int
-> );
Query OK, 0 rows affected (0.88 sec)

레코드 삽입

INSERT 명령어를 사용해 첫 번째 테이블에 레코드를 추가합니다.

mysql> insert into First_Table values(1);
Query OK, 1 row affected (0.68 sec)
mysql> insert into First_Table values(2);
Query OK, 1 row affected (0.29 sec)
mysql> insert into First_Table values(3);
Query OK, 1 row affected (0.20 sec)
mysql> insert into First_Table values(4);
Query OK, 1 row affected (0.20 sec)

저장된 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select *from First_Table;

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

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

2. 두 번째 테이블(Second_Table) 생성

이번에는 비교 대상이 될 두 번째 테이블을 생성합니다.

mysql> create table Second_Table
-> (
-> Id int
-> );
Query OK, 0 rows affected (0.60 sec)

레코드 삽입

두 번째 테이블에는 일부러 일부 값만 넣어보겠습니다. 여기서는 2와 4만 삽입합니다.

mysql> insert into Second_Table values(2);
Query OK, 1 row affected (0.19 sec)
mysql> insert into Second_Table values(4);
Query OK, 1 row affected (0.20 sec)

저장된 데이터 확인

mysql> select *from Second_Table;

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

+------+
| Id |
+------+
| 2 |
| 4 |
+------+
2 rows in set (0.00 sec)

3. LEFT OUTER JOIN으로 누락된 ID 조회

이제 핵심인 비교 쿼리입니다. LEFT OUTER JOIN은 왼쪽 테이블(First_Table)의 모든 행을 기준으로 오른쪽 테이블(Second_Table)과 매칭을 시도하며, 매칭되지 않는 행은 NULL로 표시됩니다. 따라서 WHERE 절에서 Second_Table.Id IS NULL 조건을 걸면, 두 번째 테이블에는 없고 첫 번째 테이블에만 존재하는 ID를 정확히 찾아낼 수 있습니다.

mysql> SELECT First_Table.Id FROM First_Table
-> LEFT OUTER JOIN Second_Table ON First_Table.Id = Second_Table.Id
-> WHERE Second_Table.Id IS NULL;

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

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

결과 해석

위 결과를 보면 첫 번째 테이블에는 있지만 두 번째 테이블에는 없는 ID가 1과 3으로 출력된 것을 확인할 수 있습니다. 즉, Second_Table에 누락된 ID가 무엇인지 한 번의 쿼리로 손쉽게 파악할 수 있습니다.

참고로 반대 방향(Second_Table 기준)으로 JOIN을 작성하면, 두 번째 테이블에는 있지만 첫 번째 테이블에 없는 ID도 동일한 방식으로 조회할 수 있습니다. 또한 대량의 데이터를 다룰 때는 양쪽 테이블의 Id 컬럼에 인덱스를 생성해두면 JOIN 성능을 크게 향상시킬 수 있습니다.