MySQL에서 두 테이블을 비교하여 한쪽 테이블에만 존재하는 행을 찾아야 하는 경우가 자주 있습니다. 이번 글에서는 실제 예제를 통해 두 개의 테이블을 생성하고, NATURAL LEFT JOIN을 활용해 두 번째 테이블에는 없는 첫 번째 테이블의 행을 조회하는 방법을 단계별로 살펴보겠습니다.
1. 첫 번째 테이블 생성 및 데이터 입력
먼저 비교 기준이 될 첫 번째 테이블을 생성합니다.
mysql> create table FirstTableDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected (0.48 sec)
다음으로 첫 번째 테이블에 레코드를 삽입합니다.
mysql> insert into FirstTableDemo values(1,'Bob'),(2,'John'),(3,'Carol'); Query OK, 3 rows affected (0.13 sec) Records: 3 Duplicates: 0 Warnings: 0
저장된 전체 레코드를 확인해 보겠습니다.
mysql> select *from FirstTableDemo;
실행 결과는 다음과 같습니다.
+------+-------+ | id | name | +------+-------+ | 1 | Bob | | 2 | John | | 3 | Carol | +------+-------+ 3 rows in set (0.00 sec)
2. 두 번째 테이블 생성 및 데이터 입력
이어서 비교 대상이 될 두 번째 테이블을 생성합니다.
mysql> create table SecondTableDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected (0.62 sec)
두 번째 테이블에는 일부러 첫 번째 테이블의 일부 레코드만 입력합니다.
mysql> insert into SecondTableDemo values(1,'Bob'),(2,'John'); Query OK, 2 rows affected (0.12 sec) Records: 2 Duplicates: 0 Warnings: 0
두 번째 테이블의 전체 레코드를 확인합니다.
mysql> select *from SecondTableDemo;
실행 결과는 다음과 같습니다.
+------+------+ | id | name | +------+------+ | 1 | Bob | | 2 | John | +------+------+
3. NATURAL LEFT JOIN으로 차집합 조회하기
두 테이블을 비교해 보면 첫 번째 테이블에는 'Carol'이라는 레코드가 있지만, 두 번째 테이블에는 존재하지 않습니다. 이처럼 첫 번째 테이블에만 있는 행을 조회하려면 아래와 같은 쿼리 구문을 사용합니다.
mysql> SELECT tbl1.*
-> FROM FirstTableDemo tbl1
-> NATURAL LEFT JOIN SecondTableDemo tbl2
-> where tbl2.name IS NULL;이 쿼리의 동작 원리는 다음과 같습니다.
NATURAL LEFT JOIN은 두 테이블의 공통 컬럼(id, name)을 기준으로 모든 왼쪽 테이블의 행을 유지하면서 조인합니다.- 두 번째 테이블에 매칭되는 행이 없는 경우 해당 컬럼은
NULL로 반환됩니다. - 따라서
WHERE tbl2.name IS NULL조건을 추가하면 두 번째 테이블에 존재하지 않는 행만 필터링할 수 있습니다.
실행 결과, 첫 번째 테이블에는 있지만 두 번째 테이블에는 없는 'Carol' 레코드만 출력됩니다.
+------+-------+ | id | name | +------+-------+ | 3 | Carol | +------+-------+ 1 row in set (0.03 sec)
마무리
이처럼 NATURAL LEFT JOIN과 IS NULL 조건을 조합하면 별도의 서브쿼리나 NOT IN, NOT EXISTS 절 없이도 간결하게 두 테이블 간의 차집합을 구할 수 있습니다. 참고로 컬럼명이 서로 다른 테이블을 비교할 때는 NATURAL LEFT JOIN 대신 일반 LEFT JOIN ... ON 구문에 명시적인 조인 조건을 사용하는 것이 좋습니다.