JOIN 기준 질문
카일님, 안녕하세요!
LEFT JOIN 기준이 헷갈려 이에 대한 질문 드립니다.
LEFT JOIN 시 테이블의 데이터가 더 많은 테이블을 제일 왼쪽으로 두면 된다고 이해하면 될까요?
또한, 예외도 있다고 하셨는데, 어떤 경우인지도 알 수 있을까요?
마지막으로 LEFT말고 다른 JOIN할 때도 테이블의 데이터가 더 많은 테이블을 기준으로 잡아도 괜찮나요?
감사합니다!
답변 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가 많은 것을 왼쪽으로는 일반적으로 주문 데이터가 고객 데이터보다 많을 수 있으므로, 주문 데이터를 왼쪽으로 두고 우측에 고객 데이터를 붙이면 주문에 대해 분석을 할 수 있을거에요.
만약 고객 데이터를 분석하고 싶다면(어떤 고객은 주문을 했고, 어떤 고객은 하지 않았는지) 고객 데이터를 왼쪽으로 두어야 할거에요.
예외가 있다고 말씀드린 이유는 이런 목적이 다양할 수 있기에 그렇게 말씀드렸어요.
정리하면
데이터를 어떤 목적으로 분석할지에 대해 생각해봐야 함 : 데이터 분석에선 목적이 제일 중요합니다
데이터를 목적 기반으로 분석한다는 내용은 PM을 위한 데이터 리터러시 강의에서 상세하게 다루고 있어요
그 목적에 따라 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





