DataBase

[DATABASE] 조인(JOIN)의 개념과 종류

개발메모장 2025. 5. 6. 19:11

조인(JOIN) 개념

  • 두 개 이상의 테이블을 결합하여 데이터를 검색하는 방법
  • JOIN을 하면 JOIN한 테이블들이 하나의 데이터로 나온다.

 

조인(JOIN)의 종류

ANSI 표준 SQL에서는 네 가지 유형의 JOIN을 규정한다.

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • OUTER JOIN

다양한 조인(JOIN)의 종류

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • OUTER JOIN
  • CROSS JOIN
  • SELF JOIN
  • NATURAL JOIN

JOIN의 기본 문법

  • 기준이 되는 테이블을 A, JOIN해서 보고 싶은 테이블을 B라고 가정
  • ON 절로 JOIN의 조건문을 설정한다.
  • ON절 대신 USING 문으로 ON절의 조건문을 단축 시킬 수 있다.
SELET 
	* 
FROM 기준 테이블 JOIN문 조인할 테이블
	ON JOIN 조건문
    
-- 예시)
SELECT
	*
FROM TABLEA A INNER JOIN TABLEB B
	ON A.ID = B.ID

INNER JOIN

  • 교집합이라고 보면된다.
  • A테이블과 B테이블의 중복된 값을 보여준다.
  • 그냥 JOIN이라고만 입력해도 INNER JOIN으로 된다.

 

예시)

왼쪽에 학교 데이터와 오른쪽에 학생 데이터가 있다고 가정을 해보자

 

  • 학교의 PK값 = SCHOOS_SEQ
  • 학생의 학교를 식별할 수 있는 컬럼 = STUDENT_SCHOOL
  • 학교는 1 ~ 5 번까지 학생 데이터에 학교(STUDENT_SCHOOL)는 1, 3, 4
  • 여기서 교집합은 1, 3, 4
  • 예상 데이터는 학교 데이터가 1, 3, 4의 데이터만 나와야함

쿼리문

SELECT *
FROM SCHOOL SC (NOLOCK) INNER JOIN STUDENT ST (NOLOCK)
      ON SC.SCHOOL_SEQ = ST.STUDENT_SCHOOL
ORDER BY SC.SCHOOL_SEQ ASC;

결과


LEFT JOIN, RIGHT JOIN

  • 첫 번째 테이블(왼쪽) 기준으로 두 번째 테이블(오른쪽)을 조합
  • JOIN할 때 첫 번째 테이블과 두 번째 테이블의 외래키 또는 연관 있는 컬럼을 기준으로  ON절의 조건문으로 사용한다.
  • 첫 번째 테이블과 연관된 두 번째 테이블의 값이 없는 경우 NULL로 출력된다.
  • LEFT JOIN후 두 번째 테이블의 데이터는 첫 번째 테이블 컬럼 끝에 붙는다.
  • LEFT JOIN을 여러번 할 때 LEFT JOIN으로 시작했으면 나머지 JOIN도 LEFT JOIN으로 해야 한다.
  • RIGHT JOIN은 LEFT JOIN의 반대라고 보면 된다.
  • LEFT, RIGHT JOIN의 풀 네임은 LEFT OUTER JOIN, RIGHT OUTER JOIN 인데 OUTER는 생략 가능하다.
  • LEFT, RIGHT JOIN시 기준 테이블을 잘 잡아야 원하는 데이터가 문제 없이 나온다.

 

예시)

왼쪽 학교 데이터 기준으로 학교의 학생들이 누가 있는지 확인하고자 한다.

  • SCHOOL 테이블의 PK 값은 SCHOOL_SEQ
  • STUDENT 테이블에 SCHOOL 테이블과 연관된 컬럼은 STUDENT_SCHOOL
  • 둘이 ON 절로 LEFT JOIN 
  • 예상 데이터는 SCHOOL 테이블의 값은 전부 출력되고 STUDENT 테이블의 값은 연관된 컬럼은 데이터가 잘나오고 없으면 NULL로 처리되서 나온다.

결과

  • 기준 SCHOOL 테이블의 데이터는 다나오고 컬럼 끝에 STUDENT 테이블의 데이터가 붙어서 나옴
  • SCHOOL 데이터는 다나오지만 조건에 맞지 않은 STUDENT 테이블의 데이터는 NULL로 처리되서 나옴


CROSS JOIN

  • 두 테이블 간에 모든 가능한 조합을 생성하는 조인
  • 첫 번째 테이블 각 행에 모든 두 번째 테이블의 각 행이 조합 (카테시안 곱)
  • 첫 번째 테이블 행 x 두 번째 테이블 행 = 총 데이터 수
  • ON절이 필요 없음

카테시안 곱?

  • 모든 가능한 조합의 집합
  • 왼쪽 테이블 한 행마다 오른쪽 테이블의 모든 행을 곱하고 그걸 왼쪽 테이블의 행 만큼 반복
  • SCHOOL 테이블 행 = 5 x STUDENT 테이블 행 = 5 = 25

쿼리문

SELECT * 
FROM SCHOOL CROSS JOIN STUDENT

결과


OUTER JOIN (FULL OUTER JOIN)

  • 양 쪽 테이블의 모든 데이터를 조합.
  • 양 쪽 테이블의 모두의 데이터를 가져오고 ON절과 일치하지 않은 데이터는 NULL을 반환
  • 일부 DBMS(MariaDB, MySQL 등)는 FULL JOIN을 지원하지 않으며, LEFT JOIN + UNION + RIGHT JOIN으로 대체

예시)

모든 학교와 학생의 데이터를 보고 싶다.

  • SCHOOL_SEQ 와 STUDENT_SCHOOL 를 ON절로 FULL OUTER JOIN
  • 예상 값은 ON절 조건에 맞는 데이터는 다나오지만 SCHOOL_SEQ 5의 값이 없는 STUDENT의 테이블은 NULL을 반환

쿼리문

SELECT * 
FROM SCHOOL SC FULL OUTER JOIN STUDENT ST
        ON SC.SCHOOL_SEQ = ST.STUDENT_SCHOOL

결과

 

해설 그림


SELF JOIN

  • 자기 자신의 테이블과 조인하는 방식 *(별칭이 필수)
  • 트리 구조 표현 (직원 ↔ 상사, 카테고리 ↔ 상위 카테고리 등)
  • 자기 자신을 참조하는 외래키(Foreign Key) 가 있을 때 사용
  • 계층형 구조 분석이 필요할 때 (ex. 조직도, 댓글 구조 등)
  • SELF JOIN은 개념이지 문법이 아니라서 SELF JOIN으로 작성하는게 아님!
  • 상황에 맞게 자기 자신 테이블 끼리 INNER, LEFT, RIGHT JOIN 등등 요구 사항에 맞게 사용하면됨

예시

EMP 테이블에 사원명과 해당 사원에 상사가 있다고 가정하고 특정 사원에 누가 상사인지 확인하고 싶다면 ?

  • 박명수 사원에 상사를 확인하고 싶다 
  • 예상 되는 결과값은 MANAGER_ID가 자신 테이블의 EMP_ID를 참조하고 있다.
  • 박명수 사원에 MANAGER_ID = 1번 
  • 1번 EMP_ID에 해당하는 사원은 유재석
  • 즉 사원 박명수의 상사는 유재석이라는 결과가 나와야한다.

쿼리문

SELECT 
   E1.EMP_NAME AS '사원',
   E2.EMP_NAME AS '매니저'
FROM EMP E1 INNER JOIN EMP E2
      ON E1.MANAGER_ID = E2.EMP_ID
WHERE E1.EMP_NAME = '박명수'
  • SELF JOIN할 때 ON절의 기준을 잘 잡아야한다.

결과

ON절 해석

  • E1.MANAGER_ID가 먼저인 이유는 EMP E1 테이블에 **사원의 상사를 찾기 위한 목적**이기 때문에 먼저 작성
  • E2.EMP_ID가 나중인 이유는 해당 매니저의 EMP_ID를 찾기 위해 나중에 작성

  • 즉! EMP E1 테이블 안에는 매니저 번호가 있는 사원의 테이블, EMP E2 테이블은 매니저 직급의 사원들의 정보

 

NATURAL JOIN

  • 두 테이블에서 같은 이름을 가진 컬럼을 자동으로 기준 삼아 JOIN 하는 방식
  • ON이나 USING 없이도 작동되고 INNER JOIN 처럼 작동됨
  • 컬럼명이 두 테이블에서 완전히 같은 이름일 경우에만 조인됨
  • 조인 조건을 자동으로 만들어주기 때문에 편리하지만 위험성이 높음
  • 자동 조건이 불명확하고 조건을 직접 컨트롤 못하기 때문에 예측하지 못한 결과가 나올 수 있어 실무에서는 거의 사용 안함!
  • Sql Server 에서는 미지원

예시)

학생들의(STUDENT) 성적(SCORE)을 보고 싶다.

  • 같은 컬럼명은 STUDENT_SEQ
  • NATURAL JOIN 하면 INNER JOIN 처럼 되기 때문에 '김갑용', '정호길' 의 과목과 점수가 나올것으로 예상

쿼리문

SELECT
    ST.STUDENT_SEQ AS STUDENT_SEQ,
    ST.student_name AS 학생,
    SC.subject AS 과목,
    SC.SCORE AS 점수
FROM STUDENT ST NATURAL JOIN SCORE SC

결과