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

+ Recent posts