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

MySQL에서 외래 키로 두 테이블 조인하는 방법

이 튜토리얼에서는 두 개의 테이블을 생성하고 외래 키(Foreign Key) 제약 조건으로 연결한 후, LEFT JOIN을 사용해 두 테이블을 조인하는 과정을 단계별로 살펴봅니다.

1단계: 부모 테이블(ParentTable) 생성

먼저 첫 번째 테이블을 생성합니다. 테이블 생성 쿼리는 다음과 같습니다.

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) 생성

이제 부모 테이블의 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만 입력했습니다.

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)

SELECT 문으로 자식 테이블의 모든 레코드를 확인합니다.

mysql> select *from ChildTable;

실행 결과는 다음과 같습니다. UniqueId가 3인 레코드는 주소 값이 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을 사용해 두 테이블을 조인합니다. 조인 쿼리는 다음과 같습니다.

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

실행 결과는 다음과 같습니다. 부모 테이블의 모든 행이 조회되며, 주소가 없는 Sam의 경우 NULL 값이 표시됩니다.

+----------+--------------+-------------------------------------------+
| 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)

정리

LEFT JOIN은 왼쪽 테이블(부모 테이블)의 모든 레코드를 기준으로 조회하며, 오른쪽 테이블(자식 테이블)에 매칭되는 데이터가 없으면 해당 컬럼에 NULL을 반환합니다. 반면 INNER JOIN을 사용했다면 주소가 NULL인 Sam의 레코드는 결과에서 제외됩니다. 상황에 맞는 조인 방식을 선택하는 것이 중요합니다.