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

 

 

출처: https://coding-factory.tistory.com/87#google_vignette