inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

총 정리 문제 풀이 1~3번

JOIN 기준 질문

해결된 질문

152

이호재

작성한 질문수 2

0

카일님, 안녕하세요!

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

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

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

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

감사합니다!

sql bigquery 데이터-리터러시

답변 1

1

카일스쿨

장현님 안녕하세요. 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 방식이 떠오르면 해당 방식으로 수정해서 다시 진행

 

vs code

0

51

2

수업자료 다운

0

49

2

쿼리 화면 문의

0

72

2

4-5. 3번 문제 질

0

66

2

JOIN 1번 문제

1

76

2

battle 테이블 생성 시 생성 오류

0

69

1

5-6. 4번 문제 WHERE 조건의 위치 문의

0

65

2

5-6. 연습문제 4번, type2에 대해서는 고려하지 않아도 될까요?

1

71

2

battle table 오류

0

69

2

location IS NOT NULL 을 굳이 안 써도 되지 않나요?

0

62

2

12강 집계 함수

0

49

1

2-6. 연습 문제 1~3번

0

50

1

안녕하세요! 11번 문제 query문에 관해 질문드립니다

0

51

1

2-6 #2 WHERE vs. HAVING절 사용 여부 차이

0

67

1

섹션 별 퀴즈

0

67

1

espanso 설치 완료 후 프로그램 실행 문제

0

104

2

Syntax에러

0

83

2

4-5. 1번 문제 TIMESTAMP 관련 질문

0

89

2

시각화 도구 사용

0

110

2

11번 문제 GROUP BY 사용하는 이유

0

99

1

big query 쿼리 결과 컬럼 폭

0

108

3

battle 스키마 조건 복사 파일이 열리지 않아요.

0

130

1

6-5 데이터 검증 결과 예시문제

0

79

2

battle 스키마 조건 복사붙여넣기용 자료

0

115

2