안녕하세요! 오랜만에 블로그를 다시 해보려 합니다.
오늘은 MySQL의 JOIN에 대해 알아보겠습니다.
JOIN
JOIN은 여러 개의 테이블에서 데이터를 가져와서 결합하는 작업을 말합니다. JOIN에는 여러가지 종류가 있는데요 각각의 종류와 차이점에 대해 자세히 살펴보도록 하겠습니다.
JOIN의 종류
1. INNER JOIN
INNER JOIN은 두 개의 테이블에서 일치하는 행만 가져오는 JOIN입니다. INNER JOIN은 두 개의 테이블에서 공통된 값을 가지고 있는 레코드들을 조합하여 새로운 결과 테이블을 만듭니다.
예를 들어, 고객 테이블과 주문 테이블이 있다고 가정해봅시다. 각 테이블은 고객의 정보와 주문 정보를 각각 가지고 있습니다. 이때, 두 테이블에서 공통적으로 가지고 있는 값은 "고객 ID"입니다.
-- 고객 테이블 생성
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(50),
phone VARCHAR(20),
email VARCHAR(50)
);
-- 주문 테이블 생성
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
status VARCHAR(20),
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
테이블을 생성하고 임의의 데이터를 넣어보겠습니다.
INSERT INTO customers (id, name, address)
VALUES (1, 'John Doe', '123 Main St'),
(2, 'Jane Doe', '456 Oak Ave'),
(3, 'Bob Smith', '789 Elm St'),
(4, 'Sarah Lee', '123 Main St');
INSERT INTO orders (id, customer_id, item)
VALUES (1, 1, 'T-shirt'),
(2, 2, 'Hat'),
(3, 3, 'Jacket'),
(4, 1, 'Pants'),
(5, 3, 'Sunglasses');
고객 테이블
id | name | address |
1 | John Doe | 123 Main St |
2 | Jane Doe | 456 Oak Ave |
3 | Bob Smith | 789 Elm St |
4 | Sarah Lee | 123 Main St |
주문 테이블
id | customer_id | item |
1 | 1 | T-shirt |
2 | 2 | Hat |
3 | 3 | Jacket |
4 | 1 | Pants |
5 | 3 | Sunglasses |
INNER JOIN을 사용하여 두 테이블을 조인하면, 고객 ID가 일치하는 레코드들을 찾아서 새로운 결과 테이블을 생성합니다. 이 결과 테이블은 고객 정보와 해당 고객이 주문한 상품 정보를 모두 포함하고 있습니다.
INNER JOIN은 다음과 같이 적용할 수 있습니다.
SELECT customers.name, orders.item
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;
결과:
name | item |
John Doe | T-shirt |
Jane Doe | Hat |
Bob Smith | Jacket |
John Doe | Pants |
Bob Smith | Sunglasses |
예를 들어, 고객 ID가 1인 고객이 주문한 상품 정보를 찾고 싶다면, Inner join을 사용하여 고객 테이블과 주문 테이블을 조인하고, 고객 ID가 1인 레코드들을 찾아서 상품 정보를 가져올 수 있습니다.
SELECT customers.name, orders.item
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id
WHERE customers.id = 1;
name | item |
John Doe | T-shirt |
John Doe | Pants |
MySQL에서 사용되는 join 유형에는 Inner Join 외에도 Left Join, Right Join, Full Outer Join이 있습니다.
2. LEFT JOIN
LEFT JOIN은 왼쪽 테이블의 모든 행과 일치하는 오른쪽 테이블의 행을 가져옵니다. 첫 번째 테이블의 모든 레코드를 보존하고, 두 번째 테이블에서 일치하는 레코드가 없는 경우 NULL 값을 반환합니다.
만약 고객 데이터와 주문 데이터에서 LEFT JOIN을 적용하면 customers 테이블의 모든 데이터와 orders 테이블에서 일치하는 데이터를 가져오게 됩니다. 만약 orders 테이블에서 일치하는 데이터가 없는 경우에는 NULL 값으로 채워집니다.
LEFT JOIN은 다음과 같이 적용할 수 있습니다.
SELECT customers.name, orders.item
FROM customers
LEFT JOIN orders
ON customers.id = orders.customer_id;
결과:
name | item |
John Doe | T-shirt |
Jane Doe | Hat |
Bob Smith | Jacket |
John Doe | Pants |
Bob Smith | Sunglasses |
Sarah Lee | NULL |
3. RIGHT JOIN
RIGHT JOIN은 LEFT JOIN과 반대로 오른쪽 테이블의 모든 행과 일치하는 왼쪽 테이블의 행을 가져옵니다. 두 번째 테이블의 모든 레코드를 보존하고, 첫 번째 테이블에서 일치하는 레코드가 없는 경우 NULL 값을 반환합니다.
SELECT customers.name, orders.item
FROM customers
RIGHT JOIN orders
ON customers.id = orders.customer_id;
결과:
name | item |
John Doe | T-shirt |
Bob Smith | Jacket |
John Doe | Pants |
Jane Doe | Hat |
Bob Smith | Sunglasses |
4. FULL OUTER JOIN
FULL OUTER JOIN은 LEFT JOIN과 RIGHT JOIN을 합쳐놓은 것으로, 두 테이블 모두에서 일치하는 레코드와 일치하지 않는 레코드를 모두 포함하여 결과를 반환합니다. 일치하지 않는 경우에도 NULL 값을 반환합니다.
SELECT customers.name, orders.item
FROM customers
LEFT JOIN orders
ON customers.id = orders.customer_id
UNION
SELECT customers.name, orders.item
FROM customers
RIGHT JOIN orders
ON customers.id = orders.customer_id
WHERE customers.id IS NULL;
결과:
name | item |
John Doe | T-shirt |
Jane Doe | Hat |
Bob Smith | Jacket |
John Doe | Pants |
Bob Smith | Sunglasses |
Sarah Lee | NULL |
이러한 JOIN의 종류를 활용하면 데이터를 다양한 방식으로 결합할 수 있습니다. 이제 각 JOIN의 차이점에 대해 좀 더 자세히 살펴보도록 하겠습니다.
JOIN의 차이점
예를 들어, 고객 테이블과 주문 테이블이 있다면, LEFT JOIN을 사용하여 모든 고객 정보와 해당 고객이 주문한 상품 정보를 가져올 수 있습니다. 반대로, RIGHT JOIN을 사용하여 모든 주문 정보와 해당 주문을 한 고객 정보를 가져올 수 있습니다. FULL OUTER JOIN은 고객 정보와 주문 정보 모두를 가져와서 두 테이블 사이의 일치하지 않는 정보도 모두 포함합니다.
INNER JOIN은 두 개의 테이블에서 일치하는 행만 가져오기 때문에, 결과로 나오는 행의 개수는 INNER JOIN을 수행하는 두 테이블에서 공통으로 포함된 행의 개수와 동일합니다. LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN은 각각 결과로 나오는 행의 개수가 다릅니다. LEFT JOIN은 왼쪽 테이블의 모든 행을 가져오기 때문에 결과로 나오는 행의 개수는 왼쪽 테이블의 행의 개수와 같거나 더 많을 수 있습니다. RIGHT JOIN은 오른쪽 테이블의 모든 행을 가져오기 때문에 결과로 나오는 행의 개수는 오른쪽 테이블의 행의 개수와 같거나 더 많을 수 있습니다. FULL OUTER JOIN은 양쪽 테이블에서 모든 행을 가져오기 때문에 결과로 나오는 행의 개수는 양쪽 테이블의 행의 합과 같거나 더 많을 수 있습니다.
JOIN을 사용할 때, INNER JOIN이 가장 많이 사용되는데, 이는 일반적으로 조인 대상의 데이터가 많지 않아서 결과에 큰 차이가 없기 때문입니다. 그러나 JOIN 대상의 데이터가 많아질수록, JOIN의 종류에 따라서 성능이 크게 달라질 수 있으므로, 적절한 JOIN 종류를 선택하여 사용해야 합니다.
이상 MySQL JOIN의 종류와 각각의 차이점에 대해 알아보았습니다.
다음번에는 JOIN 최적화에 대해 알아보도록 하겠습니다.
'데이터 엔지니어링 > MYSQL' 카테고리의 다른 글
[MySQL] if 문으로 조건 적용하기 (0) | 2022.11.07 |
---|---|
[MySQL] 그룹별 순위 매기기 | Ranking 부여 (0) | 2022.10.20 |
[MySQL] 날짜 더하기, 빼기 (DATE_ADD, DATE_SUB 함수) (0) | 2022.10.06 |