본문 바로가기

SQL

JOIN 종류

1. JOIN 기본 개념

  • JOIN: 두 개 이상의 테이블을 결합하여 데이터를 가져오는 SQL 문법.
  • 목적: 한 번의 SELECT로 여러 테이블의 관련 데이터를 조회하기 위함.
  • 기본 원리: **공통 컬럼(키 값)**을 기준으로 행(row)을 매칭.

2. JOIN 종류

(1) INNER JOIN

  • 조건에 맞는 행만 결과로 가져옴.
  • 가장 많이 쓰이는 JOIN.
SELECT u.username, d.dept_name
FROM users u
JOIN departments d ON u.dept_id = d.id;
  • 특징:
    • 조건 u.dept_id = d.id에 일치하는 데이터만 반환.
    • 조건 불일치 → 결과에서 제외됨.
    • NULL 값도 제외됨.

(2) NATURAL JOIN

  • 컬럼명이 같은 것을 자동으로 매칭하여 JOIN.
  • ON 절 필요 없음.
SELECT * 
FROM users 
NATURAL JOIN departments;
  • 특징:
    • 자동으로 users.dept_id = departments.dept_id 적용.
    • 같은 이름의 컬럼 없으면 에러.
    • 실무에서는 모호해서 거의 안 씀 (명시적 ON절 권장).

(3) OUTER JOIN

  • 한쪽 테이블의 모든 행을 기준으로 결과를 출력.
  • 없는 값은 NULL로 채움.
-- LEFT OUTER JOIN (왼쪽 기준)
SELECT u.username, d.dept_name
FROM users u
LEFT JOIN departments d ON u.dept_id = d.id;

-- RIGHT OUTER JOIN (오른쪽 기준)
SELECT u.username, d.dept_name
FROM users u
RIGHT JOIN departments d ON u.dept_id = d.id;

-- FULL OUTER JOIN (양쪽 전부)
SELECT u.username, d.dept_name
FROM users u
FULL OUTER JOIN departments d ON u.dept_id = d.id;
  • LEFT: 왼쪽(users) 전부 + 오른쪽 일치 시 매칭.
  • RIGHT: 오른쪽(departments) 전부 + 왼쪽 일치 시 매칭.
  • FULL: 양쪽 전부 다 출력 (조건 불일치 → NULL).

(4) CROSS JOIN

  • 카티션 곱 (Cartesian Product) 생성.
  • 두 테이블의 모든 행을 조합.
SELECT *
FROM users
CROSS JOIN departments;
  • 결과: users 행 수 × departments 행 수.
  • 실무에서는 거의 안 쓰고, 테스트/조합 확인 용도로만 사용.

3. JOIN 예제 (데이터 & 결과)

테이블

users
id | username | dept_id
1  | Alice    | 10
2  | Bob      | 20
3  | Charlie  | NULL
4  | David    | 30

departments
id | dept_name
10 | HR
20 | Engineering
30 | Marketing
40 | Sales

INNER JOIN

SELECT u.username, d.dept_name
FROM users u
JOIN departments d ON u.dept_id = d.id;

결과:

username | dept_name
Alice    | HR
Bob      | Engineering
David    | Marketing
  • Charlie는 dept_id가 NULL → 조건 불일치 → 제외됨.

LEFT JOIN

SELECT u.username, d.dept_name
FROM users u
LEFT JOIN departments d ON u.dept_id = d.id;

결과:

username | dept_name
Alice    | HR
Bob      | Engineering
Charlie  | NULL
David    | Marketing
  • Charlie도 포함됨. 단, 매칭된 dept 없음 → NULL.

4. JOIN 종류 요약

JOIN 종류 설명 없는 데이터 처리

INNER JOIN 조건 일치하는 데이터만 가져옴 불일치 시 제외
NATURAL JOIN 같은 이름의 컬럼 자동 매칭 컬럼명 없으면 에러
LEFT JOIN 왼쪽 테이블은 전부 포함 오른쪽 없는 건 NULL
RIGHT JOIN 오른쪽 테이블은 전부 포함 왼쪽 없는 건 NULL
FULL OUTER JOIN 양쪽 전부 다 포함 없는 건 NULL
CROSS JOIN 모든 행 조합 (카티션 곱) 전부 출력

 

  1. INNER JOIN, LEFT JOIN → 가장 많이 사용.
  2. NATURAL JOIN → 모호성 때문에 거의 안 씀.
  3. FULL OUTER JOIN → 통계/데이터 비교 시 특정 상황에서만 사용.
  4. CROSS JOIN → 거의 사용하지 않음.

6. JOIN 쿼리와 코드 흐름 (MyBatis 기준)

  1. 사용자가 화면에서 요청 (예: 사용자 목록 + 부서명 보기).
  2. Controller → Service → Mapper 흐름으로 이동.
  3. Mapper(XML)에 JOIN 쿼리 작성.
<select id="getUsersWithDept" resultType="UserDeptDto">
  SELECT u.username, d.dept_name
  FROM users u
  JOIN departments d ON u.dept_id = d.id;
</select>

 4. 결과 DTO로 매핑되어 사용자에게 전달.


 

  • JOIN은 여러 테이블의 데이터를 연결하는 핵심 SQL 기능.
  • 실무에서는 INNER JOIN, LEFT JOIN만 주로 사용.
  • JOIN은 무조건 Mapper/Repository 단에서 사용되며, 서비스 코드에 직접 SQL을 적는 경우는 드묾.
  • OUTER JOIN, FULL JOIN, CROSS JOIN은 특수한 상황에서만 사용.