본문 바로가기
SQL

[SQL] 데이터분석가 입문 필수 SQL 부트캠프 (6) JOIN - INNER JOIN, OUTER JOIN, FULL OUTER JOIN

by 모닥불🔥 2024. 3. 16.

강의는 메타코드에서 구매 가능하다: https://mcode.co.kr/kor/

이번 주말은 본가에 와서 평소보다 자료를 많이 넣진 못하겠지만... 그래도 매주 규칙적으로 글을 써야지! 공부가 되지. SQL 입문 부트캠프 덕에 이번 sqld 시험도 잘 친 것 같고, 프로그래머스 사이트에서 SQL 문제들을 풀어 나갈 수 있어서 나에게는 여러모로 감사한 강의이다. 오늘은 대망의 JOIN 차례. JOIN은 이해하기가 어찌 보면 쉽고, 어찌보면 어렵다. 나는 공간감각이 없는 편이라 테이블을 가져 와서 옆에다가 붙인다는 것을 감 잡고 이해하기 시간이 꽤 걸렸다. ㅠㅠ


🔥 JOIN

JOIN은 두 테이블을 결합하기 위해 사용한다.
강의에서 알려준 예시는 아니지만 예를 들어서, 아래와 같이 제품 테이블 - 주문 테이블 - 고객 테이블이 있다고 하자.

 
위 테이블에서 '홍길동'이라는 고객이 어떤 제품을 시켰는지 알고 싶다면, 고객 테이블에서 홍길동의 고객 코드가 A인 것을 확인하고, 주문 테이블에서 고객코드 A가 주문한 제품의 코드를 확인한다(001). 그리고 제품코드 001은 어떤 제품인지(연필) 볼 것이다. 즉, 한 테이블 내에서 모든 정보를 얻을 수 없다면 테이블 간에 연결이 되어 있어야 한다.
테이블을 붙여주는 것이 JOIN이다.

# JOIN의 기본 구문

SELECT *
FROM TABLE1 A
JOIN TABLE2 B
ON A.ID = B.ID;

 
JOIN의 종류는 등가 조인과 비등가 조인이 있다.
등가 조인은 같은 부분을 결합한다는 의미로, INNER JOIN, NATURE JOIN이 대표적이다.
비등가 조인은 OUTER JOIN을 들 수 있다. LEFT JOIN과 RIGHT JOIN, 둘을 합친 FULL OUTER JOIN으로 나뉜다.

SELECT *
FROM EX3
JOIN EX4
ON EX3.ID = EX4.ID;

INNER JOIN은 위 그림과 같이 테이블 2개를 조인할 때 '동일한/겹치는' 값만 불러온다.위 예시에서는 EX3에도 ID라는 컬럼이 있고 EX4에도 ID라는 컬럼이 있다. 두 ID 컬럼 값이 1, 2, 3 / 1, 2, 3으로 같다면 세 행을 모두 가져온다. 만약 ID컬럼의 값들이 1, 4, 3 / 1, 2,3 이런 식으로 다르다면, 값이 같은 1과 1, 3과 3만 조인하고(연결하고) 나머지 겹치지 않는 행(4, 2)은 없어진다.
 
고객 정보 테이블이랑 주소 테이블을 ID 기준으로 합친다고 가정해 보자. ID가 완전히 동일한, 즉 고객 정보 테이블에도 존재하고 주소 테이블에도 존재하는 데이터를 연결하는 것이 INNER JOIN이다.

그런데 주소 테이블에 값이 없더라도 고객 테이블에 있는 목록은 전부 불러오고 싶다면 어떻게 할까?

SELECT *
FROM EX3
LEFT JOIN EX4
ON EX3.ID = EX4.ID;

한쪽 테이블은 온전히 둔 상태로 다른 테이블 정보를 가져 오고 싶다면 OUTER JOIN을 쓰면 된다.

LEFT OUTER JOIN은 왼쪽 테이블을 그대로 두고 오른쪽 테이블의 정보를 붙여 넣는 것이다. .EX3의 NAME이 A, B, C, F / EX4의 NAME이 A, C, B, D 라면 왼쪽 테이블 EX3에 있는 행 A, B, C, F만 놔두고 EX4의 D는 사라진다. INNER JOIN이었으면 EX3의 F도 함께 사라졌겠지만 LEFT OUTER JOIN을 하면 왼쪽 테이블은 원래 형태를 유지한다. F행의 경우 오른쪽 테이블에서 가져올 정보가 없어 NULL이 채워진다.

SELECT *
FROM EX3
LEFT JOIN EX4
ON EX3.ID = EX4.ID
WHERE EX4.ID IS NULL;

조건을 더 붙여서 겹치는 부분만 제외하는 방법도 있다. EX4.ID가 NULL인 경우란 왼쪽 테이블에는 값이 있는데 오른쪽 테이블에는 없는 경우 NULL이 나오므로 EX3 중 EX4와 겹치는 부분을 제외한 영역만 출력한다.
 

FULL OUTER JOIN은 우리가 생각하는 합집합이다.

SELECT ex3.id, ex3.name, ex3.age, ex4.id, ex4.region
FROM ex3
LEFT JOIN ex4
ON ex3.id = ex4.id

UNION

SELECT ex3.id, ex3.name, ex3.age, ex4.id, ex4.region
FROM ex3
RIGHT JOIN ex4
ON ex3.id = ex4.id
WHERE ex3.id IS NULL;

위쪽 코드는 LEFT JOIN 하여, ex3을 전부 두고 ex4 부분은 제외되어 있다. 아래쪽 코드는 RIGHT JOIN하고, 교집합 부분을 제외해서 ex4에만 있는 내용을 불러온다. 이걸 UNION으로 합해주면 완전한 데이터의 합이 된다.
 
내가 봐도 내 정리가 어렵다. 혹시 설명이 너무 어렵다면 강의를 참고하길..ㅠ

그 외에도 NATURE JOIN과 CROSS JOIN이 있다. NATURE JOIN은 ON 뒤에 조건문을 쓰지 않고, 그냥 컴퓨터가 알아서 똑같은 열끼리 합쳐준다. 대신 열 두개가 동일해야 한다. CROSS JOIN은 컬럼의 데이터 수가 곱하기 되어(카테시안 곱) 모든 경우가 다 출력된다.
실무에서는 별로 쓰이지 않는지 가르쳐 주시진 않았다.