SQL에서 테이블을 합치는 방식은 크게 두 가지로 나눌 수 있습니다.
- 결합 연산 (가로 방향 결합): 서로 다른 테이블의 컬럼들을 이어 붙여 새로운 결과를 만듦.
- 집합 연산 (세로 방향 결합): 여러 테이블의 데이터를 한 줄로 쌓아 올림.
이번 글에서는 우리가 잘 아는 INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN 같은 기본 조인 외에, 현업에서 자주 보지는 않지만 알아두면 좋은 특수한 조인들을 정리해보겠습니다.
NATURAL JOIN (자연 조인)


- 특징: 두 테이블에서 이름이 같은 컬럼을 자동으로 찾아 조인 조건으로 삼습니다.
- 결과: 별도의 ON 절이 없어도 INNER JOIN처럼 동작합니다.
SELECT *
FROM player NATURAL JOIN team;
- 장점: SQL이 짧아짐.
- 단점: 어떤 컬럼으로 조인되는지 한눈에 알기 어려움 → 실무에서는 잘 안 씀.
CROSS JOIN (카르테시안 곱)

- 특징: 한 테이블의 모든 row와 다른 테이블의 모든 row를 조합.
- 수학적 개념: Cartesian Product.
SELECT *
FROM member CROSS JOIN stock;
예를 들어, 상의 테이블과 하의 테이블을 CROSS JOIN 하면 가능한 모든 코디 조합을 얻을 수 있습니다.
실무에서는 잘 쓰이지 않지만, 모든 경우의 수를 만들어내야 할 때 유용합니다.
SELF JOIN (자기 자신과 조인)


- 특징: 같은 테이블을 두 번 불러와 서로 다른 alias를 붙여 조인.
SELECT m1.email, m2.email
FROM member m1
LEFT JOIN member m2
ON m1.age = m2.age;
- 활용 예시
- 동갑 회원 찾기: 같은 나이를 가진 회원들끼리 묶기
- 조직도 조회: employee 테이블에서 boss_id를 자기 자신의 id와 조인해 상사 정보 붙이기
SELF JOIN을 활용하면 하나의 테이블에서도 여러 관점으로 데이터를 볼 수 있습니다.
FULL OUTER JOIN (완전 외부 조인)

- 특징: LEFT OUTER JOIN + RIGHT OUTER JOIN 결과를 합친 것.
- 차이점: 두 결과에 공통으로 존재하는 row는 한 번만 표시.
-- MySQL에서는 FULL OUTER JOIN이 직접 지원되지 않음
-- 대신 LEFT JOIN과 RIGHT JOIN을 UNION으로 합쳐서 구현 가능
SELECT * FROM player p
LEFT JOIN team t ON p.team_name = t.team_name
UNION
SELECT * FROM player p
RIGHT JOIN team t ON p.team_name = t.team_name;
Oracle 같은 DBMS에서는 아래처럼 간단히 가능:
SELECT *
FROM player FULL OUTER JOIN team
ON player.team_name = team.team_name;
Non-Equi Join (비등가 조인)

- 특징: = 대신 <, >, BETWEEN, LIKE 등 다양한 조건 사용.
- 예시: 회원 가입일 이후 등록된 상품을 매칭
SELECT m.email, i.item_name
FROM member m
LEFT JOIN item i
ON m.sign_up_day < i.registration_date;
이렇게 하면 특정 회원이 가입한 이후에 올라온 상품 목록을 볼 수 있습니다.
즉, 조인 조건이 꼭 "값이 같다(=)"일 필요는 없고, 상황에 따라 유연하게 조건을 적용할 수 있다는 점이 핵심입니다.
마무리
오늘은 기본 조인 외에 잘 쓰이지 않지만, 알아두면 좋은 조인들을 정리했습니다.
- NATURAL JOIN: 자동 매칭, 하지만 불명확해서 실무에서는 잘 안 씀
- CROSS JOIN: 모든 경우의 수 조합
- SELF JOIN: 자기 자신과 조인해 다양한 관점 제공
- FULL OUTER JOIN: LEFT + RIGHT 결과 합침
- Non-Equi JOIN: = 말고 다양한 조건 활용
👉 앞으로 SQL을 보다가 생소한 조인을 만나도 당황하지 않고, "아! 이런 조인이 있었지!" 하고 이해할 수 있을 거예요.
'컴퓨터 과학 > 데이터 베이스' 카테고리의 다른 글
| SQL 서브쿼리(Subquery)의 결과 형태 정리 (1) | 2025.08.18 |
|---|---|
| SQL 서브쿼리와 ANY, ALL 키워드 (3) | 2025.08.18 |
| SQL 문 작성 순서와 실제 실행 순서 완전 정리 (1) | 2025.08.17 |
| SQL에서 GROUP BY 사용 시 반드시 지켜야 할 규칙 (2) | 2025.08.17 |
| MySQL SUBSTRING 함수로 데이터 가공하기 (1) | 2025.08.17 |