목차
Self Join
셀프 조인은 말 그대로 나 자신과의 조인이다라고 할 수 있다. 조금 더 다르게 말하면...
**셀프 조인(Self Join)**은 하나의 테이블을 자기 자신과 조인하는 방식이다.
같은 테이블 내에서 행들끼리의 관계(예: 부모-자식, 멘토-멘티, 선배-후배 등)를 표현할 때 사용한다.
students 테이블 | |||
id | name | class | mentor_id |
1 | 철수 | 1 | NULL |
2 | 영희 | 1 | 1 |
3 | 민수 | 2 | 1 |
4 | 지수 | 2 | 2 |
5 | 나리 | 3 | 3 |
- mentor_id는 멘토의 id를 가리킴
- 학생과 학생(같은 테이블) 간의 관계를 나타냄
멘토-멘티 관계 구하기
SELECT mentee.name AS 멘티,
mentor.name AS 멘토
FROM students mentee
JOIN students mentor
ON mentee.mentor_id = mentor.id;
--
멘티 | 멘토
------+------
영희 | 철수
민수 | 철수
지수 | 영희
나리 | 민수
- 같은 students 테이블을 mentee, mentor라는 두 개의 별칭으로 나누어 사용
- mentee.mentor_id = mentor.id → 멘티가 참조하고 있는 멘토의 id를 기준으로 연결
- 실제로는 한 테이블에서 다른 행을 참조하는 관계를 찾는 방식
employees 테이블 (상사-부하 관계 (부서장-직원)) | |||
id | name | department | manager_id |
1 | 철수 | 개발팀 | NULL |
2 | 영희 | 개발팀 | 1 |
3 | 민수 | 기획팀 | 1 |
4 | 지수 | 기획팀 | 3 |
5 | 나리 | 디자인팀 | 3 |
부하 직원과 상사 이름을 함께 조회
SELECT e.name AS 직원,
m.name AS 상사
FROM employees e
JOIN employees m
ON e.manager_id = m.id;
--
직원 | 상사
------+------
영희 | 철수
민수 | 철수
지수 | 민수
나리 | 민수
- manager_id는 employees.id를 참조
- 자기 자신과 조인해서, 상사의 이름을 가져옴
이전 학생과 점수 차이 비교
students 테이블 | ||
id | name | score |
1 | 철수 | 85 |
2 | 영희 | 90 |
3 | 민수 | 92 |
4 | 지수 | 95 |
5 | 나리 | 100 |
SELECT curr.name AS 현재학생,
prev.name AS 이전학생,
curr.score - prev.score AS 점수차
FROM students curr
JOIN students prev
ON curr.id = prev.id + 1;
--
현재학생 | 이전학생 | 점수차
--------+----------+-------
영희 | 철수 | 5
민수 | 영희 | 2
지수 | 민수 | 3
나리 | 지수 | 5
- id 기준으로 이전 학생과 현재 학생을 연결
- 점수 차이 계산 가능
- 이 방식은 LAG() 윈도우 함수 대신 쓸 수 있음 (윈도우 함수 못 쓸 때 유용)
728x90