Skip to content

Latest commit

 

History

History
224 lines (147 loc) · 6.83 KB

File metadata and controls

224 lines (147 loc) · 6.83 KB

SQL_ADVANCED 5주차 정규 과제

Week 5 : 계층형 질의 & 셀프 조인

📌SQL_ADVANCED 정규과제는 매주 정해진 주제에 따라 MySQL 공식 문서 또는 한글 블로그 자료를 참고해 개념을 정리한 후, 프로그래머스 SQL 문제 3문제추가 확인문제를 직접 풀어보며 학습하는 과제입니다.

이번 주는 아래의 SQL_ADVANCED_5th_TIL에 나열된 주제를 중심으로 개념을 학습하고, 주차별 학습 목표에 맞게 정리해주세요. 정리한 내용은 GitHub에 업로드한 후, 스프레드시트의 'SQL' 시트에 링크를 제출해주세요.

(수행 인증샷은 필수입니다.)

프로그래머스 문제를 풀고 '정답입니다' 문구를 캡쳐해서 올려주시면 됩니다.

SQL_ADVANCED_5th

15.2.20 WITH (Common Table Expressions)

  • 재귀 CTE를 통한 계층형 구조 탐색 방법을 중심으로 학습해주세요.

Self Join은 따로 MySQL 공식문서가 없습니다. 다른 블로그나 유튜브 영상을 참고하여 스스로 학습하고, 넣어주세요.

🏁 강의 수강 (Study Schedule)

주차 공부 범위 완료 여부
1주차 서브쿼리 & CTE
2주차 집합 연산자 & 그룹 함수
3주차 윈도우 함수
4주차 Top N 쿼리
5주차 계층형 질의와 셀프 조인
6주차 PIVOT / UNPIVOT 🍽️
7주차 정규 표현식 🍽️

공식 문서 활용 팁

MySQL 공식 문서는 영어로 제공되지만, 크롬 브라우저에서 공식 문서를 열고 이 페이지 번역하기에서 한국어를 선택하면 번역된 버전으로 확인할 수 있습니다. 다만, 번역본은 문맥이 어색한 부분이 종종 있으니 영어 원문과 한국어 번역본을 왔다 갔다 하며 확인하거나, 교육팀장의 정리 예시를 참고하셔도 괜찮습니다.

1️⃣ 학습 내용

아래의 링크를 통해 MySQL 공식문서로 이동하실 수 있습니다.

  • 15.2.20 WITH (Common Table Expressions) : MySQL 공식문서

https://dev.mysql.com/doc/refman/8.0/en/with.html

(한국어 버전) https://dart-b-official.github.io/posts/mysql-RecursiveWith/



2️⃣ 학습 내용 정리하기

1. 계층형 질의 (WITH RECURSIVE)

✅ 학습 목표 :
* 'WITH RECURSIVE' 문법을 활용해 계층형 구조를 탐색할 수 있다.

재귀 공통 테이블 표현식(RECURSIVE CTE)

  • 자신의 이름을 참조하는 서브쿼리를 가진 CTE
  • 자기 자신을 참조하는 CTE라면 WITH RECURSIVE로 시작

예시

단순 수열

WITH RECURSIVE cte(n) AS (
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM cte WHERE n < 5
)
SELECT * FROM cte;

피보나치 수열

WITH RECURSIVE fibonacci(n, fib_n, next_fib_n) AS (
  SELECT 1, 0, 1
  UNION ALL
  SELECT n + 1, next_fib_n, fib_n + next_fib_n
  FROM fibonacci
  WHERE n < 10
)
SELECT * FROM fibonacci;

2. 셀프 조인 (SELF JOIN)

✅ 학습 목표 :
* 같은 테이블 내에서 상호 관계를 탐색할 수 있는 셀프 조인의 구조를 이해하고 사용할 수 있다. 
  • JOIN은 공통된 열을 기점으로 테이블을 합치는 것
  • 같은 열에서 찾고자하는 정보가 있을 때 SELF JOIN을 사용
SELECT E.EmployeeName AS Employee, M.EmployeeName AS Manager
FROM Employees E
JOIN Employees M ON E.ManagerID = M.EmployeeID



3️⃣ 실습 문제

문제

LeetCode 181. Employees Earning More Than Their Managers

학습 포인트 : 동일 테이블을 두 번 조인 (왜 동일 테이블을 JOIN 해야하는 문제일까)

LeetCode 608. Tree Node

학습 포인트 : id, parent_id 기반의 트리 구조에서 부모 ~ 자식 관계 재귀 탐색

Hint : (문제 해석)

  • 어떤 노드가 Root Node 이려면, 부모노드가 존재하지 않아야 한다.
  • 어떤 노드가 Inner Node 이려면, 나를 부모로 가지는 노드가 하나 이상 존재하여야 한다.
    • 그 외네는 모두 Leaf Node 이다. --> (CASE 문을 사용하는 것을 추천드립니다.)

프로그래머스 : 저자 별 카테고리 별 매출액 집계하기

학습 포인트 : 카테고리와 서브카테고리 계층 구조를 분석하는 로직, SELF JOIN / CTE를 다 활용할 수 있다.

  • 위에 2가지의 문제를 풀어보고 난 이후, 더 편리한 방법으로 문제를 풀어보세요.

문제 인증란

image image

확인문제

문제 1

🧚윤서는 어떤 기업의 조직 구조를 분석하는 SQL 쿼리를 작성하고 있습니다. 각 직원은 상위 관리자 ID(manager_id)를 가지며, 조직도는 같은 Employees 테이블 내에서 계층적으로 연결됩니다. 윤서는 최상위 관리자부터 각 사원까지의 계층 깊이(depth)를 계산하고자 다음과 같은 SELF JOIN 기반 쿼리를 시도했습니다.

SELECT e1.id, e1.name, e2.name AS manager_name
FROM Employees e1
LEFT JOIN Employees e2 ON e1.manager_id = e2.id;

쿼리를 잘 작성했다고 생각을 했지만, 막상 실행을 해보니 1단계 매니저까지만 추적할 수 있어 계층 구조의 전체를 표현하는데 한계가 존재했습니다. 이에 여러분에게 다음과 같은 미션을 요청합니다. WITH RECURSIVE를 활용하여 최상위 관리자부터 시작해 각 직원까지의 조직 구조 계층 깊이(depth)를 구하고, 결과를 depth가 높은 순으로 정렬하는 쿼리를 작성하세요.

WITH RECURSIVE org AS (
  SELECT
    id,
    name,
    manager_id,
    1 AS depth
  FROM Employees
  WHERE manager_id IS NULL

  UNION ALL

  SELECT
    e.id,
    e.name,
    e.manager_id,
    o.depth + 1 AS depth
  FROM Employees e
  JOIN org o
    ON e.manager_id = o.id
)
SELECT
  o.id,
  o.name,
  m.name AS manager_name,  
  o.depth
FROM org o
LEFT JOIN Employees m ON m.id = o.manager_id
ORDER BY o.depth DESC, o.id;


참고자료

https://step-by-step-digital.tistory.com/101


🎉 수고하셨습니다.