JOIN 은 두 개 이상의 테이블을 묶어서 하나의 데이터로 만들어내는 기능입니다. 즉 테이블을 연결해 데이터를 조회하는 것이 JOIN 입니다. JOIN 의 종류를 하나씩 보겠습니다.
JOIN 을 하기 위해서는 각 테이블이 관계를 가져야 합니다. 그 관계의 종류는 다음과 같습니다.
이러한 관계에서 테이블끼리 JOIN 을 하기 위해선 서로의 테이블을 참조할 수 있는 키가 필요합니다. 이러한 키를 외래키 라고 합니다.
외래키를 설정하기 위해 다음과 같이 테이블을 생성합니다.
CREATE TABLE customers (
id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(50)
);
이후 customers 를 참조할 테이블을 생성합니다.
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
order_date DATE,
amount DECIMAL(8,2),
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
마지막 줄에 orders 의 customer_id 가 customers 의 id 를 참조한 것을 확인할 수 있습니다. 이제 다음과 같은 데이터들을 삽입합니다.
INSERT INTO customers (first_name, last_name, email)
VALUES ('Boy', 'George', 'george@gmail.com'),
('George', 'Michael', 'gm@gmail.com'),
('David', 'Bowie', 'david@gmail.com'),
('Blue', 'Steele', 'blue@gmail.com'),
('Bette', 'Davis', 'bette@aol.com');
INSERT INTO orders (order_date, amount, customer_id)
VALUES ('2016-02-10', 99.99, 1),
('2017-11-11', 35.50, 1),
('2014-12-12', 800.67, 2),
('2015-01-03', 12.50, 2),
('1999-04-11', 450.25, 5);
Cartesian Join라고도 하는 CROSS JOIN 은 모든 행에대해 조인을 수행하는 연산입니다. 즉 N개의 행을 가진 테이블과 M 개의 행을 가진 테이블이 있으면, 이 행들에 대해 모두 조인을 합니다.
SELECT * FROM customers, orders;
위 결과는 다음과 같습니다.

결과를 보면 id 가 같지 않아도 모든 행들에 대해 Join 연산이 수행된 것을 확인할 수 있습니다.
INNER JOIN 은 양쪽 모두의 테이블의 키와 매칭되는 데이터를 출력합니다. 즉 두 테이블에서 교집합인 부분이 출력된다고 생각하면 됩니다.
SELECT *
FROM customers c
JOIN orders o ON c.id = o.customer_id;
위 코드의 결과는 다음과 같습니다.

위 사진을 보시면 id가 같은 데이터들끼리 Join 이 된 것을 확인할 수 있습니다.
LEFT JOIN 은 기준이 되는 테이블을 왼쪽을 중심으로 오른쪽 테이블을 매치시킵니다.
SELECT c.first_name, c.last_name, o.order_date, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
여기서 FROM 절에 위치한 테이블이 LEFT 테이블이 됩니다.
위 코드의 결과는 다음과 같습니다.

RIGHT JOIN은 LEFT JOIN과 반대로 JOIN 절에 위치한 테이블이 기준이 되는 연산입니다.
SELECT c.first_name, c.last_name, o.order_date, o.amount
FROM orders o
RIGHT JOIN customers c ON o.customer_id = c.id;
위 코드의 결과는 다음과 같습니다.
