Table Join

Ryan·2025년 1월 15일

SQL/Python 분석

목록 보기
54/94

1. JOIN이란?

  • JOIN은 말 그대로 “결합”이라는 의미이며, 두 개 이상의 테이블을 합쳐 하나의 결과로 만드는 것을 말합니다.
  • 하나의 테이블만으로는 부족한 정보(예: 주문 테이블 + 고객 정보 테이블)를 연결해서 볼 때 주로 사용됩니다.
  • 대표적인 JOIN 유형:
    • INNER JOIN
    • LEFT JOIN
    • RIGHT JOIN
    • FULL OUTER JOIN
    • (MySQL은 FULL OUTER JOIN을 직접 지원하지 않지만 UNION을 통해 구현 가능)
    • CROSS JOIN (Cartesian product, 데카르트 곱)

2. INNER JOIN

INNER JOIN 다이어그램
  • INNER JOIN양쪽 테이블에 공통된 조건(매칭되는 값)이 있는 행만 조회
  • 가장 흔히 사용되며, 보통 JOIN이라고만 써도 INNER JOIN을 의미할 때가 많습니다.
  • 예시:
sql
코드 복사
SELECT A.*, B.*
FROM TableA A
INNER JOIN TableB B ON A.key = B.key;
  • A.key = B.key로 양쪽 테이블의 key가 일치하는 레코드만 결과로 반환

3. LEFT JOIN

LEFT JOIN 다이어그램
  • LEFT JOIN(또는 LEFT OUTER JOIN)은 왼쪽 테이블(A)에 있는 모든 행은 무조건 가져오고,오른쪽 테이블(B)에 매칭되는 값이 있으면 해당 컬럼을 채워주고, 만약 매칭되는 값이 없으면 NULL로 표시
  • 예시:
sql
코드 복사
SELECT A.*, B.*
FROM TableA A
LEFT JOIN TableB B ON A.key = B.key;
  • TableA에 존재하나 TableB에 해당 key가 없으면, B.* 부분은 NULL이 됩니다.

4. RIGHT JOIN

RIGHT JOIN 다이어그램
  • RIGHT JOIN(또는 RIGHT OUTER JOIN)은 오른쪽 테이블(B)에 있는 모든 행은 무조건 가져오고,왼쪽 테이블(A)에 매칭되는 값이 없으면 NULL 처리
  • 예시:
sql
코드 복사
SELECT A.*, B.*
FROM TableA A
RIGHT JOIN TableB B ON A.key = B.key;
  • TableB에 존재하나 TableA에 해당 key가 없으면, A.* 부분은 NULL이 됩니다.
  • LEFT JOIN과는 반대되는 개념이지만, 실제로는 LEFT JOIN이 훨씬 자주 쓰입니다.

5. FULL OUTER JOIN

FULL OUTER JOIN 다이어그램
  • FULL OUTER JOIN양쪽 테이블(A, B) 어느 한쪽에만 존재하는 행도 모두 가져오는 JOIN 방식
  • 결과적으로 INNER JOIN + LEFT ONLY + RIGHT ONLY까지 모두 포함된 형태
  • MySQL에서는 기본적으로 FULL OUTER JOIN을 지원하지 않아, 다음과 같이 LEFT JOIN과 RIGHT JOIN을 UNION해서 사용합니다.
sql
코드 복사
-- MySQL에서 FULL OUTER JOIN을 대체하는 예시
SELECT A.*, B.*
FROM TableA A
LEFT JOIN TableB B ON A.key = B.key
UNION
SELECT A.*, B.*
FROM TableA A
RIGHT JOIN TableB B ON A.key = B.key;
  • 다른 DBMS(Oracle, PostgreSQL, MS SQL Server 등)에서는 FULL OUTER JOIN 구문을 지원하기도 합니다.

6. CROSS JOIN (Cartesian Join)

CROSS JOIN 다이어그램
  • CROSS JOIN조건 없이 모든 레코드를 서로 곱(Cartesian product)하는 방식
  • A 테이블에 4개 행, B 테이블에 3개 행이 있으면 결과는 4 x 3 = 12개 행
  • 예시:
sql
코드 복사
SELECT A.*, B.*
FROM TableA A
CROSS JOIN TableB B;
  • 보통 의도적으로 사용되는 경우는 많지 않고, 실수로 조인 조건을 적지 않았을 때 엄청난 수의 결과셋이 나올 수 있으니 주의가 필요합니다.

7. 간단 비교 요약

  1. INNER JOIN: 두 테이블에서 매칭되는 행만 반환
  2. LEFT JOIN: 왼쪽 테이블의 모든 행 + 오른쪽 테이블의 매칭된 행
  3. RIGHT JOIN: 오른쪽 테이블의 모든 행 + 왼쪽 테이블의 매칭된 행
  4. FULL OUTER JOIN: 양쪽 테이블에 있는 모든 행 (매칭 안 된 것도 포함)
  5. CROSS JOIN: 조건 없이 모든 행을 곱 (Cartesian product)
JOIN 유형포함 범위MySQL 지원 여부
INNER JOINA와 B 모두 매칭되는 행만O
LEFT JOINA 전체 + B 매칭O
RIGHT JOINB 전체 + A 매칭O
FULL OUTER JOINA + B 전체 (매칭 안 된 행 포함)X (Union으로 간접 구현)
CROSS JOINA x B 데카르트 곱O

8. 실무 팁 & 주의사항

  1. 조인 조건(ON 절) 누락 주의
    • 조건 없이 JOIN(특히 CROSS JOIN)하면 엄청난 행이 생성될 수 있음
  2. 조인 순서
    • 대체로 INNER JOINOUTER JOIN 순서로 나열하는 편이 가독성 좋음
  3. 필요한 컬럼만 SELECT
    • A.*, B.* 식으로 모두 다 SELECT 시, 불필요한 데이터까지 불러와 성능 저하 가능
  4. 별칭(Alias) 명시
    • 같은 이름의 컬럼(A.id, B.id)이 있을 때 충돌 방지
    • SELECT A.id AS a_id, B.id AS b_id, A.name, B.desc ...

마무리

  • JOIN을 잘 이해하면 관계형 데이터베이스에서 복수 테이블을 연결해 풍부한 정보를 얻을 수 있습니다.
  • 각 JOIN의 특성을 숙지하고, 비즈니스 로직에 맞는 방식(INNER, LEFT, RIGHT, FULL, CROSS)을 적절히 선택하세요.
  • 특히 MySQL에서는 FULL OUTER JOIN이 직접 지원되지 않으니, LEFT + RIGHT + UNION 방식을 기억해두면 유용합니다.

이상으로 SQL JOIN 전반에 대한 개념과 예시를 살펴봤습니다.

0개의 댓글