데이터 마이그레이션 작업을 진행할 때 두 테이블 간에 일치하지 않는 데이터를 찾아야 하는 경우가 종종 있습니다. 이럴 때 테이블을 서로 비교하면 손쉽게 차이점을 확인할 수 있습니다.
예를 들어 '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) 행이 일치하지 않는 데이터로 출력된 것을 확인할 수 있습니다. 이 방법은 데이터 마이그레이션 후 원본 테이블과 대상 테이블의 정합성을 검증할 때 특히 유용하게 활용됩니다.