SQL 공부 4일차 LEETCODE, 181. Employees Earning More Than Their Managers
다양성과 방향성

여행으로 재미있게 살고 엑셀로 성장하는 삶

직무강화/SQL

SQL 공부 4일차 LEETCODE, 181. Employees Earning More Than Their Managers

LATI 라티 2024. 8. 20. 22:35
반응형

 

오늘은 직원 중 MANAGER보다 월급을 더 많이 받는 사람을 

추출해야 하는 문제를 풀게 되었다.

 

사실 SELFT JOIN으로 테이블을 활용해야 하는건 대략 인지하고 있었으나,

왜 아래와 같은 쿼리로 작동이 되고 어떻게 기작이 이루어지는지 그려지지가 않아 너무 어려웠다.

1번 문제

 

 

SELF JOIN을 통해 2개의 테이블이 조건에 맞는 하나의 테이블로 만들어지게 되고

그 전체 테이블 안에서 필요한 조건에 따라 정보를 추출하는 것이었다.

 

일단, 눈치밥으로 문제는 풀었다. 결국 하고자 하는 건 각 직원에 매니저를 매칭하고 매니저의 봉급과 비교하는 것이기 때문이다.

SELECT a.name as employee
FROM Employee a
JOIN Employee b
ON a.managerid=b.id AND a.salary > b.salary

 

흠... 그냥 지문에 맞는 조건들을 나열하여 문제는 풀었는데 그려지지 않아 chat gpt에게 시각화해달라고 했다.

그 결과 Chat gpt가 아래와 같이 시각화를 해주었다.

 

 


 

시각화 예시

아래는 테이블이 어떻게 결합되고 필터링되는지에 대한 시각적 표현입니다.

Employee 테이블 예시 데이터

idnamesalarymanagerId

1 Jane 5000 NULL
2 John 6000 1
3 Alice 7000 1
4 Bob 4000 2

Self-Join 후 결합된 테이블

E.idE.nameE.salaryE.managerIdM.idM.nameM.salaryM.managerId

2 John 6000 1 1 Jane 5000 NULL
3 Alice 7000 1 1 Jane 5000 NULL
4 Bob 4000 2 2 John 6000 1

조건 필터링 (WHERE E.salary > M.salary)

E.idE.nameE.salaryE.managerIdM.idM.nameM.salaryM.managerId

2 John 6000 1 1 Jane 5000 NULL
3 Alice 7000 1 1 Jane 5000 NULL

결과적으로, 급여가 매니저보다 높은 직원들인 John과 Alice가 쿼리 결과로 출력됩니다.

최종 결과

Employee

John
Alice

이제 Self-Join과 쿼리의 결과를 이해하는데 도움이 되길 바랍니다.

 


 

그래서 결론은 JOIN으로 테이블들을 결합한 뒤 원하는 조건에 부합하는 값을 가져오는 것이었다.

 

1. JOIN으로 테이블을 결합해 1개의 테이블로 만들고

2. 조건에 맞는 값으로 전체 행을 불러오며

3. 불러오고 싶은 열을 불러오는 것

 

2번 문제

 

 

이 문제도 지지고 볶았는데 흠... 잘 모르겠다.

ORDER BY, DESC, LIMIT으로 1번째, 2번째 높은 값을 찾았는데 어떻게 2번째 값만 빼낼 수 있는지 모르겠다...

 

정답 A.

다른사람들의 답을 보니 OFFSET 을 통해 첫번째 행을 뛰어넘을 수 있다는 걸 알게 되었다.

SALARY DESC로 내림차순 정렬한 뒤 OFFSET 1로 최초 행을 건너 뛰고 LIMIT 1로 건너뛴 첫 행을 찾는 것

그렇게 한다면 2번째로 온 값이 나오게 된다.

 

다만, 여기서 문제가되는 것은 2번째에 값이 있을 땐 정답이지만, 값이 없을 땐 ""공백이 나와 오답이 된다.

따라서 서브쿼리로 묶어주면 문제가 해결되는 걸 알 수 있었다. 

 

* 서브쿼리는 단일 값을 가져오기 때문에 값이 있을 경우 "값" 없을 경우 "NULL"을 불러오게 된다.

* 2번째 값이 중복값이 있을 수 있으므로 중복값 제거도 꼭 해주어야 한다.

SELECT
  (SELECT DISTINCT Salary
   FROM Employee
   ORDER BY Salary DESC
   LIMIT 1 OFFSET 1)
AS SecondHighestSalary;
 

정답 B.

MAX를 활용해서 두번째 MAX 값을 찾는 것이다. 이건 기발하다고 느꼈다.

EXCEL을 사용했다면 나도 생각해볼법한 해답이었다...!

 

SELECT MAX(salary) as SecondHighestSalary
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee)

 

반응형