인프런 커뮤니티 질문&답변

임장현님의 프로필 이미지

작성한 질문수

초보자를 위한 BigQuery(SQL) 입문

총 정리 문제 풀이 1~3번

JOIN 기준 질문

해결된 질문

24.07.30 13:25 작성

·

77

0

카일님, 안녕하세요!

LEFT JOIN 기준이 헷갈려 이에 대한 질문 드립니다.

LEFT JOIN 시 테이블의 데이터가 더 많은 테이블을 제일 왼쪽으로 두면 된다고 이해하면 될까요?

또한, 예외도 있다고 하셨는데, 어떤 경우인지도 알 수 있을까요?

마지막으로 LEFT말고 다른 JOIN할 때도 테이블의 데이터가 더 많은 테이블을 기준으로 잡아도 괜찮나요?

감사합니다!

답변 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가 많은 것을 왼쪽으로는 일반적으로 주문 데이터가 고객 데이터보다 많을 수 있으므로, 주문 데이터를 왼쪽으로 두고 우측에 고객 데이터를 붙이면 주문에 대해 분석을 할 수 있을거에요.

만약 고객 데이터를 분석하고 싶다면(어떤 고객은 주문을 했고, 어떤 고객은 하지 않았는지) 고객 데이터를 왼쪽으로 두어야 할거에요.

 

예외가 있다고 말씀드린 이유는 이런 목적이 다양할 수 있기에 그렇게 말씀드렸어요.

 

정리하면

  • 데이터를 어떤 목적으로 분석할지에 대해 생각해봐야 함 : 데이터 분석에선 목적이 제일 중요합니다

  • 그 목적에 따라 LEFT, RIGHT가 결정

  • 만약 이 기준이 아직 없다면 Row가 많은 것을 기준으로 먼저 시도

    • 데이터를 확인하고, 그 후에 더 맞는 JOIN 방식이 떠오르면 해당 방식으로 수정해서 다시 진행