MySql

[내일 배움 캠프, SQL 달리기 반] Lv5. 예산이 가장 큰 프로젝트는?

kimyongjun0129 2025. 3. 27. 16:47

1. 문제

 

 

 

 

[5-1] 풀이

SELECT Name,
       Department,
       Salary
FROM employees e
WHERE (Department, Salary) in (
    SELECT Department,
           MAX(Salary) Salary
    FROM employees
    GROUP BY Department
)
ORDER BY 2
  • 부서에서 가장 높은 월급 :  Group by Department와 집계함수 Max를 사용하였다. (서브쿼리)
  • 부서에서 가장 높은 월급을 받는 직원들 : WHERE 절로 서브쿼리의 값에 포함되지 않는 행들은 필터링해준다. (메인쿼리)

 

 

 

[5-1] 헷갈렸던 부분

원래는 WHERE 절에 "in 연산자" 대신 "="을 넣었는데, 아래 사진과 같이오류가 생겼었다.

오류

  • "= 연산자"는 대상을 1대1로 비교하는 연산자이다.
  • 서브쿼리가 단일 값을 반환 해야하는데, 여러 개의 값을 반환해서 생긴 오류이다.
  • 따라서 [5-1] 풀이 과정에서처럼 "= 연산자" 대신 "in 연산자"로 대체하였다.
  • "in 연산자"는 여러 개의 값을 비교할 수 있다.

 

 

 

[5-1] GPT 풀이

SELECT Name,
       Department,
       Salary
FROM employees e
WHERE Salary = (
    SELECT MAX(Salary)
    FROM employees
    WHERE Department = e.Department
)

해당 과정은 이해하는 과정이 어려웠기 때문에 공유하고자 포스팅한다.

  • employees 테이블의 각 행이 하나씩 e에 매핑된다.
  • WHERE Salary = (...) 부분에서 서브쿼리가 실행됩니다.
  • 서브쿼리에서 Department = e.Department 조건을 사용하여 현재 실행되는 행(e)의 Department 값과 같은 부서의 직원들 중에서 최고 Salary 값을 가져옵니다.
  • 현재 실행되는 행의 Salary가 서브쿼리에서 반환된 MAX(Salary) 값과 같으면 해당 행을 최종 결과에 포함합니다.

어려웠던 점 : employees e에서 한 행씩(현재 실행되는 행) 가져와 각 행에 대해 서브쿼리를 실행한다는 것을 이해하지 못하여서 이 query의 전체 흐름이 이해가 되지 않았다.

 

 

 

 

[5-2] 풀이

SELECT Name,
       ProjectName,
       Budget
FROM
(
	SELECT e.Name,
	       ep.ProjectID
	FROM employees e LEFT JOIN employeeProjects ep ON e.EmployeeID=ep.EmployeeID
) a LEFT JOIN projects p ON a.ProjectID=p.ProjectID
WHERE Budget >= 10000
  • employeesProjects 테이블이 projects 테이블과 employees 테이블을 이어줄 각 ID를 가지고 있기 때문에, JOIN 연산을 두 번 해야 한다.