들어가기전, 먼데이 단장님께서 오프닝 멘트 시작하시겠다. 다들 집중

드가자!!!!!!!!!

 오늘은 Self Join과 CASE WHEN,  EXISTS를 배워보도록 하자.

 

예시

 

SELF JOIN부터 알아보자. JOIN을 알다시피 테이블을 하나로 합치는 것

SELF JOIN이란 자기 자신을 자기에게 붙이는것..! 

ex) customer 테이블의 데이터를 다시 customer 테이블에 붙인다! 

WHY??? 이게 왜 필요한지 물어봤다.

오늘도 창의적으로 포문을 여는 먼선생.!

SELECT 
	e.name AS employee_name, m.name AS manager_name
    FROM employees e
    JOIN employees m
    ON e.mangers_id = m.id;

먼선생의 유머 수준을 60%로 낮춰야겠다.

재밌는 교수는 없다는 소리가 괜히 나오는게 아니다.


바로 실전 문제 가보자!

문제 1.

직원과 매니저 이름을 같이 출력하라. (Self Join 구조 익히기)

Employee(employeeId, name, salary, managerId)
→ managerId가 employeeId를 참조하고 있음

# 직원과 매니저 이름을 같이 출력하라. (Self Join 구조 익히기)

# Employee(employeeId, name, salary, managerId)
# → managerId가 employeeId를 참조하고 있음

SELECT e.name, m.name
	FROM employees e
	JOIN employees m
    ON e.employeeId = m.managerId

괴라는 나물..SQL 어렵다..

e.employeeId = m.mangerId가 아니라 e.managerId = m.employeeId! (직원 -> 매니저 찾아야하므로)

문제 2.

각 직원이 자기 매니저보다 연봉이 높으면 ‘Higher’, 낮으면 ‘Lower’라고 표시하라.

컬럼: employee_name, manager_name, 비교결과

# 각 직원이 자기 매니저보다 연봉이 높으면 ‘Higher’, 낮으면 ‘Lower’라고 표시하라.
# 컬럼: employee_name, manager_name, 비교결과

SELECT e.name AS employee_name, m.name AS manager_name, e.salary,
CASE 
	WHEN e.salary > m.salary THEN 'Higher'
    ELSE 'Lower'
    END AS '비교결과'
FROM employees e
JOIN employees m
ON e.managerId= m.employeeId;

 

문제 3.

매니저가 없는 직원은 'No Manager'로 표기하라.

CASE WHEN을 IS NULL 조건과 함께 써봐

참고) 테이블은 아래와 같음.

# 매니저가 없는 직원은 ‘No Manager’로 표시
# employeeId/managerId/name/salary/department

SELECT e.name AS employee_name,
CASE
	WHEN m.name IS NULL THEN 'No Manager'
    ELSE m.name
    END AS "매니저"
FROM employees e
JOIN employees m
ON e.managerId = m.employeeId;

 

문제 4.

직원이 자기 매니저보다 1.1배 이상 높은 연봉이면 ‘Fast Climber’,
동일하면 ‘Peer’, 아니면 ‘Underpaid’ 라고 표시

# 직원이 자기 매니저보다 1.1배 이상 높은 연봉이면 ‘Fast Climber’,
# 동일하면 ‘Peer’, 아니면 ‘Underpaid’ 라고 표시
# columns - 'employeeId/name/salary/managerId'

SELECT name,
CASE 
	WHEN e.salary > ( 1.1 * m.salary) THEN "Fast Climber"
    WHEN e.salary = m.salary THEN "Peer"
    ELSE "Underpaid"
	END AS "연봉 상황"
FROM employees e
INNER JOIN employees m
ON e.managerId = m.employeeId;

궁금한 점

어떻게 e.salary m.salary를 각각 직원 연봉과 매니저 연봉으로 구분할 수 있는가?

-> 먼교수님 말씀... 

요새 GPT는 노트북 카메라로 얼굴 보면서 대답하나보다. 괴물처럼 생겨서 화는 나지 않는다.

결국, INNER JOIN , ON -> 부터 관계가 생기면서 (두 테이블 연결하면서) 인지함.

문제 5.

매니저 이름이 ‘Kim’인 사람만 필터해서, 그들과 연봉 비교 결과 출력하기

예: Kim보다 높으면 'Surpassed Kim', 낮으면 'Still Climbing' 등

# 매니저 이름이 ‘Kim’인 사람만 필터해서, 그들과 연봉 비교 결과 출력하기
# 예: Kim보다 높으면 'Surpassed Kim', 낮으면 'Still Climbing' 등
# table = 'employeeId','name','salary','managerId'

SELECT e.name AS employee_name,
	   e.salary AS employee_salary,
       m.name AS manager_name,
       m.salary AS manager_salary,
CASE
	WHEN e.salary > m.salary THEN "Surpassed Kim"
    ELSE 'Still Climbing'
	END AS "비교 결과"
FROM employees e
INNER JOIN employees m
ON e.managerId = m.employeeId
WHERE m.name = "Kim";

문제 6.

부서가 같은 직원들 중 매니저보다 연봉이 낮은 사람만 출력,
그리고 'Raise Suggested' 라는 컬럼 추가

# 부서가 같은 직원들 중 매니저보다 연봉이 낮은 사람만 출력하고 그 사람들에게 "Raise Suggested"라는 데이터 채우기, column명은 "평과 결과"

SELECT e.name AS employee_name,
	   e.salary AS employee_salary,
       m.name AS manager_name,
       m.salary AS manager_salary,
       CASE
       WHEN e.salary < m.salary THEN "Raise Suggested"
       END AS "평가 결과"
FROM employees e
INNER JOIN employees m
ON e.managerId = m.employeeId
WHERE (e.salary < m.salary) and (e.department = m.department);

문제 7.

각 매니저별로, 자기보다 연봉 높은 직원을 몇 명이나 두고 있는지 출력하라

Self Join + GROUP BY + COUNT + CASE WHEN 조합해야 함

# 각 매니저별로, 자기보다 연봉 높은 직원을 몇 명이나 두고 있는지 출력하라
# Self Join + GROUP BY + COUNT + CASE WHEN 조합해야 함

SELECT m.name AS manager_name,
	COUNT(CASE WHEN m.salary < e.salary THEN 1 END) AS "better than me"
FROM employees e
INNER JOIN employees m
		ON e.managerId = m.employeeId
GROUP BY m.name;

문제 8.

직원이 속한 부서에 ‘김 매니저’가 있으면 ‘Under Kim’,
없으면 ‘Other Manager’ 라고 표시하라.

Self Join + CASE WHEN + 부서 조건 조합

# 직원이 속한 부서에 ‘김 매니저’가 있으면 ‘Under Kim’, 없으면 ‘Other Manager’ 라고 표시하라.
# table = 'employeeId','name','salary','managerId','department'

SELECT department, e.name AS employee_name,
	CASE
    WHEN m.name = "Kim" THEN "Under Kim"
	ELSE "Other Manager"
    END AS "김 매니저 유무"
FROM employees e
INNER JOIN employees m
	    ON e.managerId = m.employeeId
WHERE e.department = m.department

문제 9.

각 직원이 '매니저와 연봉 차이'가 20% 이상이면 Alert,
아니면 Normal, 매니저 없으면 Unknown 출력

# 각 직원이 '매니저와 연봉 차이'가 20% 이상이면 Alert,
# 아니면 Normal, 매니저 없으면 Unknown 출력

SELECT e.name AS employee_name,
	   e.salary AS employee_salary,
       m.name AS manager_name,
	   m.salary AS manager_salary,
CASE
	WHEN e.managerId IS NULL THEN "Unknown"
    WHEN ABS(e.salary - m.salary) > (e.salary) * 0.8  THEN "Alert"
    ELSE "Normal"
    END AS "매니저 연봉 차이"
FROM employees e
LEFT JOIN employees m
		ON e.managerId = m.employeeId;

개빡세다 1일차는 여기까지...

'SQLD' 카테고리의 다른 글

SQL 5일차 #LeetCodE  (0) 2025.04.27
SQL 3일차 #프로그래머스  (0) 2025.04.24
SQL 문제 풀이 연습 #출제자 - 먼데이  (1) 2025.04.22
GPT 먼데이와 함께하는 SQL 1일차 #1  (0) 2025.04.21

+ Recent posts