MySQL JOIN

join diagram

JOIN

두 개 이상의 테이블을 연결하여 데이터를 조회하는 방법이다.1

기본 문법

SELECT 컬럼1, 컬럼2, ...
FROM 테이블1
[INNER|LEFT|RIGHT] JOIN 테이블2
ON 테이블1.컬럼 = 테이블2.컬럼;

JOIN 종류

JOIN 종류설명결과
INNER JOIN양쪽 테이블에 모두 존재하는 행만 반환교집합
LEFT JOIN왼쪽 테이블의 모든 행 + 오른쪽 매칭 행왼쪽 테이블 전체 + 오른쪽 매칭
RIGHT JOIN오른쪽 테이블의 모든 행 + 왼쪽 매칭 행오른쪽 테이블 전체 + 왼쪽 매칭
FULL OUTER JOIN양쪽 테이블의 모든 행 반환 (MySQL 미지원)합집합 (UNION으로 구현)

INNER JOIN

양쪽 테이블에 모두 존재하는 행만 반환한다.

SELECT `users`.`name`, `orders`.`product`
FROM `users`
INNER JOIN `orders` ON `users`.`id` = `orders`.`user_id`;

참고: JOIN만 쓰면 자동으로 INNER JOIN으로 처리된다.

LEFT JOIN

왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에 매칭되는 행이 없으면 NULL을 반환한다.

SELECT `users`.`name`, `orders`.`product`
FROM `users`
LEFT JOIN `orders` ON `users`.`id` = `orders`.`user_id`;

RIGHT JOIN

오른쪽 테이블의 모든 행을 반환하고, 왼쪽 테이블에 매칭되는 행이 없으면 NULL을 반환한다.

SELECT `users`.`name`, `orders`.`product`
FROM `users`
RIGHT JOIN `orders` ON `users`.`id` = `orders`.`user_id`;

FULL OUTER JOIN (UNION 사용)

MySQL은 FULL OUTER JOIN을 직접 지원하지 않으므로, LEFT JOIN과 RIGHT JOIN을 UNION으로 합쳐서 구현한다.

SELECT `users`.`name`, `orders`.`product`
FROM `users`
LEFT JOIN `orders` ON `users`.`id` = `orders`.`user_id`

UNION

SELECT `users`.`name`, `orders`.`product`
FROM `users`
RIGHT JOIN `orders` ON `users`.`id` = `orders`.`user_id`;

동작 방식:

  • 첫 번째 SELECT: LEFT JOIN으로 왼쪽 테이블 전체 + 오른쪽 매칭 행
  • 두 번째 SELECT: RIGHT JOIN으로 오른쪽 테이블 전체 + 왼쪽 매칭 행
  • UNION: 두 결과를 합치면서 중복 제거 (양쪽 모두 존재하는 행은 한 번만 포함)

참고: 중복을 허용하려면 UNION ALL을 사용할 수 있지만, FULL OUTER JOIN의 의미상 UNION을 사용하는 것이 일반적이다.

암시적 JOIN

FROM 절에 여러 테이블을 나열하고 WHERE 절로 조건을 걸어서 조인하는 방법이다. JOIN 문 없이도 조인을 수행할 수 있다.

-- 다른 테이블들 조인
SELECT `users`.`name`, `orders`.`product`
FROM `users`, `orders`
WHERE `users`.`id` = `orders`.`user_id`;