[MySQL] JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN

2025. 8. 7. 10:16·Computer Science/데이터베이스

조인은 서로 관련된 데이터를 2개 이상의 테이블에서 가져와서 한꺼번에 조회할 수 있게 해준다.

 

INNER JOIN은 두 개 이상의 테이블을 조인할 때, 일치하는 값을 가진 행만 결과에 포함시킨다.

반면에 OUTER JOIN은 두 개 이상의 테이블을 조인할 때, 일치하는 값이 없는 경우에도 한쪽 또는 양쪽 테이블의 모든 행을 결과에 포함시킨다.

 


JOIN(INNER JOIN)

가장 흔히 볼 수 있는 조인 형태이다.

두 개 이상의 테이블에서 특정 키 값을 기준으로 동일한 데이터를 가진 행을 조회한다.

문법은 다음과 같다.

SELECT 
	<열 목록>
FROM
	테이블1
INNER JOIN
	테이블2
ON
	테이블1.조인컬럼 = 테이블2.조인컬럼;

 

 

사원 정보를 가진 employees 테이블과 부서 정보를 가진 departments 테이블에서

같은 부서 id를 가진 사원의 이름과 부서의 이름을 출력해보자.

select 
	employees.dept_id, employees.emp_name, departments.dept_name
from 
	employees
inner join 
	departments
on 
	employees.dept_id = departments.dept_id;

 

조인한 결과는 다음과 같다. 부서 id가 존재하는 사원 테이블의 행에 한해서 결합된 레코드가 출력되었다!

마치 A∩B의 교집합을 연상케한다.

 


 

LEFT JOIN(LEFT OUTER JOIN)

LEFT JOIN은 왼쪽 테이블과 오른쪽 테이블이 있다고 가정하였을 때,

왼쪽 테이블의 모든 행을 출력하고 조인 조건이 일치하지 않는 오른쪽 테이블의 조인 컬럼의 값은 NULL을 반환한다.

문법은 다음과 같다.

 

SELECT 
	<열 목록>
FROM
	테이블1
LEFT JOIN
	테이블2
ON
	테이블1.조인컬럼 = 테이블2.조인컬럼;

 

사원 정보를 가진 employees 테이블과 부서 정보를 가진 departments 테이블에서

사원의 이름과 부서의 이름을 출력해보자. 단, 부서 정보가 없는 값은 비워두도록 한다.

select 
	employees.dept_id, employees.emp_name, departments.dept_name
from 
	employees
left join 
	departments
on 
	employees.dept_id = departments.dept_id;

 

LEFT JOIN 결과는 다음과 같다.

left join을 기준으로 왼쪽 테이블인 employees의 레코드가 모두 출력되고, 조인 조건에 맞다면 즉 부서가 존재하면 부서 이름까지 출력한다.

하지만 부서가 존재하지 않으면 NULL로 컬럼 값이 채워진다.

다이어그램으로 표현한 LEFT JOIN이다.

 


 

RIGHT JOIN(RIGHT OUTER JOIN)

RIGHT JOIN은 왼쪽 테이블과 오른쪽 테이블이 있다고 가정하였을 때,

오른쪽 테이블의 모든 행을 출력하고 조인 조건이 일치하지 않는 왼쪽 테이블의 조인 컬럼의 값은 NULL을 반환한다.

문법은 다음과 같다.

 

SELECT 
	<열 목록>
FROM
	테이블1
RIGHT JOIN
	테이블2
ON
	테이블1.조인컬럼 = 테이블2.조인컬럼;

 

사원 정보를 가진 employees 테이블과 부서 정보를 가진 departments 테이블에서

사원의 이름과 부서의 이름을 출력해보자. 단, 사원 정보가 없는 값은 비워두도록 한다.

select 
	employees.dept_id, employees.emp_name, departments.dept_name
from 
	employees
right join 
	departments
on 
	employees.dept_id = departments.dept_id;

 

 

RIGHT JOIN 결과는 다음과 같다.

right join을 기준으로 오른쪽 테이블인 departments의 레코드가 모두 출력되고, 조인 조건에 맞다면 즉 사원이 존재하면 사원 이름까지 출력한다.

하지만 부서 정보에 맞는 사원 정보가 존재하지 않으면 NULL로 컬럼 값이 채워진다.

다이어그램으로 표현한 RIGHT JOIN이다.

 


 

FULL OUTER JOIN(LEFT + RIGHT JOIN)

FULL OUTER JOIN은 LEFT JOIN과 RIGHT JOIN을 합친 결과와 같다.

하지만 MySQL은 FULL OUTER JOIN을 지원하는 문법이 따로 없다.

그대신 union이라는 문법을 사용하여 LEFT JOIN과 RIGHT JOIN 결과를 직접 결합한다.

SELECT 
	<열 목록>
FROM
	테이블1
LEFT JOIN
	테이블2
ON
	테이블1.조인컬럼 = 테이블2.조인컬럼
UNION
SELECT 
	<열 목록>
FROM
	테이블1
RIGHT JOIN
	테이블2
ON
	테이블1.조인컬럼 = 테이블2.조인컬럼;

 

사원 정보를 가진 employees 테이블과 부서 정보를 가진 departments 테이블에서

사원의 이름과 부서의 이름을 출력해보자. 단, 사원 또는 부서 정보가 없는 값은 비워두도록 한다.

select 
	employees.dept_id, employees.emp_name, departments.dept_name
from 
	employees 
left join 
	departments
on 
	employees.dept_id = departments.dept_id
union
select 
	employees.dept_id, employees.emp_name, departments.dept_name
from 
	employees
right join 
	departments
on 
	employees.dept_id = departments.dept_id;

 

두 조인을 결합한 결과는 다음과 같다. 앞선 LEFT JOIN의 레코드와 RIGHT JOIN의 레코드를 모두 가져온 결과와 동일하다.

다이어그램으로 표현한 FULL OUTER JOIN을 살펴보자.

 

이처럼 조인은 원하는 컬럼의 값을 한데 모아보기 위해 만들어진 기능이다.

SQL을 공부할 때는 JOIN의 개념이 중요하기 때문에 익혀두고 가면 좋다 😊

 

:)

 

출처

https://hump-mountain.tistory.com/20

https://www.alphacodingskills.com/sql/sql-join.php

https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/

'Computer Science > 데이터베이스' 카테고리의 다른 글

[DB] 트랜잭션 고립 수준(Transaction Isolation Level)  (0) 2025.09.19
[DB] 공통 테이블 식(CTE)  (0) 2025.09.19
[DB] Union vs Union All  (0) 2025.09.10
[DB] 트랜잭션(Transaction)  (2) 2025.08.22
[DB] RDBMS vs NoSQL  (0) 2025.06.10
'Computer Science/데이터베이스' 카테고리의 다른 글
  • [DB] 공통 테이블 식(CTE)
  • [DB] Union vs Union All
  • [DB] 트랜잭션(Transaction)
  • [DB] RDBMS vs NoSQL
jjangsudiary
jjangsudiary
jjangsudiary 님의 블로그 입니다.
  • jjangsudiary
    jjangsudiary 님의 블로그
    jjangsudiary
  • 전체
    오늘
    어제
    • 분류 전체보기 (81) N
      • 이모저모 (0)
        • 회고 (0)
      • Development (17) N
        • 개발 공부 (14) N
        • 프로젝트 (2)
      • Android (10)
        • Compose (1)
      • AI (15)
      • Computer Science (25)
        • 네트워크 (8)
        • 데이터베이스 (10)
        • 운영체제 (6)
        • 자료구조 (0)
        • 컴퓨터구조 (1)
      • Java (9)
        • 디자인패턴 (2)
      • Spring (3)
  • 블로그 메뉴

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

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    Python
    java
    CS
    database
    운영체제
    android
    os
    baekjoon
    TensorFlow
    자바
    db
    파이썬
    코딩 테스트
    머신러닝
    안드로이드
    프로그래머스
    Ai
    백준
    딥러닝
    인공지능
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
jjangsudiary
[MySQL] JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN
상단으로

티스토리툴바