-
SQL에서 JOIN은 두 개 이상의 테이블을 연결하여 관련 데이터를 가져오는 데 사용된다.
JOIN에는 다양한 종류가 있으며, 각 유형은 데이터를 결합하는 방식이 다르다.
JOIN의 종류
- INNER JOIN
- 두 테이블에서 공통된 값이 있는 행만 반환한다.
- LEFT OUTER JOIN
- 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환한다. 일치하지 않으면 NULL로 채운다.
- RIGHT OUTER JOIN
- 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환한다. 일치하지 않으면 NULL로 채운다.
- FULL OUTER JOIN
- 두 테이블의 모든 행을 반환하며, 일치하지 않는 부분은 NULL로 채운다.
- CROSS JOIN
- 두 테이블의 모든 조합을 반환한다. (카테시안 곱)
예제
-- Customers (고객 테이블) +----+-----------+ | id | name | +----+-----------+ | 1 | Alice | | 2 | Bob | | 3 | Charlie | +----+-----------+ -- Orders (주문 테이블) +----+------------+---------+ | id | customer_id| product | +----+------------+---------+ | 1 | 1 | Laptop | | 2 | 1 | Mouse | | 3 | 2 | Keyboard| +----+------------+---------+
1) INNER JOIN
- 두 테이블에서 공통된 값이 있는 행만 반환한다.
SELECT Customers.name, Orders.product FROM Customers INNER JOIN Orders ON Customers.id = Orders.customer_id;
- 두 테이블에서 customer_id가 일치하는 데이터만 반환한다.
결과
+-------+----------+ | name | product | +-------+----------+ | Alice | Laptop | | Alice | Mouse | | Bob | Keyboard | +-------+----------+
2) LEFT OUTER JOIN
- 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환한다.
SELECT Customers.name, Orders.product FROM Customers LEFT JOIN Orders ON Customers.id = Orders.customer_id;
- 왼쪽 테이블(Customers)의 모든 행을 반환한다.
- 오른쪽 테이블(Orders)에서 일치하는 데이터가 없으면 NULL로 채운다.
결과
+---------+----------+ | name | product | +---------+----------+ | Alice | Laptop | | Alice | Mouse | | Bob | Keyboard | | Charlie | NULL | +---------+----------+
3) RIGHT OUTER JOIN
- 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환한다.
SELECT Customers.name, Orders.product FROM Customers RIGHT JOIN Orders ON Customers.id = Orders.customer_id;
- 오른쪽 테이블(Orders)의 모든 행을 반환한다.
- 왼쪽 테이블(Customers)에서 일치하지 않는 경우 NULL로 채운다.
결과
+-------+----------+ | name | product | +-------+----------+ | Alice | Laptop | | Alice | Mouse | | Bob | Keyboard | +-------+----------+
4) FULL OUTER JOIN
- 두 테이블의 모든 행을 반환하며, 일치하지 않는 부분은 NULL로 채운다.
SELECT Customers.name, Orders.product FROM Customers FULL OUTER JOIN Orders ON Customers.id = Orders.customer_id;
- 두 테이블의 모든 데이터를 반환한다.
- 일치하지 않는 경우 NULL로 채운다.
- 일부 DBMS는 FULL OUTER JOIN을 지원하지 않아 UNION으로 대체할 수도 있다.
결과
+---------+----------+ | name | product | +---------+----------+ | Alice | Laptop | | Alice | Mouse | | Bob | Keyboard | | Charlie | NULL | | NULL | NULL | -- 잘못된 데이터의 경우 NULL 표시. +---------+----------+
5) CROSS JOIN
- 두 테이블의 모든 조합을 반환한다. (카테시안 곱)
SELECT Customers.name, Orders.product FROM Customers CROSS JOIN Orders;
결과
+---------+----------+ | name | product | +---------+----------+ | Alice | Laptop | | Alice | Mouse | | Alice | Keyboard | | Bob | Laptop | | Bob | Mouse | | Bob | Keyboard | | Charlie | Laptop | | Charlie | Mouse | | Charlie | Keyboard | +---------+----------+
- 관계형 데이터베이스에서 데이터를 효율적으로 조회하고 연결할 수 있다.
- 중복 데이터를 줄이고 테이블 간 관계를 명확히 할 수 있다.
- 두 테이블의 공통된 데이터만 필요하면 INNER JOIN
- 한쪽 테이블의 모든 데이터를 포함해야 하면 LEFT JOIN 또는 RIGHT JOIN
- 두 테이블의 모든 데이터를 반환하고 싶다면 FULL OUTER JOIN
- 모든 조합이 필요하다면 CROSS JOIN
'CS > SQL' 카테고리의 다른 글
[SQLD] 관계(Relationship) (0) 2025.02.10 [SQLD] 속성(Attribute) (0) 2025.02.08 [SQLD] 엔티티(Entity) (0) 2025.02.07 [SQLD] 데이터 모델의 이해 (0) 2025.02.05 SQL, NoSQL (0) 2025.01.09 댓글
- INNER JOIN