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 | 모든 행 조합 (카티션 곱) | 전부 출력 |
- INNER JOIN, LEFT JOIN → 가장 많이 사용.
- NATURAL JOIN → 모호성 때문에 거의 안 씀.
- FULL OUTER JOIN → 통계/데이터 비교 시 특정 상황에서만 사용.
- CROSS JOIN → 거의 사용하지 않음.
6. JOIN 쿼리와 코드 흐름 (MyBatis 기준)
- 사용자가 화면에서 요청 (예: 사용자 목록 + 부서명 보기).
- Controller → Service → Mapper 흐름으로 이동.
- 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은 특수한 상황에서만 사용.
'SQL' 카테고리의 다른 글
| SQL 조인 정리 (INNER, OUTER, 다중조인, 인라인 뷰 조인) (0) | 2025.06.12 |
|---|---|
| 오라클 - 정규화부터 서브쿼리 (0) | 2025.06.11 |
| LINQPad 로 LINQ 문 , SQL 문 연습하기 (0) | 2025.06.09 |