카테고리 없음

#21 셀프 조인(Self Join)

sundori 2025. 4. 15. 18:13

목차

    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