코딩 스쿨 SQL

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

SQL Self Join

SQL SELF JOIN: 자기 자신과의 JOIN

SQL SELF JOIN같은 테이블 내에서 두 개의 행을 서로 비교할 때 사용되는 JOIN입니다. SELF JOIN은 하나의 테이블을 두 개의 다른 테이블처럼 취급하여, 그 테이블의 데이터를 자기 자신과 결합할 수 있습니다. 이를 통해 테이블의 데이터를 비교하거나 특정 관계를 조회할 수 있습니다. SELF JOIN은 다른 JOIN과 동일한 방식으로 작동하지만, 같은 테이블을 두 번 사용한다는 점에서 차이가 있습니다.

1. 기본 SELF JOIN 문법

SELECT A.열이름, B.열이름
FROM 테이블이름 A
JOIN 테이블이름 B ON A.열 = B.열;

  • 테이블이름 A테이블이름 B는 같은 테이블입니다. 이 테이블에 각각 AB라는 별칭을 부여하여 두 개의 다른 테이블처럼 취급합니다.
  • ON: 두 개의 테이블에서 비교할 조건을 명시합니다.

2. SQL SELF JOIN 예제

2.1 상사-부하 관계 조회

다음은 employees 테이블에서 직원의 상사와 부하 관계를 조회하는 예제입니다. manager_id상사의 ID를 가리키는 외래 키라고 가정합니다.

SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
JOIN employees e2 ON e1.manager_id = e2.id;

이 쿼리는 자기 자신과의 JOIN을 사용하여 직원과 상사 간의 관계를 보여줍니다.

결과 예시:

employee manager
John Jane
Alice John
Bob John

3. SELF JOIN과 WHERE 절 사용

SELF JOIN과 WHERE 절을 함께 사용하여 데이터를 필터링할 수 있습니다.

예제: 동일한 부서에서 근무하는 직원 쌍 조회

다음은 동일한 부서에 근무하는 직원 쌍을 조회하는 예제입니다. 이 예제에서는 같은 부서에 있는 직원끼리의 관계를 찾고, 동일한 직원 간의 중복을 피하기 위해 id 값이 서로 다른 조건을 추가합니다.

SELECT e1.name AS employee1, e2.name AS employee2
FROM employees e1
JOIN employees e2 ON e1.department_id = e2.department_id
WHERE e1.id < e2.id;

이 쿼리는 같은 부서에 있는 직원 쌍을 찾으며, 자기 자신과 비교하는 행을 제거하기 위해 **e1.id < e2.id** 조건을 사용합니다.

결과 예시:

employee1 employee2
John Alice
John Bob
Alice Bob

4. SELF JOIN과 집계 함수 결합

SELF JOIN은 집계 함수와 결합하여 데이터를 비교하는 데 사용할 수 있습니다.

예제: 동일한 부서에 속한 직원 중 급여가 더 높은 직원 찾기

다음은 같은 부서에 속한 직원들 중 급여가 더 높은 직원을 찾는 예제입니다.

SELECT e1.name AS higher_paid_employee, e1.salary
FROM employees e1
JOIN employees e2 ON e1.department_id = e2.department_id
WHERE e1.salary > e2.salary;

이 쿼리는 같은 부서에서 급여가 더 높은 직원을 반환합니다.

결과 예시:

higher_paid_employee salary
John 7000
Alice 6500

5. SELF JOIN과 NULL 값 처리

SELF JOIN을 수행할 때, NULL 값이 포함된 경우를 처리해야 할 수 있습니다. 특히 테이블 내의 일부 열이 NULL 값을 포함할 수 있는 경우, IS NULL이나 COALESCE() 함수를 사용하여 NULL 값을 처리합니다.

예제: 상사가 없는 직원 찾기 (SELF JOIN에서 NULL 값 처리)

SELECT e1.name AS employee
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id
WHERE e1.manager_id IS NULL;

이 쿼리는 상사가 없는 직원(즉, manager_idNULL인 직원)을 반환합니다.

결과 예시:

employee


Jane


Michael


6. SELF JOIN을 사용할 때의 주의 사항

  • 별칭 사용: 같은 테이블을 두 번 사용하기 때문에, 각 테이블에 별칭을 부여하여 구분해야 합니다. 별칭을 사용하면 쿼리가 더 읽기 쉬워집니다.
  • 데이터 중복 제거: 동일한 테이블을 조인할 때 데이터가 중복될 수 있으므로, WHERE 절을 사용하여 중복된 데이터를 필터링할 수 있습니다. 예를 들어, id가 동일한 행은 제외해야 할 수 있습니다.
  • 성능 주의: 테이블 크기가 클 경우 SELF JOIN은 성능에 영향을 미칠 수 있습니다. 필요한 데이터만 조회하거나 적절한 인덱스를 설정하여 성능을 최적화할 수 있습니다.

7. SELF JOIN과 대소문자 구분

SQL에서 SELF JOIN은 기본적으로 대소문자를 구분하지 않습니다. 즉, 문자열 비교에서 Johnjohn은 동일하게 처리됩니다. 대소문자를 구분해야 하는 경우 BINARYCOLLATE 키워드를 사용할 수 있습니다.

8. SELF JOIN의 활용 사례

SELF JOIN은 다음과 같은 경우에 유용하게 사용됩니다:

  • 계층적 데이터 분석: 상사-부하 관계, 제품 카테고리와 하위 카테고리 등의 계층적 데이터 구조를 분석할 때.
  • 자체 데이터 비교: 동일한 테이블 내에서 특정 조건에 따라 데이터를 비교할 때, 예를 들어 동일한 부서 내 직원 간의 비교.
  • 일정 데이터의 비교: 같은 테이블에서 과거와 현재 데이터를 비교하거나, 특정 기간 내의 데이터 변화 분석.

9. 실전 예제

예제 1: 상사-부하 관계 조회

SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
JOIN employees e2 ON e1.manager_id = e2.id;

이 쿼리는 직원과 상사의 관계를 보여줍니다.

예제 2: 동일한 부서에 속한 직원 쌍 조회

SELECT e1.name AS employee1, e2.name AS employee2
FROM employees e1
JOIN employees e2 ON e1.department_id = e2.department_id
WHERE e1.id < e2.id;

이 쿼리는 같은 부서에 속한 직원 쌍을 반환합니다.

예제 3: 같은 부서에서 급여가 더 높은 직원 조회

SELECT e1.name AS higher_paid_employee, e1.salary
FROM employees e1
JOIN employees e2 ON e1.department_id = e2.department_id
WHERE e1.salary > e2.salary;

이 쿼리는 같은 부서에서 급여가 더 높은 직원을 반환합니다.

10. 요약

SQL SELF JOIN은 같은 테이블을 자기 자신과 결합하여 데이터를 비교할 때 유용하게 사용됩니다. 이는 같은 테이블 내에서 특정 조건을 기준으로 데이터를 비교하거나, 계층적 데이터를 처리할 때 매우 효과적입니다. SELF JOIN은 다른 JOIN과 마찬가지로 ON 절을 통해 두 테이블 간의 연결 조건을 설정하며, 별칭을 사용하여 테이블을 구분해야 합니다. 상사-부하 관계 조회, 자체 데이터 비교, 그리고 계층적 데이터 분석 등에서 자주 사용됩니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com