ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SQL] data.world tutorial SQL SELF JOIN 예제 풀이
    데이터 분석/DB & SQL 2020. 5. 1. 08:49

    SELF JOIN
    나는 업무하면서 SELF JOIN 을 써보지는 못했다. 하지만 원리상 언젠가는 필요할테니까 살펴보자.

    https://docs.data.world/documentation/sql/concepts/intermediate/Joins.html

     

    Joins

    Learn how to JOIN multiple tables in this SQL tutorial. Visit for a full course on learning the basics of SQL.

    docs.data.world

     

    SELF JOIN 의 원리 1줄 정리

    A self join is useful when a table has the values from one column re-used in another column. 

    한 테이블의 값이 다른 컬럼에서 재사용될 때 유용하다.
    즉, 기준 테이블과 불러올 데이터가 있는 대상테이블이 동일할 때 사용한다.

     


    1. 요구사항을 검토한다. 

    list of all the employees with their managers names

    - 모든 직원들의 리스트를 원하는데
    - 그들의 매니저 이름도 옆에 붙여주세요. (그리고 이 매니저도 직원이지!!!)

     

    2. Dataset 을 확인한다.

    - 모든 직원 정보 employees
    - employees 의 식별자 id 는 5자리로, 10001 부터 시작한다. 
    - 모든 직원은 매니저 id: mgr_id 를 갖고 있다. 
    - 더 이상 위에 매니저가 없는 경우 (최종 보스) 의 mgr_id '1' 로 표시했다.

    우리가 뽑고싶어 하는 컬럼의 값의 분포도나 양상을 살펴보는 것은 중요하다. 
    또한 보통 식별자가 어떻게 구성되어있는지 보는 것이 중요하다. (정상 식별자와 아닌 식별자의 생김새가 다를 경우도 있기 때문)

    덕분에 직원 식별자 5자리가 아닌 '1' 이라는 값이 들어간 행이 있는 점을 확인할 수 있었다. 그리고 매니저가 없는 직원 (최종보스) 로 유추해낼 수 있었다. 

    SELECT * FROM employees
    --  총 41 명의 직원, 음 mgr_id 에 1을 발견!

    SELECT * FROM employees
    WHERE mgr_id IN (
               SELECT * FROM employees
                )
    --- 매니저를 가진 직원 수 35명

    SELECT * FROM employees
    WHERE mgr_id NOT IN (
            SELECT * FROM employees
            )

    --  매니저를 가지지 않는 직원수 6명 (최종보스)

     

    3. 여러 테이블을 JOIN 한다. JOIN 방식 검토

    기준 테이블: 모든 employees 가 있는 테이블, employees
    부가 테이블: 매니저 정보가 있는 테이블, employees (하지만 기준테이블과 구분하기 위해 manager 로 별명지어주었다.) 

    기준 테이블은 우리가 데이터를 분석하는데 사용되는 기준이 되는 테이블이고
    부가 테이블은 기준 테이블의 데이터를 중심으로 JOIN 대상이 되는 테이블로, 땡겨오고 싶은 데이터가 있는 테이블이다.
    둘다 employees 이므로, 서로 다른 테이블의 데이터를 연결하는 것 처럼 연결해준다.

    실제로 SELF JOIN 이라는 키워드는 없다. 

    SELECT *
    FROM employees AS emp
    JOIN employees AS mgr ON emp.mgr_id = mgr.emp_id

     

    4. 추출 대상 컬럼을 지정한다.

    - list of all the employees with their managers names

    직원명과 매니저명 을 나란이 붙여주면 된다. 
    사실 현실세계에서는 직원명이 일치할 수도 있으므로 (동명이인) id 정보를 붙여주는게 좋다. 유니크한 식별자는 언제나 중요하다.

    결론. 추출대상컬럼: employees.name, manager.name (사실은 employees.name 이지만)

    SELECT emp.name, mgr.name
    FROM employees AS emp
    JOIN employees AS mgr ON emp.mgr_id = mgr.emp_id

     

    5. (선택) 최종 조회결과의 컬럼명과 데이터타입을 확인한다.

    emp.name 은 employee, mgr.name 는 manager 로 컬럼명을 깔끔하게 처리하자.
    그리고 두 컬럼 모두 STRING 값이니, 데이터타입은 변환이 불필요하다. 

     

    최종 쿼리

    SELECT emp.name AS employee, mgr.name AS manager
    FROM employees AS emp
    JOIN employees AS mgr ON emp.mgr_id = mgr.emp_id


     

    어쩌다 보니 SELF JOIN 보다는 테이블을 탐구하는 방법을 더 자세하게 다루었다 ㅇ__ㅇㅎ

    댓글

Designed by Tistory.