본문 바로가기

DataBase

[SQL] inner join 을 써야 할 때와 left join 을 써야 할 때 / 차이


- INNER JOIN 은 양쪽 모두에 데이터가 있을 때만 -

테이블끼리 JOIN할 때는 보통 
INNER JOIN 을 많이 사용한다.
하지만 LEFT JOIN도 잘 활용할 줄 알아야 한다.

예를 들어서
주문을 하면 주문 테이블에 데이터가 생성된다.
동시에 배송 테이블에도 기본값으로 데이터가 들어가지만,
반품 테이블에는 반품을 신청했을 때에만 데이터가 생성된다.

화면에 데이터를 들고 올 때는 
주문 정보, 배송 정보, 반품 정보를 모두 들고 오고 싶다.
반품 정보가 있는지 없는지는 화면에서 처리하려고 한다.

이런 상황에서 반품 정보를 가져올 때 
INNER JOIN 을 사용해서 가져오면 제대로 들고 오지 못한다.
이미 반품을 신청하여 반품 데이터가 있을 때만 들고 오기 때문이다.

INNER JOIN 은 중심 테이블과 이어붙이는 테이블 양쪽 모두에
데이터가 있을 때만 해당 row를 가져온다.
따라서 반품 데이터가 없는 주문은 들고 오지 않는다.
즉, 반품 테이블에 데이터가 이미 존재하는 주문만 가져온다.
그래서 이미 반품을 신청한 주문만 들고 오고,
반품을 신청하지 않은 주문은 못 들고 온다.

SELECT 
	o.order_id, o.order_date, d.deli_status, r.return_status
FROM 
	tb_order o
    INNER JOIN tb_delivery d ON o.order_id = d.order_id
    INNER JOIN tb_return r ON o.order_id = r.order_id
WHERE 
	p.loginID = 'apple'




- LEFT JOIN 은 있든 없든 일단 들고 오기 -

우리는 반품 여부와 상관없이,
주문 정보를 모두 들고 오고 싶다.
대신 반품 정보가 있다면 JOIN으로 이어서 붙이고,
반품 정보가 없다면 없는 대로 가져오려고 한다.
이러한 경우에는 반품 정보를 LEFT JOIN을 해야 한다.

참고로 배송 정보는 INNER JOIN이 맞다.
주문 데이터가 생기면 반드시 배송 데이터가 생기기 때문이다.
배송 테이블에는 데이터가 있지만 주문 테이블에는 데이터가 없는 경우는 없다.

SELECT 
	o.order_id, o.order_date, d.deli_status, r.return_status
FROM 
    tb_order o
    INNER JOIN tb_delivery d ON o.order_id = d.order_id
    LEFT JOIN tb_return r ON o.order_id = r.order_id
WHERE 
	p.loginID = 'apple'



-220414

반응형