MySQL의 SELECT 문은 기본적으로 한 번에 하나의 테이블에서만 데이터를 조회할 수 있습니다. 하지만 실제 데이터베이스 환경에서는 하나의 테이블만으로 모든 질문에 답할 수 없는 경우가 많습니다. 이처럼 여러 테이블에 저장된 정보를 함께 활용해야 할 때 필요한 것이 바로 조인(Join) 연산입니다.
MySQL 조인의 기본 개념
MySQL 조인은 두 개 이상의 테이블을 공통 컬럼의 값을 기준으로 연결하여, 그 결과를 새로운 임시 테이블 형태로 만들어주는 방법입니다. 다르게 표현하면, 논리적으로 서로 관련된 두 개 이상의 테이블에서 레코드를 조회해 하나의 임시 테이블로 결합하는 기능이라고 할 수 있습니다.
조인으로 생성되는 임시 테이블은 참여하는 두 테이블이 공유하는 컬럼을 기준으로 만들어지며, 이 컬럼은 의미 있는 비교 기준이 됩니다. 일반적으로 양쪽 테이블에서 동일한 이름과 데이터 타입을 가진 컬럼이 사용되며, 이러한 컬럼을 조인 키(join key) 또는 공통 키(common key)라고 부릅니다.
MySQL이 지원하는 조인의 종류
MySQL은 크게 네 가지 유형의 조인을 지원합니다. 각각의 특징과 예제를 통해 자세히 살펴보겠습니다.
1. 크로스 조인(Cross Join)
크로스 조인은 조인의 가장 기본적인 형태입니다. 두 테이블을 크로스 조인하면 첫 번째 테이블의 각 행이 두 번째 테이블의 모든 행과 결합됩니다. 따라서 테이블1에 3개의 행, 테이블2에 2개의 행이 있다면 결과는 3 × 2 = 6개의 행이 됩니다. 이를 카테시안 곱(Cartesian Product)이라고도 합니다.
다음 예제는 각각 4개의 행을 가진 tbl_1과 tbl_2 테이블입니다.
mysql> Select * from tbl_1; +----+--------+ | Id | Name | +----+--------+ | 1 | Gaurav | | 2 | Rahul | | 3 | Raman | | 4 | Aarav | +----+--------+ 4 rows in set (0.00 sec) mysql> Select * from tbl_2; +----+---------+ | Id | Name | +----+---------+ | A | Aarav | | B | Mohan | | C | Jai | | D | Harshit | +----+---------+ 4 rows in set (0.00 sec)
아래 쿼리를 실행하면 두 테이블 간의 CROSS JOIN이 수행됩니다.
mysql> Select tbl_1.id, tbl_2.id FROM tbl_1 CROSS JOIN tbl_2; +----+----+ | id | id | +----+----+ | 1 | A | | 2 | A | | 3 | A | | 4 | A | | 1 | B | | 2 | B | | 3 | B | | 4 | B | | 1 | C | | 2 | C | | 3 | C | | 4 | C | | 1 | D | | 2 | D | | 3 | D | | 4 | D | +----+----+ 16 rows in set (0.00 sec)
4개 행과 4개 행이 결합되어 총 16개의 행이 반환된 것을 확인할 수 있습니다.
2. 내부 조인(Inner Join) 또는 동등 조인(Equi Join)
내부 조인을 수행하려면 조인 술어(join-predicate)라고 불리는 특정 조건을 지정해야 합니다. 내부 조인은 조인되는 두 테이블에서 조건에 맞는 컬럼 값을 가진 행들만 매칭하여 반환합니다.
다음 쿼리는 tbl_1과 tbl_2를 name 컬럼을 기준으로 내부 조인하는 예제입니다.
mysql> SELECT tbl_1.id,tbl_2.id FROM tbl_1 INNER JOIN tbl_2 ON tbl_1.name = tbl_2.name; +----+----+ | id | id | +----+----+ | 4 | A | +----+----+ 1 row in set (0.00 sec)
결과 집합을 보면 tbl_1의 id = 4 행과 tbl_2의 id = 'A' 행이 name 컬럼에서 같은 값('Aarav')을 가지므로 매칭되어 반환되었습니다.
3. 왼쪽 조인(Left Join)
왼쪽 조인 역시 내부 조인과 마찬가지로 조인 술어가 필요합니다. 차이점은 LEFT JOIN으로 두 테이블을 결합할 때 왼쪽 테이블과 오른쪽 테이블이라는 개념이 도입된다는 점입니다. 왼쪽 조인은 조인 술어를 만족하는 행뿐만 아니라 만족하지 않는 행까지 포함하여 왼쪽 테이블의 모든 행을 반환합니다. 조인 조건에 맞지 않는 행의 경우, 결과 집합에서 오른쪽 테이블에 해당하는 컬럼에는 NULL이 표시됩니다.
다음 쿼리는 tbl_1과 tbl_2를 대상으로 LEFT JOIN을 수행한 예제입니다.
mysql> SELECT tbl_1.id,tbl_2.id FROM tbl_1 LEFT JOIN tbl_2 ON tbl_1.name = tbl_2.name; +----+------+ | id | id | +----+------+ | 1 | NULL | | 2 | NULL | | 3 | NULL | | 4 | A | +----+------+ 4 rows in set (0.02 sec)
tbl_1의 모든 행(id 1~4)이 반환되었으며, name이 매칭되지 않는 행들은 오른쪽 컬럼에 NULL이 출력된 것을 볼 수 있습니다.
4. 오른쪽 조인(Right Join)
오른쪽 조인은 왼쪽 조인과 유사하지만 테이블을 처리하는 방향이 반대입니다. RIGHT JOIN을 사용하면 오른쪽 테이블의 모든 행이 결과 집합에 나타나며, 왼쪽 테이블에 매칭되는 행이 없는 경우 왼쪽 테이블에 해당하는 컬럼에는 NULL이 표시됩니다.
다음 쿼리는 tbl_1과 tbl_2를 대상으로 RIGHT JOIN을 수행한 예제입니다.
mysql> SELECT tbl_1.id,tbl_2.id -> FROM tbl_1 RIGHT JOIN tbl_2 ON tbl_1.name = tbl_2.name; +------+----+ | id | id | +------+----+ | 4 | A | | NULL | B | | NULL | C | | NULL | D | +------+----+ 4 rows in set (0.00 sec)
tbl_2의 모든 행(A~D)이 반환되었고, 왼쪽 테이블에서 매칭되지 않는 행들은 NULL로 표시되었습니다.
정리
MySQL 조인은 여러 테이블에 흩어져 있는 데이터를 하나로 결합해 조회할 수 있게 해주는 핵심 기능입니다. 용도에 따라 적절한 조인 유형을 선택하는 것이 중요합니다.
- CROSS JOIN: 두 테이블의 모든 행 조합(카테시안 곱)이 필요할 때
- INNER JOIN: 양쪽 테이블에서 조건에 맞는 행만 필요할 때
- LEFT JOIN: 왼쪽 테이블의 전체 행을 기준으로 조회할 때
- RIGHT JOIN: 오른쪽 테이블의 전체 행을 기준으로 조회할 때