오늘은 직원 중 MANAGER보다 월급을 더 많이 받는 사람을
추출해야 하는 문제를 풀게 되었다.
사실 SELFT JOIN으로 테이블을 활용해야 하는건 대략 인지하고 있었으나,
왜 아래와 같은 쿼리로 작동이 되고 어떻게 기작이 이루어지는지 그려지지가 않아 너무 어려웠다.
1번 문제

SELF JOIN을 통해 2개의 테이블이 조건에 맞는 하나의 테이블로 만들어지게 되고
그 전체 테이블 안에서 필요한 조건에 따라 정보를 추출하는 것이었다.
일단, 눈치밥으로 문제는 풀었다. 결국 하고자 하는 건 각 직원에 매니저를 매칭하고 매니저의 봉급과 비교하는 것이기 때문이다.
흠... 그냥 지문에 맞는 조건들을 나열하여 문제는 풀었는데 그려지지 않아 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번째 값이 중복값이 있을 수 있으므로 중복값 제거도 꼭 해주어야 한다.
정답 B.
MAX를 활용해서 두번째 MAX 값을 찾는 것이다. 이건 기발하다고 느꼈다.
EXCEL을 사용했다면 나도 생각해볼법한 해답이었다...!
'직무강화 > SQL' 카테고리의 다른 글
SQL 학습 6일차, 183. Customers Who Never Order (NULL, LEFT JOIN) (0) | 2024.08.22 |
---|---|
SQL 학습일지 5일차, 리트코드 182. Duplicate Emails 중복값 찾기 (0) | 2024.08.21 |
SQL 3일차_LEETCODE. 175. Combine Two Tables (0) | 2024.08.20 |
SQL 공부 2일차_HackerRank(!=, CASE, JOIN, GROUP BY) (0) | 2024.08.18 |
SQL 어떻게 공부해야 할까? Khan Academy로 복기! (0) | 2024.08.17 |