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

MySQL 조인으로 두 테이블 간의 차이(DIFFERENCE) 구현하는 방법

MySQL에서 테이블 차이 구하기

MySQL에는 오라클의 MINUS나 표준 SQL의 EXCEPT처럼 차집합을 직접 구하는 연산자가 없습니다. 대신 LEFT JOINUNION을 조합하면 두 테이블 간의 차이(DIFFERENCE)를 손쉽게 구할 수 있습니다. 핵심 아이디어는 다음과 같습니다.

  • 첫 번째 테이블을 기준으로 두 번째 테이블에 존재하지 않는 행을 조회합니다.
  • 두 번째 테이블을 기준으로 첫 번째 테이블에 존재하지 않는 행을 조회합니다.
  • 두 결과를 UNION으로 합쳐 최종 차이를 구합니다.

예제 테이블 준비

설명을 위해 다음과 같은 두 개의 테이블 'value1'과 'value2'가 있다고 가정해 보겠습니다.

mysql> Select * from value1;
+-----+-----+
| i   | j   |
+-----+-----+
|  1  |  1  |
|  2  |  2  |
+-----+-----+
2 rows in set (0.00 sec)

mysql> Select * from value2;
+------+------+
| i    | j    |
+------+------+
|  1   |  1   |
|  3   |  3   |
+------+------+
2 rows in set (0.00 sec)

'value1'에는 값 2가, 'value2'에는 값 3이 서로에게 없는 상태입니다. 이제 이 차이를 쿼리로 확인해 보겠습니다.

차집합 쿼리 실행

아래 쿼리는 'value1'과 'value2' 사이의 DIFFERENCE를 계산합니다.

mysql> Select * from value1 left join value2 using(i,j) where value2.i is NULL UNION Select * from value2 left join value1 using(i,j) Where value1.i is NULL;
+------+-----+
| i    | j   |
+------+-----+
|  2   |  2  |
|  3   |  3  |
+-----+------+
2 rows in set (0.07 sec)

쿼리 동작 원리

LEFT JOIN은 왼쪽 테이블의 모든 행을 유지하면서 오른쪽 테이블에서 일치하는 행을 찾습니다. 만약 일치하는 행이 없으면 오른쪽 테이블의 컬럼 값은 NULL이 됩니다. 따라서 WHERE value2.i IS NULL 조건은 'value1'에는 존재하지만 'value2'에는 없는 행만 걸러냅니다.

반대 방향의 조인도 같은 방식으로 동작하여 'value2'에만 있는 행을 추출하고, 두 결과를 UNION으로 합치면 어느 한쪽에만 존재하는 모든 행, 즉 두 테이블의 차이를 정확히 얻을 수 있습니다. 위 예제에서는 'value1'에만 있는 (2, 2)와 'value2'에만 있는 (3, 3)이 결과로 반환된 것을 확인할 수 있습니다.