🧩 SQL JOIN 완벽 정리
🧠 [ JOIN이란? ]
서로 다른 테이블 간의 데이터를 결합하여 하나의 결과로 조회하는 SQL 문법
| 항목 | 설명 |
|---|
| 📘 정의 | 두 개 이상의 테이블을 연결해 하나의 결과로 만드는 것 |
| 🧩 목적 | 여러 테이블에 분산된 데이터를 논리적으로 결합 |
| 💡 예시 | 회원 테이블 + 주문 테이블 → 특정 회원의 주문 내역 |
🔍 [ 기본 JOIN 방식 ]
| JOIN 방식 | 설명 | 특징 |
|---|
SELECT * FROM table1, table2; | 단순 두 테이블을 모두 결합 (Cartesian Product) | ⚠️ 테이블 간 곱셈 발생 → 비권장 |
SELECT * FROM table1, table2 WHERE table1.pk = table2.pk; | WHERE 조건을 통한 결합 | 가독성 ↓ / 실무 비권장 |
🔗 [ NATURAL JOIN ]
기본키와 외래키의 속성명이 같을 때만 사용 가능
SELECT * FROM table1 NATURAL JOIN table2;
| 장점 | 단점 |
|---|
| SQL 문장이 간결 | 속성명이 동일하지 않으면 실행 불가 / 의도치 않은 조인 발생 가능 |
| ⚠️ 실무에서는 거의 사용하지 않음 | |
🧭 [ JOIN USING ]
공통 컬럼 이름이 같을 때, 명시적으로 조인할 컬럼 지정
SELECT * FROM table1 JOIN table2 USING(pk);
| 장점 | 단점 |
|---|
| 코드 간결 / 명시적 | 컬럼명이 반드시 같아야 함 |
⚙️ [ INNER JOIN ]
두 테이블 간의 교집합(공통된 값) 만 조회하는 조인 방식
✅ 실무에서 가장 많이 사용됨
SELECT *
FROM table1
INNER JOIN table2
ON table1.pk = table2.pk;
| 항목 | 설명 |
|---|
| 💡 INNER 생략 가능 | JOIN만 써도 동일한 결과 |
| 📘 별칭 사용 가능 | table1 t1 JOIN table2 t2 ON t1.pk = t2.pk |
| 🧩 결과 | 두 테이블의 공통 데이터만 출력 |
🧱 [ OUTER JOIN ]
교집합뿐만 아니라 한쪽 테이블의 모든 데이터를 포함시켜 조회하는 방식
OUTER 키워드는 생략 가능
🔹 LEFT OUTER JOIN (왼쪽 기준)
SELECT *
FROM table1 t1
LEFT OUTER JOIN table2 t2
ON t1.pk = t2.pk;
| 기준 | 결과 |
|---|
왼쪽 테이블(table1) | 모든 레코드 포함 |
오른쪽 테이블(table2) | 교집합만 표시, 나머지는 NULL |
📊 비유:
👉 “왼쪽 테이블을 기준으로 오른쪽의 대응값을 가져오되, 없으면 NULL로 표시”
🔸 RIGHT OUTER JOIN (오른쪽 기준)
SELECT *
FROM table1 t1
RIGHT OUTER JOIN table2 t2
ON t1.pk = t2.pk;
| 기준 | 결과 |
|---|
오른쪽 테이블(table2) | 모든 레코드 포함 |
왼쪽 테이블(table1) | 교집합만 표시, 나머지는 NULL |
📊 비유:
👉 “오른쪽 테이블을 기준으로 왼쪽의 대응값을 가져오되, 없으면 NULL로 표시”
🔄 [ UNION ]
2개 이상의 SELECT 결과를 하나로 합치는 연산자
SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.pk = t2.pk
UNION
SELECT * FROM table1 t1 RIGHT JOIN table2 t2 ON t1.pk = t2.pk;
| 특징 | 설명 |
|---|
| 🔁 중복 제거 | UNION은 중복된 행을 제거 (UNION ALL은 중복 허용) |
| 💡 활용 예시 | LEFT + RIGHT JOIN 결과를 하나로 결합 |
⚠️ [ WHERE IS NULL ]
차집합(Difference)을 구할 때 사용
SELECT t1.*
FROM table1 t1
LEFT JOIN table2 t2 ON t1.pk = t2.pk
WHERE t2.pk IS NULL;
| 항목 | 설명 |
|---|
| 💡 의미 | table1에는 있고, table2에는 없는 데이터 조회 |
| 🧩 활용 예시 | “삭제된 회원” / “미등록 주문” 등 확인 시 |
🧬 [ 3개 테이블 JOIN ]
여러 테이블을 순차적으로 조인 가능
SELECT *
FROM 테이블A A
JOIN 테이블B B ON A.pk = B.pk
JOIN 테이블C C ON B.pk = C.pk;
| 특징 | 설명 |
|---|
| 📘 연쇄 조인 가능 | A→B→C 순서로 조인 |
| ⚙️ 주의점 | ON 조건 명확히 지정해야 의도된 결과 도출 |
💭 [ 생각할 점 ]
| 항목 | 내용 |
|---|
| 💡 메소드 반환값 | 하나의 메소드는 하나의 타입만 반환 가능 |
| ⚙️ 해결 방법 | 여러 타입 반환 시, 객체로 묶거나 메소드를 분리 |
| 🔒 비밀번호 처리 | 비밀번호 비교용 검증 메소드 별도 구현 권장 |