해결된 질문
24.07.30 13:25 작성
·
77
답변 1
1
2024. 07. 30. 13:55
장현님 안녕하세요. SQL을 작성할 때 절대적인 법칙이 있다고 생각하는 것보다 상황에 따라 유연하게 접근하는 것이 좋습니다.
LEFT JOIN은 왼쪽 테이블의 모든 행을 유지하고 오른쪽 테이블에서 매칭되는 행을 가지고 옵니다. 왼쪽의 행이 더 많은 것을 선호하는 것은 메모리 사용 효율성 관점에서 왼쪽 테이블이 더 크면 더 많은 데이터를 메모리에 유지할 수 있습니다(DB에 따라 살짝 다를 수는 있어요)
2가지 테이블이 있다고 가정하고(Customers, Orders) 설명드리면
Customers
id | name
---+----------
1 | alice
2 | bob
3 | charlie
4 | david
5 | eve
Orders
order_id| customer_id | product
--------+-------------+---------
101 | 1 | laptop
102 | 2 | phone
103 | 2 | tablet
104 | 3 | mouse
105 | 6 | keyboard
Customers를 왼쪽으로 두고 LEFT JOIN을 할 경우
SELECT
c.id,
c.name,
o.id AS order_id,
o.product
FROM customers AS c
LEFT JOIN orders AS o
ON c.id = o.customer_id
이 쿼리를 실행하면
id | name | order_id| product
---+---------+---------+---------
1 | alice | 101 | laptop
2 | bob | 102 | phone
2 | bob | 103 | tablet
3 | charlie | 104 | mouse
4 | david | NULL | NULL
5 | eve | NULL | NULL
orders를 LEFT로 두고 LEFT JOIN을 하면
SELECT
o.id,
o.customer_id,
c.name,
o.product
FROM orders AS o
LEFT JOIN customers AS c
ON o.customer_id = c.id
order_id| customer_id | name | product
--------+-------------+---------+---------
101 | 1 | alice | laptop
102 | 2 | bob | phone
103 | 2 | bob | tablet
104 | 3 | charlie | mouse
105 | 6 | NULL | keyboard
이런 결과가 나옵니다.
customers를 왼쪽에 둔 경우엔 모든 고객 정보가 유지되면서, 주문이 없는 고객도 나오게 됩니다
orders를 왼쪽에 둔 경우엔 모든 주문 정보가 유지되며, 주문이 없는 고객의 결과는 나오지 않게 됩니다.
즉, 데이터를 어떻게 바라볼지, 목적에 따라서 왼쪽/오른쪽을 선택하면 됩니다. 만약 그 기준이 아직 없는 경우엔 Row가 많은 것을 왼쪽으로 두면서 데이터를 확인하고 다시 어디를 기준으로 파악해보면 됩니다.
Row가 많은 것을 왼쪽으로는 일반적으로 주문 데이터가 고객 데이터보다 많을 수 있으므로, 주문 데이터를 왼쪽으로 두고 우측에 고객 데이터를 붙이면 주문에 대해 분석을 할 수 있을거에요.
만약 고객 데이터를 분석하고 싶다면(어떤 고객은 주문을 했고, 어떤 고객은 하지 않았는지) 고객 데이터를 왼쪽으로 두어야 할거에요.
예외가 있다고 말씀드린 이유는 이런 목적이 다양할 수 있기에 그렇게 말씀드렸어요.
정리하면
데이터를 어떤 목적으로 분석할지에 대해 생각해봐야 함 : 데이터 분석에선 목적이 제일 중요합니다
데이터를 목적 기반으로 분석한다는 내용은 PM을 위한 데이터 리터러시 강의에서 상세하게 다루고 있어요
그 목적에 따라 LEFT, RIGHT가 결정
만약 이 기준이 아직 없다면 Row가 많은 것을 기준으로 먼저 시도
데이터를 확인하고, 그 후에 더 맞는 JOIN 방식이 떠오르면 해당 방식으로 수정해서 다시 진행