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

2024. 12. 26. 01:03·Database/SQL
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
반응형
저작자표시 비영리 변경금지 (새창열림)

'Database > SQL' 카테고리의 다른 글

인덱스에 대해서 알아보자!  (1) 2024.12.27
데이터베이스 튜닝에 대하여  (4) 2024.12.26
데이터베이스 자료형에 대해 알아보자!  (0) 2024.12.18
[JPA] flush는 언제 일어날까?  (1) 2024.12.18
[DB] PK (Primary Key) ID 길이가 성능에 영향을 미칠까?  (1) 2024.12.11
'Database/SQL' 카테고리의 다른 글
  • 인덱스에 대해서 알아보자!
  • 데이터베이스 튜닝에 대하여
  • 데이터베이스 자료형에 대해 알아보자!
  • [JPA] flush는 언제 일어날까?
pink_salt
pink_salt
유익함을 주는 개발자가 되도록 keep going
  • pink_salt
    KeepGoingForever
    pink_salt
  • 전체
    오늘
    어제
    • 분류 전체보기 (117)
      • Project (7)
      • WEB study (3)
        • WEB(Springboot) (10)
        • Git, GitLab (13)
        • Clean code (1)
        • FrontEnd (3)
      • Study (21)
        • Algorithm (19)
        • 면접 준비 (2)
      • Cloud Computing (2)
        • AWS (2)
      • 프로그래밍 언어 (35)
        • Java (29)
        • Python (0)
        • javascript (6)
      • 운영체제 (0)
        • Linux (0)
      • Database (4)
        • MongoDB (8)
        • SQL (8)
      • 애플리케이션 개발 (1)
        • Android (1)
      • AI (1)
        • Deeplearning (1)
        • machinelearning (0)
      • Daily (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    BFS
    코드프레소
    git branch
    python
    Database
    gitlab
    codepresso
    코딩이러닝
    Java
    Git
    대외활동
    백준
    무료코딩교육
    spring boot
    언어
    무료IT교육
    Query
    개념
    IT교육
    dp
    객체지향
    오블완
    SWEA
    티스토리챌린지
    mysql
    자바
    SW
    코딩강의
    빅오표기법
    MongoDB
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
pink_salt
"조인(Join)" 완벽 이해하기
상단으로

티스토리툴바