Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

데이터 분석가로 살아남기

[LeetCode] 181. Employees Earning More Than Their Managers - MySQL 풀이 본문

SQL

[LeetCode] 181. Employees Earning More Than Their Managers - MySQL 풀이

junbro 2023. 5. 31. 22:03

안녕하세요, 준브로입니다. 

오늘은 코딩테스트 플랫폼인 Leetcode에서 181. Employees Earning More Than Their Managers 문제를 풀이해 보도록 하겠습니다. 

 

JOIN을 처음 배울 때 헷갈리는 경우가 있는데, 

테이블이 2개 이상일 때보다 테이블이 한 개만 존재할 때 더욱 그런 것 같습니다. 

 

 

이 문제는 테이블이 한 개일 때 어떻게 SELF JOIN을 하면서 문제를 해결해야 하는지 고민할 수 있는 좋은 문제라고 생각하기 때문에 

저 또한 여러번 문제를 풀어보기 위해 블로그에 정리해 봅니다! 

 

문제 설명

SQL Schema

Create table If Not Exists Employee (id int, name varchar(255), salary int, managerId int)
Truncate table Employee
insert into Employee (id, name, salary, managerId) values ('1', 'Joe', '70000', '3')
insert into Employee (id, name, salary, managerId) values ('2', 'Henry', '80000', '4')
insert into Employee (id, name, salary, managerId) values ('3', 'Sam', '60000', 'None')
insert into Employee (id, name, salary, managerId) values ('4', 'Max', '90000', 'None')

 

Write an SQL query to find the employees who earn more than their managers.

Return the result table in any order.

The query result format is in the following example.

문제 해석

  • employee 테이블에는 4개의 컬럼이 존재합니다. 각각 직원 id, 이름, 급여, 담당 매니저 id 
  • 담당 매니저보다 더 수입이 많은 직원들의 목록을 추출하는 쿼리를 작성하는 문제입니다. 
  • 직원 id는 모든 직원들에게 발급되므로, 그 중에서는 일반 직원과 매니저를 담당하고 있는 직원 모두 포함되어 있습니다. 

문제 풀이

이 문제에 접근할 때, 어떻게 하면 SELF JOIN을 통해 문제를 풀이할 수 있을까요? 

 

 

먼저, 기존의 employee 테이블을 e로 지칭하고 employee 테이블과 SELF로 INNER JOIN해 줍니다. 

이때, JOIN하는 employee 테이블을 m으로 지정해줍니다. 

(e - 직원 / m - 매니저 정보)

 

 

여기서 JOIN 조건을 어떻게 두는지가 중요한데요, 

e 테이블의 managerid 컬럼과 m 테이블의 id 를 JOIN해 주시면 됩니다. 

이렇게 조인을 해 주셔야 직원들의 정보 중  managerid 뒤에 그에 맞는 매니저들의 정보가 조회될 수 있습니다. 

 

 

마무리로 WHERE절에서는 e.salary(직원의 급여)가 m.salary(매니저의 급여) 보다 높게끔 필터링을 해주시면 됩니다.

아래 코드를 참고해주세요.

SELECT e.name AS Employee  -- 문제 예시에 주어진 alias 통일
FROM employee AS e
    INNER JOIN employee AS m ON e.managerid = m.id  -- 직원 테이블과 매니저 테이블 JOIN
WHERE e.salary > m.salary  -- 직원 급여 > 매니저 급여 필터링

 

실행 결과 정상적으로 작동하는 것을 확인할 수 있으며, 이대로 제출해 주시면 됩니다. 

다음에도 SQL 코딩테스트 문제로 찾아뵙겠습니다. 감사합니다 :)