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

MySQL에서 두 테이블의 데이터를 비교하는 방법

데이터 마이그레이션 작업을 진행할 때 두 테이블 간에 일치하지 않는 데이터를 찾아야 하는 경우가 종종 있습니다. 이럴 때 테이블을 서로 비교하면 손쉽게 차이점을 확인할 수 있습니다.

예를 들어 'students'와 'student1'이라는 두 개의 테이블이 있다고 가정해 보겠습니다.

mysql> Select * from students;
+--------+--------+----------+
| RollNo | Name   | Subject  |
+--------+--------+----------+
|    100 | Gaurav | Computer |
|    101 | Raman  | History  |
|    102 | Somil  | Computer |
+--------+--------+----------+
3 rows in set (0.00 sec)

mysql> select * from student1;
+--------+--------+----------+
| RollNo | Name | Subject |
+--------+--------+----------+
|    100 | Gaurav | Computer |
|    101 | Raman  | History  |
|    102 | Somil  | Computer |
|    103 | Rahul  | DBMS     |
|    104 | Aarav  | History  |
+--------+--------+----------+
5 rows in set (0.00 sec)

UNION ALL과 GROUP BY를 활용한 비교 쿼리

두 테이블의 데이터를 비교하려면 UNION ALL로 두 테이블의 데이터를 모두 합친 뒤, GROUP BY와 HAVING 절을 사용해 한 번만 등장하는(즉, 한쪽 테이블에만 존재하는) 행을 걸러내면 됩니다. 아래 쿼리를 실행하면 일치하지 않는 행만 결과로 반환됩니다.

mysql> Select RollNo,Name,Subject from(select RollNo,Name,Subject from students union all select RollNo,Name,Subject from Student1)as std GROUP BY RollNo,Name,Subject HAVING Count(*) = 1 ORDER BY RollNo;
+--------+-------+---------+
| RollNo | Name  | Subject |
+--------+-------+---------+
|    103 | Rahul | DBMS    |
|    104 | Aarav | History |
+--------+-------+---------+
1 rows in set (0.02 sec)

쿼리 동작 원리

이 쿼리는 다음과 같은 단계로 동작합니다.

1. UNION ALL: students 테이블과 student1 테이블의 모든 행을 중복 제거 없이 하나로 합칩니다.
2. GROUP BY: RollNo, Name, Subject 세 컬럼을 기준으로 그룹화합니다.
3. HAVING Count(*) = 1: 두 테이블에 모두 존재하는 행은 카운트가 2가 되므로 제외되고, 한쪽에만 있는 행(카운트가 1)만 남습니다.
4. ORDER BY: 결과를 RollNo 기준으로 정렬하여 가독성을 높입니다.

실행 결과를 보면 student1 테이블에만 존재하는 RollNo 103(Rahul)과 104(Aarav) 행이 일치하지 않는 데이터로 출력된 것을 확인할 수 있습니다. 이 방법은 데이터 마이그레이션 후 원본 테이블과 대상 테이블의 정합성을 검증할 때 특히 유용하게 활용됩니다.