SQL에서 조인은 데이터베이스에서 여러 테이블을 결합해 데이터를 조회할 때 매우 유용한 도구다.
MySQL에서의 조인의 기본 개념과 사용법에 대해 알아보고자 한다.
JOIN
조인(Join)은 두 개 이상의 테이블을 결합해 하나의 결과 집합을 만드는 SQL 연산이다.
조인은 주로 테이블 간의 관계를 정의하고, 그 관계에 기반해 데이터를 조회할 때 사용된다.
MySQL에서 자주 사용되는 조인은 크게 네 가지로 나눌 수 있다.
INNER JOIN | 일치하는 데이터만 필요할 때 |
LEFT JOIN | 왼쪽 테이블의 모든 데이터를 포함할 때 |
RIGHT JOIN | 오른쪽 테이블의 모든 데이터를 포함할 때 |
FULL OUTER JOIN | 두 테이블의 모든 데이터를 포함할 때 |
INNER JOIN
INNER JOIN은 두 테이블간의 교집합을 반환한다.
즉, 조인 조건에 맞는 행만 반환한다. 일반적으로 가장 많이 사용되는 JOIN이다.
두 테이블에서 관련된 데이터만 필요할 때 (ex. 주문 내역이 있는 고객의 정보를 조회할 때) 사용된다.
SELECT customers.name,
orders.order_id
FROM customers
JOIN orders
ON customers.customer_id = orders.customer_id;
위 쿼리는 주문 내역이 있는 고객의 이름과 주문 ID를 반환한다.
주문이 있는 고객만 결과에 포함된다.
LEFT JOIN
LEFT JOIN은 왼쪽 테이블의 모든 행을 반환하며, 오른쪽 테이블과 일치하는 행이 없으면 NULL을 반환한다.
왼쪽 테이블의 모든 데이터를 유지하면서, 오른쪽 테이블에서 일치하는 데이터가 있는 경우 해당 데이터를 함께 조회하는 경우에 사용된다. (ex. 모든 고객의 정보를 조회하면서 주문이 없는 고객도 포함일 때)
SELECT customers.name,
orders.order_id
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id;
위 쿼리는 모든 고객의 이름과 주문 ID를 반환한다. 만약 주문이 없는 고객이라면,
order_id 컬럼은 NULL로 표시된다.
RIGHT JOIN
RIGHT JOIN은 LEFT JOIN의 반대로, 오른쪽 테이블의 모든 행을 반환하며 왼쪽 테이블과 일치하는 행이 없으면 NULL을 반환한다.
오른쪽 테이블의 모든 데이터를 유지하면서, 왼쪽 테이블에서 일치하는 데이터가 있는 경우 해당 데이터를 함께 조회하는 경우에 사용된다. (ex. 주문 내역과 해당 주문을 한 고객의 정보를 조회할 때, 주문이 있는 모든 내역이 반드시 포함되도록 할 때)
SELECT customers.name,
orders.order_id
FROM customers
RIGHT JOIN orders
ON customers.customer_id = orders.customer_id;
위 쿼리는 모든 주문의 ID와 해당하는 고백의 이름을 반환한다.
만약 고객 정보가 없는 주문이라면 name 컬럼은 NULL로 표시된다.
FULL OUTER JOIN
FULL OUTER JOIN은 두 테이블의 모든 데이터를 반환하며, 일치하지 않는 경우 NULL을 반환한다.
MySQL에서는 FULL OUTER JOIN을 직접적으로 지원하지 않지만, LEFT JOIN과 RIGHT JOIN을 UNION으로 결합해 같은 효과를 얻을 수 있다.
두 테이블의 모든 데이터를 포함하되, 일치하지 않는 데이터도 함께 포함해야 할 경우에 사용된다. (ex. 고객과 주문 내역을 모두 조회하면서, 양쪽 테이블의 일치하지 않는 데이터도 포함하고 싶을 때)
SELECT customers.name,
orders.order_id
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id
UNION
SELECT customers.name,
orders.order_id
FROM customers
RIGHT JOIN orders
ON customers.customer_id = orders.customer_id;
'💾 Data > SQL' 카테고리의 다른 글
[MySQL] EXISTS (0) | 2024.09.11 |
---|---|
[MySQL] PERCENT_RANK() (0) | 2024.09.04 |
[MySQL] SQL 변수 선언 및 사용 (0) | 2024.08.06 |
[MySQL] DB 테이블 row 수 확인 (0) | 2024.04.23 |
[SQL] USING (0) | 2024.03.18 |