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

MySQL에서 다른 테이블에 존재하지 않는 행만 조회하는 방법 (NATURAL LEFT JOIN 활용)

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 JOINIS NULL 조건을 조합하면 별도의 서브쿼리나 NOT IN, NOT EXISTS 절 없이도 간결하게 두 테이블 간의 차집합을 구할 수 있습니다. 참고로 컬럼명이 서로 다른 테이블을 비교할 때는 NATURAL LEFT JOIN 대신 일반 LEFT JOIN ... ON 구문에 명시적인 조인 조건을 사용하는 것이 좋습니다.