티스토리 뷰
셀프 조인이란 무엇인가?
먼저 개념부터 정리해보자.
셀프 조인(Self Join)은 하나의 테이블을 자기 자신과 조인하는 것을 말한다.
즉, 같은 테이블을 두 번 불러와서 서로 연결하는 거다.
조인이라고 하면 원래는 두 개의 다른 테이블을 엮는다고 생각하기 쉽지만, 가끔은 같은 테이블 안에서 서로 연결해야 할 때가 있다.
그럴 때 셀프 조인을 쓰는 거다.
셀프 조인이 필요한 상황
셀프 조인은 계층적 관계를 표현하거나, 같은 테이블 내의 값들을 비교할 때 주로 쓰인다. 예시를 들어보자.
1. 상사-직원 관계 (계층 구조)
가장 대표적인 예가 상사-직원 관계다.
아래처럼 EMPLOYEE라는 테이블이 있다고 해보자.
| EMP_ID | EMP_NAME | MANAGER_ID |
| 1 | 홍길동 | NULL |
| 2 | 이몽룡 | 1 |
| 3 | 성춘향 | 1 |
| 4 | 김철수 | 2 |
- MANAGER_ID는 직원의 상사의 ID를 나타낸다.
예를 들어 각 직원이 누구의 부하인지 알아보고 싶다면,
자기 자신과 같은 테이블을 조인해야 한다.
왜냐면 상사의 이름도 EMPLOYEE 테이블 안에 있기 때문이다.
이걸 SQL로 어떻게 쓸까?
SELECT
E.EMP_NAME AS EMPLOYEE,
M.EMP_NAME AS MANAGER
FROM
EMPLOYEE E
LEFT JOIN
EMPLOYEE M
ON E.MANAGER_ID = M.EMP_ID;
- EMPLOYEE 테이블을 E라는 이름으로 불러오고,
- 똑같은 EMPLOYEE 테이블을 M이라는 이름으로 한 번 더 불러온다.
- E의 MANAGER_ID와 M의 EMP_ID를 연결한다.
실행 결과는 아래처럼 나온다.
| EMPLOYEE | MANAGER |
| 홍길동 | NULL |
| 이몽룡 | 홍길동 |
| 성춘향 | 홍길동 |
| 김철수 | 이몽룡 |
이렇게 하면 같은 테이블 안의 계층 구조를 풀어낼 수 있다.
2. 같은 테이블의 값 비교
또 다른 예시를 들어보자.
같은 테이블 안에서 특정 조건을 만족하는 쌍(pair) 을 찾고 싶을 때가 있다.
예를 들어 PRODUCT 테이블이 있다고 하자.
| PROD_ID | PROD_NAME | PRICE |
| 1 | 상품A | 1000 |
| 2 | 상품B | 2000 |
| 3 | 상품C | 1000 |
| 4 | 상품D | 3000 |
같은 가격의 상품끼리 묶어보고 싶다면 어떻게 할까?
이때도 셀프 조인이 필요하다.
SELECT
P1.PROD_NAME AS PRODUCT_1,
P2.PROD_NAME AS PRODUCT_2,
P1.PRICE
FROM
PRODUCT P1
JOIN
PRODUCT P2
ON P1.PRICE = P2.PRICE
AND P1.PROD_ID < P2.PROD_ID;
- PRODUCT 테이블을 두 번 불러와서 P1, P2라는 별칭을 준다.
- 가격이 같은지 비교한다.
- 같은 쌍이 두 번 나오지 않도록 P1.PROD_ID < P2.PROD_ID 조건을 추가한다.
결과는 이렇게 나온다.
| PRODUCT_1 | PRODUCT_2 | PRICE |
| 상품A | 상품C | 1000 |
셀프 조인의 주의할 점
셀프 조인을 쓸 때 몇 가지 주의해야 할 점이 있다.
- 별칭(Alias)을 꼭 써야 한다
- 같은 테이블을 두 번 불러오기 때문에 이름 충돌이 일어난다.
- 별칭을 안 쓰면 어떤 컬럼이 어느 테이블에서 왔는지 헷갈린다.
- 카디널리티 주의
- 조인 조건이 잘못되면 데이터가 기하급수적으로 늘어날 수 있다.
- 특히 계층 구조를 풀 때 잘못 걸면 자기 자신과 무한히 매칭되기도 하니 조심하자.
셀프 조인을 언제 쓰면 좋은가?
정리해보자.
- 상사-부하 관계, 부서-상위 부서 처럼 계층 구조를 풀어야 할 때
- 같은 테이블 안에서 특정 조건을 만족하는 쌍을 찾을 때
- 과거와 현재 데이터를 같은 테이블 안에서 비교해야 할 때
이럴 때 셀프 조인이 빛을 발한다.
마무리하며
셀프 조인은 처음 들으면 조금 낯설지만, 사실 엄청 유용한 기법이다.
같은 테이블 안에서 관계를 찾아야 할 때가 은근히 많다.
이럴 때 셀프 조인을 쓰면 깔끔하고 효율적인 SQL을 작성할 수 있다.
꼭 기억하자.
셀프 조인은 같은 테이블을 두 번 불러와서 서로 연결하는 것이다.
별칭을 써야 하고, 조인 조건을 잘 정해야 한다.
이제 다음에 계층 구조나 테이블 내 값 비교가 필요할 때, 셀프 조인을 자신 있게 써보자!
'프로그래밍 > database' 카테고리의 다른 글
| [스프링 부트와 AWS로 혼자 구현하는 웹서비스] gitignore 등록하는법 (0) | 2022.08.02 |
|---|---|
| [h2 database] h2 데이터베이스 생성하는 방법 (0) | 2022.08.01 |
- Total
- Today
- Yesterday
- 코틀린
- hackerrank
- 자바
- 22 정보처리 산업기사
- 해커랭크 자바
- 자바의 정석
- 알고리즘
- 소스코드
- Spring Security
- challenges
- Java
- ORM
- 이코테
- 해커랭크 자바 챌린지
- hackerrank challenges
- 그리디
- 해커랭크 챌린지
- 강의
- Kotlin
- 정보처리산업기사
- 22 정보처리산업기사
- 챌린지
- 정보처리 산업기사
- 해커랭크
- 백준
- JPA
- 정보처리산업기사 공부법
- 디버깅
- 코드
- 풀이
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |