Google BigQuery

[강의 수강 12일차] Join 문

쭈경잉 2025. 6. 4. 08:17

복잡하지만 SQL의 꽃이라고 느끼는 Join 문에 대해서 학습해보고자 한다.

 

JOIN은 2개의 테이블을 공통 key 값을 통해 테이블을 우측으로 붙이는 것이다.

스프레드시트의 vlookup과 유사한 개념이며 여러 테이블을 붙일 수 있는 방법이다 

 

SQL Join

서로 다른 데이터 테이블을 연결하는 것 

공통적으로 존재하는 컬럼(=KEY)이 있다면 Join할 수 있다. 

보통 id 값을 KEY로 많이 사용하고 특정 범위(ex. DATE)로 Join도 가능하다.

 

✔️ Join이 어려운 것이라기 보다는 테이블 구조에 익숙하지 않아 어려움을 느낄 확률이 높다. 

 

➡️ 저장된 형태를 확인하고 > Join 후의 모습을 예상하고 > 쿼리 실행 하고 > 결과 보완하는 절차로 진행하면 된다!

 

✅ Join을 해야 하는 이유 - 데이터 저장되는 형태에 대한 이해

- 관계형 데이터베이스(RDBMS) 설계시 정규화 과정을 거침 

- 정규화는 중복을 최소화하게 데이터를 구조화

- User table 은 유저 데이터만, Order Table은 주문 데이터만 > 같이 한 테이블로 보고자 한다면 데이터량 기하급수적으로 증가

- 따라서 데이터를 다양한 Table로 저장한 후 필요할 때 Join 사용하는 게 효율적이다.

 

☑️ 분석 관점에서는 미리 Join 되어 있는 것이 좋을 수 있으나 개발 관점에서 분리되어 있는 것이 좋다.

대신, 데이터 웨어하우스에서 Join + 필요한 연산 후 "데이터 마트"를 만들어서 활용한다. 

(*필요에 의해 일자별, 주문 타입별 등 가공해서 진행한다.) 

 

JOIN의 종류

- (INNER)JOIN: 두 테이블의 공통 요소만 연결

- LEFT/RIGHT(OUTER)JOIN: 왼쪽/오른쪽 테이블 기준으로 연결

- FULL(OUTER)JOIN: 양쪽 기준으로 연결

- CROSSJOIN: 두 테이블의 각각의 요소를 곱하기

✔️ 처음에는 어렵다면 LEFT JOIN만 주로 사용해도 충분

 

Cross Join의 경우, 데이터 량이 기하 급수적으로 증가할 수 있다. 

 

Join을 집합 관점에서 생각하면 Inner Join은 교집합, Left/Right Join은 테이블의 순서만 변경하면 결국 같은 값,

Full Join은 합집합의 개념으로 이해하면 보다 쉽다. 

 

Join 쿼리 작성하기

1️⃣ 테이블 확인 - 테이블에 저장된 데이터, 컬럼 확인

2️⃣ 기준 테이블 정의 - 가장 많이 참고할 기준(base) 테이블 정의(Left 테이블에 활용할 테이블) 

3️⃣ Join Key 찾기 - 여러 Table과 연결할 Key(ON) 정리 

4️⃣ 결과 예상하기 - 결과 테이블을 예상해서 손, 엑셀로 작성(일종의 정답지 역할)

5️⃣ 쿼리 작성 / 검증 - 예상한 결과와 동일한 결과가 나오는 지 확인 

 

✔️ 결과를 예상하는 과정이 중요하다. 단계별로 실행하며 결과를 확인하고 이 작업을 거쳐야 원하는 결과를 얻기 쉽다. 

 

join의 경우 FROM 절 이후의 값을 정의하는 게 중요하고

별칭 활용을 통해 쿼리를 작성할 때 간결성을 높일 수 있다. 

 

Cross Join의 경우, 모든 컬럼의 교차 값을 구하는 것이므로 ON 조건이 필수가 아니다.

ON 절에서는 Join key를 연결해주는 것이 핵심 - 

 

✔️ 포켓몬, 트레이터, 포켓몬x트레이너에 있는 테이블 컬럼 합치기 위한 쿼리문

SELECT 
	--tp.id,
    --tp.trainer_id,
    --tp.pokemon_id,
    tp.*,
    --t.id AS trainer_id, #id_1 : id 라는 결과 중복이어서 조회될 때 구분을 위해 설정
    t.* EXCEPT(id), #trainer_id = tp에 있으니 그걸 활용
    p.* EXCEPT(id), #pokemon_id = t에 있으니 그걸 활용
FROM basic.trainer_pokemon AS tp
LEFT JOIN basic.trainer AS t
ON tp.trainer_id = t.id
# ON : Join KEY 기입
LEFT JOIN basic.pokemon AS p
ON tp.pokemon_id = p.id

 

JOIN을 처음 공부할 때 헷갈렸던 부분 CHECK 

1) 여러 JOIN 중 어떤 것을 사용해야 할까?

2) 어떤 Table을 왼쪽에 두고, 어떤 Table이 오른쪽에 가야할까?

3) 여러 Table을 연결할 수 있는걸까?

4) 컬럼은 모두 다 선택해야 할까?

5) NULL이 대체 뭐죠?

 

1) 여러 JOIN 중 어떤 것을 사용해야 할까?

✅ 하려고 하는 작업의 목적에 따라 JOIN을 선택해보기

- 교집합: INNER

- 모두 다 조합: CROSS

- 그게 아니라면 LEFT 또는 RIGHT: LEFT를 추천,하나를 계속 활용하는 것을 추천(*익숙해지고 기준을 이해하기 위함) 

- 쿼리 작성 템플릿에 예상하는 결과를 작성하고,중간 결과도 생각하면서 찾아보기

 

2) 어떤 Table을 왼쪽에 두고, 어떤 Table이 오른쪽에 가야할까?

✔️ LEFT 의 경우, 기준이 되는 Table을 왼쪽에 두고

기준에는 기준값이 존재하고 우측에 데이터를 추가하는 개념! 

 

ex. 주문한 유저들의 정보를 구하고 싶을 때

order / user 테이블 활용 > order 값이 기본이 되고 거기에 user 정보를 붙이는 것이므로 order 테이블 기준 / user LEFT Join 활용

 

ex. 유저 중 주문하지 않는 사람의 정보를 구하고 싶을 때

user 테이블이 기준, order 테이블을 붙인다는 개념!

 

즉, 기준이 되는 값을 왼쪽에 두고 오른쪽으로 연결한다! 는 느낌으로 생각하면 된다.

 

3) 여러 Table을 연결할 수 있는 걸까?

Join의 개수에는 한계가 없다.

그러나 너무 많이 Join하고 있는 지 확인하고 3~5개로 축약하도록 하기

 

 

4) 컬럼은 모두 다 선택해야 할까?

- 컬럼 선택은 데이터를 추출해서 무엇을 하고자?하냐에 따라 다름

- JOIN이 잘 되었나 확인하기 위해 처음엔 많은 컬럼을 선택해도 괜찮으나, 사용하지 않을 컬럼은 선택하지 않는 것이 BigQuery에서 비용을 줄일수있음

- id 같은 값은 Unique한지 확인하기 위해 자주 사용되므로 id는 자주 사용하는 편

 

5) NULL 이 대체 뭐죠?

- NULL: 값이 없음, 알 수 없음

- 0이나 공백과 다르게 값이 아예 없는것

- JOIN에선 연결할 값이 없는 경우 나타남

✏️ Join에서 NULL 값의 경우, 조인하고 나서 값이 없을 경우에 기입되는 것이다. 

 

✏️ 이번 강의와 학습을 통해 느낀점과 배운점 
✅ JOIN에서는 키값이 중요, 기준이 되는 테이블에 대한 고민이 필수적이다. 생각하는 과정을 거쳐 예측해보기!