1. 내부 조인 (INNER JOIN)
개념
- 양쪽 테이블에 공통으로 존재하는 값만 출력된다.
- 교집합 느낌.
- 조인의 디폴트이므로 INNER 키워드는 생략 가능.
문법
SELECT A.col1, B.col2
FROM TableA A
INNER JOIN TableB B ON A.key = B.key;
예시
SELECT C.car, C.price, M.factory
FROM tCar C INNER JOIN tMaker M
ON C.marker = M.marker;
→ tCar와 tMaker에서 marker가 같은 경우만 출력된다.
2. 외부 조인 (OUTER JOIN)
LEFT OUTER JOIN
- 왼쪽 테이블의 모든 행 + 오른쪽에서 일치하는 행만
- 오른쪽에 없는 값은 NULL로 채움.
SELECT C.car, C.price, M.factory
FROM tCar C
LEFT OUTER JOIN tMaker M ON C.marker = M.marker;
RIGHT OUTER JOIN
- 오른쪽 테이블의 모든 행 + 왼쪽에서 일치하는 행만
- 왼쪽에 없는 값은 NULL.
SELECT C.car, C.price, M.factory
FROM tCar C
RIGHT OUTER JOIN tMaker M ON C.marker = M.marker;
FULL OUTER JOIN (MySQL에서는 UNION으로 구현)
- 양쪽 모두 포함.
- 없는 쪽은 NULL로 채움.
SELECT C.car, C.price, M.factory
FROM tCar C
LEFT OUTER JOIN tMaker M ON C.marker = M.marker
UNION
SELECT C.car, C.price, M.factory
FROM tCar C
RIGHT OUTER JOIN tMaker M ON C.marker = M.marker;
가상 예시 데이터
tCar
car price marker
| 소나타 | 2000 | 1 |
| 아반떼 | 1500 | 2 |
| K5 | 2200 | 3 |
tMaker
factory marker
| 현대자동차 | 1 |
| 기아자동차 | 3 |
| 쉐보레 | 4 |
LEFT JOIN 결과
car price factory
| 소나타 | 2000 | 현대자동차 |
| 아반떼 | 1500 | NULL |
| K5 | 2200 | 기아자동차 |
RIGHT JOIN 결과
car price factory
| 소나타 | 2000 | 현대자동차 |
| K5 | 2200 | 기아자동차 |
| NULL | NULL | 쉐보레 |
FULL OUTER JOIN 결과
car price factory
| 소나타 | 2000 | 현대자동차 |
| 아반떼 | 1500 | NULL |
| K5 | 2200 | 기아자동차 |
| NULL | NULL | 쉐보레 |
3. 다중 조인 (Multi-Join)
개념
- 3개 이상의 테이블을 조인하는 것.
- 조인된 결과도 하나의 테이블처럼 취급 가능.
예시
SELECT C.car, M.factory, T.area
FROM tCar C
INNER JOIN tMaker M ON C.marker = M.marker
INNER JOIN tCity T ON M.factory = T.name;
→ 자동차 + 제조사 + 도시 정보를 한 번에 가져온다.
4. 조인 시 조건 넣는 위치 (ON vs WHERE)
ON절에 조건
SELECT C.car, C.price, M.factory
FROM tCar C
LEFT OUTER JOIN tMaker M
ON C.marker = M.marker AND M.factory = '현대자동차';
- 조인 단계에서 조건을 걸기 때문에 OUTER JOIN의 특성이 유지됨.
WHERE절에 조건
SELECT C.car, C.price, M.factory
FROM tCar C
LEFT OUTER JOIN tMaker M
ON C.marker = M.marker
WHERE M.factory = '현대자동차';
- 전체 LEFT JOIN을 한 뒤, 결과에서 필터링 → OUTER 효과 사라지고 사실상 INNER JOIN처럼 동작.
OUTER JOIN에서는 조건은 ON절에 주는 게 안전하다.
5. 인라인 뷰 조인
개념
- 서브쿼리를 FROM절에 넣어서 가상의 테이블처럼 사용.
- 복잡한 집계를 미리 만들고 JOIN할 때 유용.
예시
각 marker별 가장 비싼 자동차를 뽑아서, 제조사와 함께 출력하기.
SELECT BestCar.car, BestCar.price, M.factory
FROM (
SELECT marker, MAX(price) AS price
FROM tCar
GROUP BY marker
) BestPrice
INNER JOIN tCar BestCar
ON BestCar.marker = BestPrice.marker
AND BestCar.price = BestPrice.price
INNER JOIN tMaker M
ON BestCar.marker = M.marker;
6. 조인 시 중복 발생
왜 발생할까?
- 조인은 카티션 프로덕트(곱집합) 기반 → 매칭되는 모든 행이 출력된다.
- 조인 키가 한쪽에서 여러 번 나오면 중복 발생.
예시
tCar
car price marker
| 소나타 | 2000 | 1 |
| 아반떼 | 1500 | 1 |
tMaker
factory marker
| 현대자동차 | 1 |
SELECT C.car, C.price, M.factory
FROM tCar C INNER JOIN tMaker M
ON C.marker = M.marker;
결과
- 소나타 - 현대자동차
- 아반떼 - 현대자동차
중복 제어 방법
- DISTINCT
- GROUP BY
- JOIN 조건 더 추가
- 조인 중복은 SQL의 정상 동작이라는 것도 깨달음 → 필요에 따라 DISTINCT, GROUP BY로 제어해야 한다.
'SQL' 카테고리의 다른 글
| 오라클 - 정규화부터 서브쿼리 (0) | 2025.06.11 |
|---|---|
| LINQPad 로 LINQ 문 , SQL 문 연습하기 (0) | 2025.06.09 |
| JOIN 종류 (0) | 2025.06.09 |