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절) 검토 과정

  1. Alice (Sales) 행 검토:
    • 서브쿼리 실행: e1.Department 에 Sales 가 들어옴. 
      SELECT MAX(e2.Salary)
      FROM employees2 e2
      WHERE e2.Department = 'Sales'
      
    • e2에서 부서가 Sales랑 같은 곳에서 Salary의 max 값을 찾음
    • 결과(반환값): 7000 (Sales 부서에서 최고 연봉)
  2. Alice의 연봉 확인:
    • Alice의 연봉(5000)과 서브쿼리 결과(7000)를 비교 -> 일치하지 않음 -> 결과에 포함되지 않음
  3. Bob (Sales) 처리:
    • 서브쿼리 실행: e1.Department 에 Sales 가 들어옴. 
      SELECT MAX(e2.Salary)
      FROM employees2 e2
      WHERE e2.Department = 'Sales'
      
    • e2에서 부서가 Sales랑 같은 곳에서 Salary의 max 값을 찾음
    • 결과: 7000 (Sales 부서에서 최고 연봉)
  4. Bob의 연봉 확인:
    • Bob의 연봉(7000)과 서브쿼리 결과(7000)를 비교 -> 일치함 -> 결과에 포함
  5. Carol (HR) 처리:
    • 서브쿼리 실행:  e1.Department 에 HR 가 들어옴.   
      SELECT MAX(e2.Salary)
      FROM employees2 e2
      WHERE e2.Department = 'HR'
      
    • e2에서 부서가 HR 이랑 같은 곳에서 Salary의 max 값을 찾음
    • 결과: 8000 (HR 부서에서 최고 연봉)
  6. Carol의 연봉 확인:
    • Carol의 연봉(6000)과 서브쿼리 결과(8000)를 비교 -> 일치하지 않음 -> 결과에 포함되지 않음
  7. Dave (HR) 처리:
    • 서브쿼리 실행: e1.Department 에 HR 가 들어옴
      SELECT MAX(e2.Salary)
      FROM employees2 e2
      WHERE e2.Department = 'HR'
      
    • e2에서 부서가 HR 이랑 같은 곳에서 Salary의 max 값을 찾음
    • 결과: 8000 (HR 부서에서 최고 연봉)
  8. 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

+ Recent posts