조인은 두 개 이상의 테이블을 서로 연결하여 의미 있는 결과를 얻기 위한 기술이다. 실무에서 거의 모든 복잡한 쿼리에서 사용된다.
여러 개의 테이블에서 데이터를 연결하여, 공통된 컬럼을 기준으로 통합된 결과를 조회하는 기능이다.
예를 들어 users테이블과 orders테이블을 사용자 ID로 연결하여 사용자 정보 + 주문 정보를 함께 보고 싶을 때 사용한다
| 종류 | 설명 | 기준 |
|---|---|---|
INNER JOIN | 공통된 값이 있는 행만 반환 | 두 테이블에 모두 존재하는 값 |
LEFT JOIN (또는 LEFT OUTER) | 왼쪽 테이블의 모든 행 + 일치하면 오른쪽도 | 왼쪽 기준 |
RIGHT JOIN (또는 RIGHT OUTER) | 오른쪽 테이블의 모든 행 + 일치하면 왼쪽도 | 오른쪽 기준 |
FULL OUTER JOIN | 양쪽 모두 포함 (MySQL은 직접 지원 X) | 양쪽 모두 |
CROSS JOIN | 두 테이블의 모든 조합 | 카르테시안 곱 |
-- 사용자 테이블
CREATE TABLE users
(
id INT PRIMARY KEY,
username VARCHAR(50)
);
-- 주문 테이블
CREATE TABLE orders
(
id INT PRIMARY KEY,
user_id INT,
product VARCHAR(100),
FOREIGN KEY (user_id) REFERENCES users (id)
);
-- 샘플 데이터
INSERT INTO users
VALUES (1, 'kim'),
(2, 'lee'),
(3, 'park');
INSERT INTO orders
VALUES (101, 1, 'apple'),
(102, 2, 'pineapple');
양쪽에 모두 존재하는 행만 반환한다.
SELECT users.username, orders.product
FROM users
INNER JOIN orders ON users.id = orders.user_id;
| username | product |
|---|---|
| kim | apple |
| lee | pineapple |
park은 주문이 없기에 제외됨.
왼쪽 테이블의 모든 행과 일치하는 오른쪽
SELECT users.username, orders.product
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
| username | product |
|---|---|
| kim | apple |
| lee | pineapple |
| park | NULL |
park도 포함되지만, 주문이 없기에 NULL.
오른쪽 테이블의 모든 행 + 일치하는 왼쪽
SELECT users.username, orders.product
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
| username | product |
|---|---|
| kim | apple |
| lee | pineapple |
여기에서 orders에 없는 user_id가 있으므로 INNER JOIN과 결과가 같다.
MySQL은 FULL OUTER JOIN을 지원하지 않지먼, UNION으로 흉내낼 수 있다.
-- FULL OUTER JOIN 흉내내기
SELECT users.username, orders.product
FROM users
LEFT JOIN orders ON users.id = orders.user_id
UNION
SELECT users.username, orders.product
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
두 테이블의 모든 조합(곱집합)
SELECT users.username, orders.product
FROM users
CROSS JOIN orders;
| username | product |
|---|---|
| kim | apple |
| kim | pineapple |
| lee | apple |
| lee | pineapple |
| park | apple |
| park | pineapple |
실무에서는 거의 사용하지 않으며, 더미 데이터를 만드는 등 특수한 경우에서만 사용한다.
SELECT u.username, o.product
FROM users u,
orders o
WHERE u.id = o.user_id;
INNER JOIN과 같다.