본문 바로가기

SQL

SQL 조인 정리 (INNER, OUTER, 다중조인, 인라인 뷰 조인)

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;

 결과

  • 소나타 - 현대자동차
  • 아반떼 - 현대자동차

 중복 제어 방법

  1. DISTINCT
  2. GROUP BY
  3. JOIN 조건 더 추가

 

  • 조인 중복은 SQL의 정상 동작이라는 것도 깨달음 → 필요에 따라 DISTINCT, GROUP BY로 제어해야 한다.

 

'SQL' 카테고리의 다른 글

오라클 - 정규화부터 서브쿼리  (0) 2025.06.11
LINQPad 로 LINQ 문 , SQL 문 연습하기  (0) 2025.06.09
JOIN 종류  (0) 2025.06.09