
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`;