[MySQL] 조인
조인(Join)
조인이란?
조인은 관련 컬럼을 기반으로 여러 테이블의 데이터를 결합할 수 있는 기능입니다. 조인은 INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN 등이 있습니다.
INNER JOIN(내부 조인)
INNER JOIN은 두 테이블이 조인을 하기 위해 사용된 컬럼의 값이 존재하는 행만 출력됩니다.
SELECT 컬럼1, ... FROM 기준테이블 [INNER] JOIN 참조테이블 ON 조인조건
예시
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(20),
customer_age INT
);
INSERT INTO customers VALUES (1, '짱아', 1);
INSERT INTO customers VALUES (2, '짱구', 5);
INSERT INTO customers VALUES (3, '신형만', 35);
INSERT INTO customers VALUES (4, '봉미선', 29);
SELECT * FROM customers;
| customer_id | customer_name | customer_age |
|---|---|---|
| 1 | 짱아 | 1 |
| 2 | 짱구 | 5 |
| 3 | 신형만 | 35 |
| 4 | 봉미선 | 29 |
CREATE TABLE orders (
order_id INT PRIMARY KEY,
order_price INT,
customer_id INT
);
INSERT INTO orders VALUES (1, 2000, 1);
INSERT INTO orders VALUES (2, 3000, 2);
INSERT INTO orders VALUES (3, 4000, 3);
SELECT * FROM orders;
| order_id | order_price | customer_id |
|---|---|---|
| 1 | 2000 | 1 |
| 2 | 3000 | 2 |
| 3 | 4000 | 3 |
위의 두 테이블을 cutomer_id 컬럼 기반으로 내부 조인하면 다음과 같은 결과가 나옵니다.
SELECT * FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id;
-- 또는
SELECT * FROM customers JOIN orders ON customers.customer_id = orders.customer_id;
| customer_id | customer_name | customer_age | order_id | order_price | customer_id |
|---|---|---|---|---|---|
| 1 | 짱아 | 1 | 1 | 2000 | 1 |
| 2 | 짱구 | 5 | 2 | 3000 | 2 |
| 3 | 신형만 | 35 | 3 | 4000 | 3 |
조인할 때 사용하는 컬럼명이 같다면 USING 문을 사용해 중복을 줄일 수 있습니다.
SELECT * FROM customers JOIN orders USING (customer_id);
| customer_id | customer_name | customer_age | order_id | order_price |
|---|---|---|---|---|
| 1 | 짱아 | 1 | 1 | 2000 |
| 2 | 짱구 | 5 | 2 | 3000 |
| 3 | 신형만 | 35 | 3 | 4000 |
OUTER JOIN(외부 조인)
LEFT OUTER JOIN
LEFT OUTER JOIN은 조인 조건이 되는 컬럼의 값이 있는 행만 반환하는 INNER JOIN과 달리 왼쪽(기준) 테이블의 모든 행도 함께 포함됩니다. 오른쪽(참조) 테이블에 일치하는 항목이 없으면 결과에는 NULL 값이 포함됩니다.
SELECT 컬럼1, ... FROM 기준테이블 LEFT [OUTER] JOIN 참조테이블 ON 조인조건
예시에 있는 두 테이블을 왼쪽 외부 조인하면 다음과 같은 결과가 나옵니다.
SELECT * FROM customers LEFT OUTER JOIN orders ON customers.customer_id = orders.customer_id;
-- 또는
SELECT * FROM customers LEFT JOIN orders ON customers.customer_id = orders.customer_id;
| customer_id | customer_name | customer_age | order_id | order_price | customer_id |
|---|---|---|---|---|---|
| 1 | 짱아 | 1 | 1 | 2000 | 1 |
| 2 | 짱구 | 5 | 2 | 3000 | 2 |
| 3 | 신형만 | 35 | 3 | 4000 | 3 |
| 4 | 봉미선 | 29 | NULL | NULL | NULL |
RIGHT OUTER JOIN
RIGHT OUTER JOIN은 오른쪽(참조) 테이블의 모든 행이 포함됩니다.
SELECT 컬럼1, ... FROM 기준테이블 RIGHT [OUTER] JOIN 참조테이블 ON 조인조건
예시에 있는 두 테이블을 오른쪽 외부 조인하면 다음과 같은 결과가 나옵니다.
SELECT * FROM customers RIGHT OUTER JOIN orders ON customers.customer_id = orders.customer_id;
-- 또는
SELECT * FROM customers RIGHT JOIN orders ON customers.customer_id = orders.customer_id;
| customer_id | customer_name | customer_age | order_id | order_price | customer_id |
|---|---|---|---|---|---|
| 1 | 짱아 | 1 | 1 | 2000 | 1 |
| 2 | 짱구 | 5 | 2 | 3000 | 2 |
| 3 | 신형만 | 35 | 3 | 4000 | 3 |
CROSS JOIN(교차 조인)
CROSS JOIN은 두 테이블의 가능한 모든 행의 조합을 결합하는데 사용되는 조인입니다.
SELECT 컬럼1, ... FROM 기준테이블 CROSS JOIN 참조테이블;
예시의 두 테이블을 교차 조인하면 다음과 같은 결과가 나옵니다.
SELECT * FROM customers CROSS JOIN orders;
| customer_id | customer_name | customer_age | order_id | order_price | customer_id |
|---|---|---|---|---|---|
| 1 | 짱아 | 1 | 3 | 4000 | 3 |
| 1 | 짱아 | 1 | 2 | 3000 | 2 |
| 1 | 짱아 | 1 | 1 | 2000 | 1 |
| 2 | 짱구 | 5 | 3 | 4000 | 3 |
| 2 | 짱구 | 5 | 2 | 3000 | 2 |
| 2 | 짱구 | 5 | 1 | 2000 | 1 |
| 3 | 신형만 | 35 | 3 | 4000 | 3 |
| 3 | 신형만 | 35 | 2 | 3000 | 2 |
| 3 | 신형만 | 35 | 1 | 2000 | 1 |
| 4 | 봉미선 | 29 | 3 | 4000 | 3 |
| 4 | 봉미선 | 29 | 2 | 3000 | 2 |
| 4 | 봉미선 | 29 | 1 | 2000 | 1 |