패스트캠퍼스 데브캠프 : 남궁성의 백엔드 개발 3기
토이 프로젝트 1 | 상품의 분류를 나눈 카테고리를 셀프조인으로 짜기
Tech_JINI
2025. 3. 12. 11:38
셀프 조인(Self Join)을 사용하는 이유
Self Join은 같은 테이블을 두 번 이상 사용하여 자기 자신과 조인하는 방식이다.
특히, 계층적인 관계(Hierarchical Relationship)를 표현할 때 유용하다.
이제, 왜 Self Join을 사용하는지 구체적으로 알아보자.
1. 계층적 데이터 표현 (Hierarchical Data)
쇼핑몰의 카테고리, 회사 조직도, 댓글 대댓글처럼 상위-하위 관계를 표현할 때 사용한다.
📌 예제: 쇼핑몰 카테고리
SELECT c1.id AS category_id, c1.name AS category_name, c2.id AS parent_id, c2.name AS parent_name
FROM category c1
LEFT JOIN category c2 ON c1.parent_id = c2.id;
📌 왜 Self Join을 사용할까?
- 같은 테이블 내에서 부모 카테고리를 참조하는 구조이기 때문이다.
- LEFT JOIN을 사용하여 **최상위 카테고리(NULL)**도 포함할 수 있다.
2. 자기 참조 관계(Self-Referencing Relationship)
- 조직도(Organization Chart): 팀원들이 상사를 가리키는 구조
- 친구 관계(Social Network Friends): 한 사람이 다른 사람과 연결되는 구조
- 제품 카테고리(Product Categories): 하위 카테고리가 상위 카테고리를 가리키는 구조
📌 예제: 회사 조직도
SELECT e1.id AS employee_id, e1.name AS employee_name, e2.id AS manager_id, e2.name AS manager_name
FROM employees e1 LEFT JOIN employees e2 ON e1.manager_id = e2.id;
📌 왜 Self Join을 사용할까?
- employees 테이블에서 manager_id는 다른 직원(employee_id)을 참조하기 때문.
- Self Join을 하면 직원과 매니저 간의 관계를 조회할 수 있다.
3. 관련 데이터 비교 (Comparing Related Data)
하나의 테이블에서 특정 값들을 비교할 때 사용한다.
📌 예제: 같은 카테고리에 속한 상품 비교
SELECT e1.id AS employee_id, e1.name AS employee_name, e2.id AS manager_id, e2.name AS manager_name
FROM employees e1 LEFT JOIN employees e2 ON e1.manager_id = e2.id;
📌 왜 Self Join을 사용할까?
- p1과 p2를 같은 category_id 기준으로 매칭하여 같은 카테고리에 속한 다른 제품을 비교할 수 있다.
- p1.id < p2.id 조건을 추가해 중복을 방지한다.
4. 특정 조건을 만족하는 데이터 찾기
두 개의 레코드 간 순서나 조건을 비교할 때 Self Join을 활용할 수 있다.
📌 예제: 가장 높은 급여를 받는 직원 찾기
SELECT e1.name, e1.salary
FROM employees e1 LEFT JOIN employees e2 ON e1.salary < e2.salary
WHERE e2.salary IS NULL;
📌 왜 Self Join을 사용할까?
- e1.salary < e2.salary를 통해 e1보다 더 높은 급여를 받는 사람이 있는지 확인한다.
- e2.salary IS NULL이면 최고 급여를 받는 직원이라는 뜻.
🚀 정리: 왜 Self Join을 사용할까?
계층적 데이터 (카테고리, 조직도) | 부모-자식 관계를 표현 |
자기 참조 관계 (직원-매니저, 친구 관계) | 같은 테이블 내에서 관계 설정 |
데이터 비교 (같은 카테고리 제품, 중복 데이터 확인) | 한 테이블 내에서 특정 조건 비교 |
특정 데이터 찾기 (최고 급여 직원, 최근 구매한 상품) | 특정 값이 최대/최소인지 확인 |