Lv5. 예산이 가장 큰 프로젝트는?
⭐1. 각 직원이 속한 부서에서 가장 높은 월급을 받는 직원들만 포함된 결과를 조회하는 SQL 쿼리를 작성해주세요. 출력 결과에는 직원의 이름, 부서, 그리고 월급이 포함되어야 합니다.
조회해야 할 컬럼
Name, Department, Salary
select Name, Department, Salary
from employees2 e1
where Salary =
(select max(e2.Salary)
from employees2 e2
where e2.Department = e1.Department
)
order by 3 desc
- WHERE 절에서 서브쿼리를 사용해 각 부서의 최고 월급을 계산한다.
- 메인 쿼리에서는 각 직원의 월급이 해당 부서의 최고 월급과 일치하는 직원들만 필터링하여 결과에 포함시킨다.
select max(e2.Salary) 에서 조회되는 값은 하나일텐데 어떻게 최종적으로 각 부서마다 가장 높은 월급을 받는 사람들이
모두 조회되는지 의문일 것이다.
>>
SELECT MAX(e2.Salary)는 한 번에 한 개의 값만 반환하지만, 이 쿼리는 각 행에 대해 이 과정을 반복하기 때문에 각 부서별로 최고 월급을 찾을 수 있다.
- 외부 쿼리:
- employees2 테이블의 각 행을 순회하면서 해당 직원의 Department와 Salary를 조회한다.
- 서브쿼리:
- 외부 쿼리의 각 행마다, 동일한 부서에 속한 직원들 중에서 가장 높은 연봉을 가진 값을 서브쿼리에서 찾는다.
- MAX(e2.Salary)는 해당 행의 직원이 속한 부서에서 가장 높은 연봉을 반환한다. 그래서 그거랑 해당 직원의 Salary 비교해서 값이 같으면 조회할 직원으로 포함 시키는 것.
- 조건 일치:
- 외부 쿼리의 Salary 값이 서브쿼리에서 반환된 최대 연봉과 일치하는 경우, 해당 직원을 선택해서 조회한다.
- 행마다(직원마다) where 절을 검토하면서 조건과 일치하면 결과에 포함시키는 것이다. 그래서 전부 포함될 수 있다.
예시를 들어보자. 다음과 같은 테이블이 있다.
employees2 테이블
Name | Department | Salary |
Alice | Sales | 5000 |
Bob | Sales | 7000 |
Carol | HR | 6000 |
Dave | HR | 8000 |
이 테이블을 사용하여 위와 같은 쿼리문을 작성했다고 했을 때 동작 방식은 다음과 같다.
조건에 맞는 데이터를 조회하기 위한 조건절(where절) 검토 과정
- Alice (Sales) 행 검토:
- 서브쿼리 실행: e1.Department 에 Sales 가 들어옴.
SELECT MAX(e2.Salary) FROM employees2 e2 WHERE e2.Department = 'Sales'
- e2에서 부서가 Sales랑 같은 곳에서 Salary의 max 값을 찾음
- 결과(반환값): 7000 (Sales 부서에서 최고 연봉)
- 서브쿼리 실행: e1.Department 에 Sales 가 들어옴.
- Alice의 연봉 확인:
- Alice의 연봉(5000)과 서브쿼리 결과(7000)를 비교 -> 일치하지 않음 -> 결과에 포함되지 않음
- Bob (Sales) 처리:
- 서브쿼리 실행: e1.Department 에 Sales 가 들어옴.
SELECT MAX(e2.Salary) FROM employees2 e2 WHERE e2.Department = 'Sales'
- e2에서 부서가 Sales랑 같은 곳에서 Salary의 max 값을 찾음
- 결과: 7000 (Sales 부서에서 최고 연봉)
- 서브쿼리 실행: e1.Department 에 Sales 가 들어옴.
- Bob의 연봉 확인:
- Bob의 연봉(7000)과 서브쿼리 결과(7000)를 비교 -> 일치함 -> 결과에 포함
- Carol (HR) 처리:
- 서브쿼리 실행: e1.Department 에 HR 가 들어옴.
SELECT MAX(e2.Salary) FROM employees2 e2 WHERE e2.Department = 'HR'
- e2에서 부서가 HR 이랑 같은 곳에서 Salary의 max 값을 찾음
- 결과: 8000 (HR 부서에서 최고 연봉)
- 서브쿼리 실행: e1.Department 에 HR 가 들어옴.
- Carol의 연봉 확인:
- Carol의 연봉(6000)과 서브쿼리 결과(8000)를 비교 -> 일치하지 않음 -> 결과에 포함되지 않음
- Dave (HR) 처리:
- 서브쿼리 실행: e1.Department 에 HR 가 들어옴
SELECT MAX(e2.Salary) FROM employees2 e2 WHERE e2.Department = 'HR'
- e2에서 부서가 HR 이랑 같은 곳에서 Salary의 max 값을 찾음
- 결과: 8000 (HR 부서에서 최고 연봉)
- 서브쿼리 실행: e1.Department 에 HR 가 들어옴
- Dave의 연봉 확인:
- Dave의 연봉(8000)과 서브쿼리 결과(8000)를 비교 -> 일치함 -> 결과에 포함
최종 결과:
- Bob (Sales, 7000)
- Dave (HR, 8000)
여기까지 왔으면 이 쿼리를 완벽히 이해했으리라 생각한다.
2. 직원이 참여한 프로젝트 중 예산이 10,000 이상인 프로젝트만을 조회하는 SQL 쿼리를 작성해주세요.
출력 결과에는 직원 이름, 프로젝트 이름, 그리고 프로젝트 예산이 포함되어야 합니다.
조회해야 할 컬럼
Name, ProjectName, Budget
조회해야 할 컬럼이 employees 랑 projects에 있는데 왜 세 테이블이나 줬지 했더니 저 두테이블을 연결하기 위해서는 가운데에 employeeprojects 테이블이 징검다리로 필요했던 것이다.
select *
from employees2 e left join employeeprojects ep on e.EmployeeID = ep.EmployeeID left join projects p on ep.ProjectID = p.ProjectID
이거 빼고는 엄청 쉬운 쿼리.
select e.Name, p.ProjectName, p.Budget
from employees2 e left join employeeprojects ep on e.EmployeeID = ep.EmployeeID
left join projects p on ep.ProjectID = p.ProjectID
where p.Budget >= 10000
.
.
.
퀘스트를 마치며..
파이썬보다 훨씬 길게 달려온 SQL 퀘스트.
파이썬은 뭔가 프로그램을 뚝딱뚝딱 만드는 느낌이라면 SQL은 그냥 조건에 맞는 데이터를 찾아달라는 느낌이라 재미..는 파이썬보다 없었던 것 같다.
그래도 AI를 배우면서 데이터를 다루는 데 있어 SQL이 필수적이라고 하기 때문에
배운 것을 까먹지 않게 가끔씩이라도 복습하는 것이 좋을 것 같다.
아직 having 절이나 where 절의 논리적 흐름을 따라가는 것이 어렵지만
본캠프가 시작하고 나서 본격적으로 학습을 진행하며 배워나갈 수 있으리라고 생각한다.
한 달 동안 사전캠프를 수료한 나에게 박수를!
앞으로 4달 동안 진행될 본 캠프가 기대된다!! 파이팅💪🏻
'사전캠프 퀘스트' 카테고리의 다른 글
달리기반 SQL Lv5 (1) (0) | 2024.11.22 |
---|---|
달리기반 SQL Lv4 (2) (0) | 2024.11.21 |
달리기반 SQL Lv4 (1) (0) | 2024.11.21 |
달리기반 SQL Lv3 (0) | 2024.11.02 |
달리기반 SQL Lv2 (0) | 2024.11.01 |