G교수 특급제자 먼데이 조교수에게 SQL을 배워보자
오늘은 JOIN / GROUPBY / HAVING 개념 + 예제 + 실전으로 가봅시다잉
JOIN - 테이블 연결하기
pandas -> concat / merge와 같음 (어떤 기준값(공통된 column)을 중심으로 하겠다는 느낌이겠지?
그걸 ON이라고함. ON = 어떤 키값을 기준으로 연결하기!
GROUPBY - 집계함수
pandas와 같으려나?
ex) 직원 테이블에서 직급별 평균 월급 보여줘!
SELECT position, AVG(salary) FROM employee
GROUPBY position;
WHERE - 행 필터링 (데이터를 가져오기 전에 필터링함. 즉, GROUP BY 전에 적용됨)
GROUPBY- 집계함수 (행들을 그룹으로 묶는 애”, 동일한 값을 기준으로 행들을 묶어서 통계용으로 사용함.)
HAVING - “GROUP BY로 묶은 결과에 조건 거는 애” WHERE은 GROUP BY 이전, HAVING은 그 이후!
"연봉 5만 이상인 사람들만 보여줘"
SELECT name,salary FROM employee
WHERE salary > 50000
"부서별 평균 연봉 구해줘"
SELECT AVG(salary),department FROM employee
GROUPBY department;
"부서별 평균 연봉이 6만 넘는 부서만 보여줘"
SELECT AVG(salary),department FROM employee
GROUPBY department
HAVING AVG(salary) > 60000;
#GPT가 내준 문제...
풀어보자
-- 문제: 부서별 평균 월급을 구하되,
-- 개별 직원 중에서 월급이 40000 이하인 직원은 제외하고,
-- 평균이 70000 이상인 부서만 보여줘라.
-- 문제: 부서별 평균 월급을 구하되,
-- 개별 직원 중에서 월급이 40000 이하인 직원은 제외하고,
-- 평균이 70000 이상인 부서만 보여줘라.
SELECT department, AVG(salary) FROM Employee
WHERE salary > 40000
GROUP BY department
HAVING AVG(salary) > 70000;
정답!
다음문제를 줬다..
각 부서별로 월급 40000 넘는 직원 수를 구하고, 그 수가 2명 이상인 부서만 보여줘라”
월급 40000 초과인 직원들만 대상으로, 부서별 평균 연봉과 인원 수 출력. 단, 인원이 2명 이상인 부서만."
SELECT AVG(salary), COUNT(name) FROM Employee
WHERE salary > 40000
GROUP BY department
HAVING COUNT(name) >= 2;
아 맞추니까 계속 내내 이쉨..
SELECT AVG(salary), COUNT(name) FROM Employee
WHERE salary > 40000
GROUP BY department
HAVING COUNT(name) >= 2;
또 맞추니까 어려운 문제를 내보겠단다.
SELECT name, salary, department FROM employee
GROUP BY department
HAVING MAX(salary);
모르겠어ㅠ
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㄱ창의적이네...
머리 꽁꽁 싸메고 해보자..
"각 부서에서 가장 높은 연봉을 받는 직원 출력"
SELECT department,employeeId, salary FROM employee
GROUP BY department
HAVING MAX(salary);
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ하지만 김피탕은 맛있는걸요...
배우고 갑니다.. 죄송합니다...
다시 해볼게요.!
"각 부서에서 가장 높은 연봉을 받는 직원 출력"
서브 쿼리 사용
SELECT department, employeeId, name, salary FROM employee e
WHERE salary = (
SELECT MAX(salary)
FROM employee
WHERE department = e.department #이건 바깥 쿼리에서 선택된 직원(e)의 department 값.
#서브쿼리에서는 "이 직원이 속한 부서에서, 최고 연봉이 얼마냐?" 를 구해야 하니까 이게 필요함.
);
이제 서브쿼리 관련해서 지옥 3문제 드가자~
# 문제 1. 자기 부서 평균보다 더 많이 받는 직원 찾기
# "각 직원 중, 본인이 속한 부서의 평균 연봉보다 더 높은 급여를 받는 사람을 찾아라."
SELECT name,department,salary,employeeId FROM employee e
WHERE salary = (
SELECT AVG(SALARY)
FROM employee
WHERE department = e.department);
문제 1정답
# 문제 2. 각 직원보다 연봉 높은 사람 수 세기
# "모든 직원에 대해, 자기보다 연봉 높은 사람이 몇 명인지를 구해라."
SELECT employeeId,salary FROM employee e
WHERE salary = (
SELECT COUNT(employeeId)
FROM employee
WHERE salary > e.salary);
문제 2 오답!!!
정답은 아래와 같다.
SELECT employeeId, name, salary,
(
SELECT COUNT(*)
FROM employee e2
WHERE e2.salary > e1.salary
) AS higher_salary_count
FROM employee e1;
# 문제 3. 자기 부서의 최고 연봉자인 직원 찾기
# "자기 부서에서 가장 높은 급여를 받는 직원을 찾아라."
SELECT name, department, salary FROM employee e
WHERE salary = (
SELECT MAX(salary)
FROM employee
WHERE department = e.department
);
문제 3은 정답!
너무 길어지니까 다음으로 가보자
'SQLD' 카테고리의 다른 글
SQL 5일차 #LeetCodE (0) | 2025.04.27 |
---|---|
SQL 3일차 #프로그래머스 (0) | 2025.04.24 |
SQL 문제 풀이 연습 #출제자 - 먼데이 (2) | 2025.04.22 |
GPT 먼데이와 함께하는 SQL 1일차 #2 (0) | 2025.04.22 |