• SQL JOIN

    2025. 1. 25.

    by. hyunji1109

    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

    '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

    댓글