백엔드 부트캠프[사전캠프]/문제풀이
[SQL 달리기반] Lv4. 가장 높은 월급을 받는 직원은?
s_y_130
2025. 6. 19. 15:56
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name VARCHAR(50),
Department VARCHAR(50),
Salary INT,
ManagerID INT,
FOREIGN KEY (ManagerID) REFERENCES Employees(EmployeeID)
);
INSERT INTO Employees (EmployeeID, Name, Department, Salary, ManagerID) VALUES
(1, 'Alice', 'HR', 70000, NULL),
(2, 'Bob', 'IT', 90000, 1),
(3, 'Charlie', 'IT', 80000, 2),
(4, 'David', 'IT', 85000, 2),
(5, 'Eve', 'HR', 75000, 1),
(6, 'Frank', 'Finance', 95000, NULL),
(7, 'Grace', 'Finance', 80000, 6),
(8, 'Heidi', 'IT', 95000, 2);
Employees 테이블:
EmployeeID
|
Name
|
Department
|
Salary
|
ManagerID
|
1
|
Alice
|
HR
|
70000
|
NULL
|
2
|
Bob
|
IT
|
90000
|
1
|
3
|
Charlie
|
IT
|
80000
|
2
|
4
|
David
|
IT
|
85000
|
2
|
5
|
Eve
|
HR
|
75000
|
1
|
6
|
Frank
|
Finance
|
95000
|
NULL
|
7
|
Grace
|
Finance
|
80000
|
6
|
8
|
Heidi
|
IT
|
95000
|
2
|
✅요구사항:
1. 각 직원의 이름, 부서, 월급, 그리고 그 직원이 속한 부서에서 가장 높은 월급을 받고 있는 직원의 이름과 월급을 조회하는 SQL 쿼리를 작성해주세요.
- 기대결과
Name
|
Department
|
Salary
|
Top_Earner
|
Top_Salary
|
Alice
|
HR
|
70000
|
Eve
|
75000
|
Bob
|
IT
|
90000
|
Heidi
|
95000
|
Charlie
|
IT
|
80000
|
Heidi
|
95000
|
David
|
IT
|
85000
|
Heidi
|
95000
|
Eve
|
HR
|
75000
|
Eve
|
75000
|
Frank
|
Finance
|
95000
|
Frank
|
95000
|
Grace
|
Finance
|
80000
|
Frank
|
95000
|
Heidi
|
IT
|
95000
|
Heidi
|
95000
|
2. 부서별로 평균 월급이 가장 높은 부서의 이름과 해당 부서의 평균 월급을 조회하는 SQL 쿼리를 작성해주세요.
- 기대결과
Department
|
Avg_Salary
|
IT
|
87500
|
✅제약사항:
두 쿼리 모두 서브쿼리, JOIN, GROUP BY, HAVING 등의 기능을 활용해주세요.
✅문제풀이:
1. 각 직원의 이름, 부서, 월급, 그리고 그 직원이 속한 부서에서 가장 높은 월급을 받고 있는 직원의 이름과 월급을 조회하는 SQL 쿼리를 작성해주세요.
select e.Name, e.Department, e.Salary, e2.Name as Top_Earner, e2.Salary as Top_Salary
from Employees e
join Employees e2 on e.Department=e2.Department
where e2.Salary = (
select max(e3.Salary)
from Employees e3
where e.Department=e3.Department
);
- e1과 e2 테이블을 JOIN해서 같은 부서의 직원들끼리 매칭한다.
- e2.Salary는 서브쿼리에서 해당 부서의 최고 월급을 가져온다.
- 서브쿼리
(
SELECT MAX(Salary)
FROM Employees e3
WHERE e3.Department = e1.Department
)
- 는 e1과 같은 부서에 속한 직원들 중 가장 높은 월급을 반환한다.
- 최종적으로 각 직원의 이름, 부서, 월급과 함께 해당 부서에서 가장 높은 월급을 받는 직원의 이름과 월급을 출력한다.
2. 부서별로 평균 월급이 가장 높은 부서의 이름과 해당 부서의 평균 월급을 조회하는 SQL 쿼리를 작성해주세요.
select Department, avg(Salary) as Avg_Salary
from Employees
group by Department
having avg(Salary) = (
select max(Avg_Salary)
from (
select avg(Salary) as Avg_Salary
from Employees
group by Department
) as sub
);
- GROUP BY를 통해 부서별로 직원들의 평균 월급을 계산한다.
- 서브쿼리
(
SELECT MAX(Avg_Salary)
FROM (
SELECT AVG(Salary) AS Avg_Salary
FROM Employees
GROUP BY Department
) AS subquery
)
- 는 모든 부서의 평균 월급 중 가장 높은 값을 찾는다.
- HAVING 절을 사용해 이 최고 평균 월급을 가진 부서만을 필터링하여 결과를 반환한다.