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

MySQL에서 두 테이블 간 LEFT JOIN 수행하는 방법

이번 글에서는 MySQL에서 두 개의 테이블을 생성하고 외래 키(Foreign Key) 제약 조건으로 연결한 뒤, LEFT JOIN을 활용해 데이터를 조회하는 방법을 단계별로 알아보겠습니다.

1. 첫 번째 테이블(ParentTable) 생성

먼저 부모 역할을 할 첫 번째 테이블을 생성합니다. 기본 키(Primary Key)가 되는 UniqueId 컬럼은 AUTO_INCREMENT로 설정하여 자동 증가되도록 합니다.

mysql> create table ParentTable
    -> (
    -> UniqueId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> EmployeeName varchar(10)
    -> );
Query OK, 0 rows affected (0.56 sec)

레코드 삽입

INSERT 명령을 사용해 첫 번째 테이블에 직원 이름 데이터를 입력합니다.

mysql> insert into ParentTable(EmployeeName) values('John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into ParentTable(EmployeeName) values('Carol');
Query OK, 1 row affected (0.32 sec)
mysql> insert into ParentTable(EmployeeName) values('Sam');
Query OK, 1 row affected (0.18 sec)
mysql> insert into ParentTable(EmployeeName) values('Bob');
Query OK, 1 row affected (0.19 sec)

데이터 조회

SELECT 문으로 테이블에 저장된 모든 레코드를 확인할 수 있습니다.

mysql> select *from ParentTable;

실행 결과는 다음과 같습니다.

+----------+--------------+
| UniqueId | EmployeeName |
+----------+--------------+
|        1 | John         |
|        2 | Carol        |
|        3 | Sam          |
|        4 | Bob          |
+----------+--------------+
4 rows in set (0.00 sec)

2. 두 번째 테이블(ChildTable) 생성 및 외래 키 설정

이제 자식 역할을 할 두 번째 테이블을 생성합니다. 이때 CONSTRAINT 구문을 사용해 ParentTable의 UniqueId 컬럼을 참조하는 외래 키를 지정합니다. 이렇게 하면 자식 테이블에는 반드시 부모 테이블에 존재하는 UniqueId 값만 입력할 수 있습니다.

mysql> create table ChildTable
    -> (
    -> UniqueId int NOT NULL PRIMARY KEY,
    -> EmployeeAddress varchar(100),
    -> CONSTRAINT fk_uniqueId FOREIGN KEY(UniqueId) references ParentTable(UniqueId)
    -> );
Query OK, 0 rows affected (0.54 sec)

레코드 삽입

두 번째 테이블에도 INSERT 명령으로 주소 데이터를 입력합니다. 여기서 의도적으로 UniqueId가 3인 레코드에는 주소를 넣지 않아 NULL 값이 저장되도록 했습니다. 이는 LEFT JOIN의 동작 원리를 보여주기 위한 것입니다.

mysql> insert into ChildTable values(1,'15 West Shady Lane Starkville, MS 39759');
Query OK, 1 row affected (0.19 sec)
mysql> insert into ChildTable values(2,'72 West Rock Creek St. Oxford, MS 38655');
Query OK, 1 row affected (0.18 sec)
mysql> insert into ChildTable(UniqueId) values(3);
Query OK, 1 row affected (0.41 sec)
mysql> insert into ChildTable values(4,'119 North Sierra St. Marysville, OH 43040');
Query OK, 1 row affected (0.16 sec)

데이터 조회

mysql> select *from ChildTable;

실행 결과는 다음과 같습니다. UniqueId가 3인 레코드의 EmployeeAddress가 NULL임을 확인할 수 있습니다.

+----------+-------------------------------------------+
| UniqueId | EmployeeAddress                           |
+----------+-------------------------------------------+
|        1 | 15 West Shady Lane Starkville, MS 39759   |
|        2 | 72 West Rock Creek St. Oxford, MS 38655   |
|        3 | NULL                                      |
|        4 | 119 North Sierra St. Marysville, OH 43040 |
+----------+-------------------------------------------+
4 rows in set (0.00 sec)

3. LEFT JOIN으로 두 테이블 결합하기

이제 LEFT JOIN을 사용해 두 테이블을 결합해 보겠습니다. LEFT JOIN은 왼쪽 테이블(ParentTable)의 모든 레코드를 기준으로 조회하며, 오른쪽 테이블(ChildTable)에 매칭되는 데이터가 없으면 NULL로 표시됩니다.

mysql> select
ParentTable.UniqueId,ParentTable.EmployeeName,ChildTable.EmployeeAddress from ParentTable left join
    -> ChildTable on ParentTable.UniqueId=ChildTable.UniqueId;

실행 결과는 다음과 같습니다.

+----------+--------------+-------------------------------------------+
| UniqueId | EmployeeName | EmployeeAddress                           |
+----------+--------------+-------------------------------------------+
|        1 | John         | 15 West Shady Lane Starkville, MS 39759   |
|        2 | Carol        | 72 West Rock Creek St. Oxford, MS 38655   |
|        3 | Sam          | NULL                                      |
|        4 | Bob          | 119 North Sierra St. Marysville, OH 43040 |
+----------+--------------+-------------------------------------------+
4 rows in set (0.00 sec)

결과 분석

출력 결과를 보면 ParentTable의 모든 직원(John, Carol, Sam, Bob)이 조회되었으며, 주소 정보가 없는 Sam의 경우 EmployeeAddress가 NULL로 표시된 것을 확인할 수 있습니다. 이것이 바로 LEFT JOIN의 핵심 특징입니다. 왼쪽 테이블의 데이터는 매칭 여부와 관계없이 모두 반환되며, 오른쪽 테이블에 일치하는 값이 없으면 해당 컬럼은 NULL로 채워집니다. 만약 INNER JOIN을 사용했다면 주소가 없는 Sam의 레코드는 결과에서 제외되었을 것입니다.