CS/SQL
SQL JOIN
hyunji1109
2025. 1. 25. 14:52
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