"조인(Join)" 완벽 이해하기
728x90

관계형 데이터베이스에서는 중복 데이터를 최대한 없애기 위해 데이터를 여러 테이블로 나눠서 저장한다.

DB에 데이터들을 저장하고 데이터들을 조회하려고 할 때 여러 테이블들을 JOIN해서 데이터를 얻는 과정을 꼭 거쳐한 한다.

조인은 여러 테이블에 분산된 데이터를 연결하여 원하는 결과를 도출하는 중요한 도구이다.

그렇기 때문에 "JOIN"에 대해서 자세히 알아보고 사용하는게 좋을 것 같아서 이 글을 작성하게 되었다.

 

조인(Join)이란?

조인은 두 개 이상의 테이블에서 데이터를 연결하여 원하는 정보를 조회하는 SQL 연산이다. 테이블 간의 관계를 정의하는 "키(Key)"를 기반으로 데이터를 결합하며, 이를 통해 복잡한 데이터 구조에서도 필요한 정보를 가져올 수 있다

고객 테이블과 주문 테이블이 따로 있는 경우 조인 예시를 보겠다.

고객(Customer)

고객ID 이름 이메일
1 홍길동 hong@example.com
2 김철수 kim@example.com
3 박영희 park@example.com

주문(Order)

주문ID 고객ID 상품 주문일자
101 1 노트북 2024-01-01
102 1 스마트폰 2024-01-15
103 2 태블릿 2024-01-20

위 두 테이블을 조인하여 "홍길동"의 주문 내역을 가져오려면 고객ID를 기준으로 데이터를 연결해야 한다.

SELECT 고객.이름, 주문.상품, 주문.주문일자
FROM 고객
JOIN 주문 ON 고객.고객ID = 주문.고객ID;

결과:

이름 상품 주문일자
홍길동 노트북 2024-01-01
홍길동 스마트폰 2024-01-15
김철수 태블릿 2024-01-20

 

이 경우에 고객 ID이라는 공통 컬럼을 통해서 두 개의 테이블에서 필요한 컬럼들을 확인할 수 있다.

 

 

조인은 다양한 유형으로 나뉘며, 각각의 조인은 특정 요구사항에 맞는 데이터를 조회하는 데 사용된다.

 

조인의 종류를 알아보자!

INNER JOIN

  • 두 테이블에서 조건에 일치하는 데이터만 반환한다.
  • 공통된 데이터만 결과에 포함되기 때문에 조인에 부합되지 않는 레코드는 모두 삭제 된다.

해당 조인은 위에서 보인 예시와 같은 동작을 한다.

 

LEFT JOIN (또는 LEFT OUTER JOIN)

  • 왼쪽 테이블의 모든 데이터를 가져오고, 오른쪽 테이블에 일치하는 데이터가 없으면 NULL을 반환합니다.
  • ex) 특정 고객이 주문을 하지 않은 경우에도 고객 정보를 포함하고 싶을 때.

SELECT 고객.이름, 주문.상품
FROM 고객
LEFT JOIN 주문 ON 고객.고객ID = 주문.고객ID;

결과: 박영희는 주문하지 않은 고객이지만 LEFT JOIN에 따라서 상품은 NULL 값을 가진 상태로 조인된 것을 볼 수 있다.

이름 상품
홍길동 노트북
홍길동 스마트폰
김철수 태블릿
박영희 NULL

 

RIGHT JOIN (또는 RIGHT OUTER JOIN)

  • 오른쪽 테이블의 모든 데이터를 가져오고, 왼쪽 테이블에 일치하는 데이터가 없으면 NULL을 반환한다.
  • ex) 주문 내역은 있지만 고객 정보가 누락된 경우에도 주문 정보를 포함하고 싶을 때.

 

FULL OUTER JOIN

  • 두 테이블의 모든 데이터를 가져오며, 일치하지 않는 데이터는 NULL로 채운다.
  • FULL OUTER JOIN은 두 테이블 간의 데이터 겹침 여부와 상관없이 모든 데이터를 포함한다.
  • ex) 양쪽 테이블의 모든 데이터를 결합하여 누락된 데이터까지 확인하고 싶을 때.

테이블 A: 고객 정보

고객ID 이름
1 홍길동
2 김철수
3 박영희

테이블 B: 주문 정보

주문ID 고객ID 상품
101 1 노트북
102 2 태블릿
103 4 스마트폰

 

SELECT A.고객ID, A.이름, B.주문ID, B.상품
FROM 고객 A
FULL OUTER JOIN 주문 B
ON A.고객ID = B.고객ID;
 

결과:

고객ID 이름 주문ID 상품
1 홍길동 101 노트북
2 김철수 102 태블릿
3 박영희 NULL NULL
4 NULL 103 스마트폰

 

대부분 DB는 FULL OUTER JOIN을 지원하지 않는다. 하지만, LEFT JOIN, RIGHT JOIN, UNION을 통해서 구현할 수 있다.

-- LEFT JOIN 결과
SELECT A.고객ID, A.이름, B.주문ID, B.상품
FROM 고객 A
LEFT JOIN 주문 B
ON A.고객ID = B.고객ID

UNION

-- RIGHT JOIN 결과
SELECT A.고객ID, A.이름, B.주문ID, B.상품
FROM 고객 A
RIGHT JOIN 주문 B
ON A.고객ID = B.고객ID;

 

CROSS JOIN

  • 두 테이블의 모든 가능한 조합을 반환한다. (카테시안 곱)
  • [주의] 조인 조건이 없기 때문에, 데이터 양이 많아질 경우 성능 문제가 발생할 수 있다.

SELECT 고객.이름, 주문.상품
FROM 고객
CROSS JOIN 주문;

결과: 모든 고객이 모든 주문과 조합된 결과 반환한다.

 

SELF JOIN

  • 같은 테이블 내의 데이터를 조인한다.
  • ex) 직원 테이블에서 상사와 부하 직원의 관계를 표현.
SELECT A.이름 AS 직원, B.이름 AS 상사
FROM 직원 A
JOIN 직원 B ON A.상사ID = B.직원ID;
 
조인 활용 팁과 주의사항

인덱스 활용: 조인의 성능을 향상시키기 위해 조인 조건에 사용되는 열에 인덱스를 설정한다.
필요한 데이터만 조회: 조인 결과에서 필요한 열만 선택하여 네트워크와 처리 부하를 줄인다.
조인 전 중복 제거: 조인 전에 중복제거를 하여 성능을 개선한다.(SELECT DISTINCT는 간단하지만 성능이 느려서 조인할 테이블에 먼저 distinct로 중복을 제거한 select문을 서브쿼리로 불러와 임시 테이블로 만든 뒤 조인하면 좋다.)
데이터량 주의: 조인되는 데이터가 많아질수록 성능이 저하될 수 있으므로 조건을 명확히 지정한다.
NULL 처리: OUTER JOIN 사용 시 NULL 값 처리를 염두에 두고 데이터를 가공해야한다.

 

728x90
반응형