성장일기 : 문과생의 개발 여정 (งᐖ)ว ( ᐛ )و

그룹 함수 (sum, avg, count, max, min) & having 본문

백엔드개발/DATABASE

그룹 함수 (sum, avg, count, max, min) & having

hyemi_flora 2023. 10. 31. 09:43

1027 수업내용_

    #그룹 함수

    - 원하는 칼럼을 기준으로 그룹을 묶어서 계산할 수 있는 함수들.

    - 그룹을 묶을 때 기준이 되는 칼럼은 GROUP BY절로 설정할 수 있다.

    - 그룹 함수를 사용하면 일반 칼럼은 함께 출력할 수 없다.   => 00937. 00000 -  "not a single-group group function"

    - 그룹 함수의 결과와 그룹의 기준이 되는 칼럼만 사용할 수 있다.

 

 

-- SUM(column) : 해당 칼럼의 총합을 구해주는 그룹 함수

SELECT sum(salary) FROM employees;-- 691416 모든 사원들의 월급 총합

-- SELECT sum(salary), first_name FROM employees; >> 그룹함수를 출력하면 일반 칼럼을 출력할 수 없다.

-- 직책별 월급 총합

SELECT sum(salary), job_id FROM employees GROUP BY job_id;

-- 부서별 월급 총합

SELECT sum(salary), department_id FROM employees GROUP BY department_id;

-- avg(column) : 해당 칼럼의 평균값을 구해주는 그룹 함수

SELECT avg(salary), sum(salary), job_id FROM employees GROUP BY job_id;

 

-- count(column) : 해당 컬럼의 행의 개수를 구할 수 있다 (null 값은 세지 않는다)

SELECT count(commission_pct) FROM employees;

-- 커미션을 어느 부서에서 몇 명이 받고 있는지

SELECT department_id, count(commission_pct) FROM employees GROUP BY department_id;

 

-- max(column) : 그룹별 각 칼럼 최댓값을 구할 수 있다.

SELECT max(salary), job_id FROM employees GROUP BY job_id;

 

-- min(column) : 그룹별 각 칼럼 최솟값을 구할 수 있다.

SELECT min(salary), job_id FROM employees GROUP BY job_id;

 

-- 연습1> 각 직책별 평균연봉

 

-- 연습2> 각 부서별 가장 최근에 사원이 입사한 날짜와 가장 오래전 입사한 날짜 조회

 

 

 

 


    # HAVING

    - 그룹 함수로 묶어서 도출된 결과에 대해 조건을 적용하고 싶은 경우 사용하는 문법

    - WHERE은 그룹으로 묶기 전에 적용되기 때문에 그룹 함수의 결과는 WHERE절의 조건으로 사용할 수 없다.

 

SELECT avg(salary), job_id FROM employees GROUP BY job_id;

-- 평균 월급이 8000$ 넘어가는 직책을 알고 싶을 때

SELECT avg(salary), job_id FROM employees WHERE salary >= 8000 GROUP BY job_id;

--이처럼 WHERE 사용한다면 groub by 전에 먼저 적용을 받기 때문에 원하지 않는 값 도출된다. 따라서 HAVING 절 사용

SELECT avg(salary), job_id FROM employees GROUP BY job_id HAVING avg(salary) >8000;

-- 평균 월급이 8000$ 넘는 사원들의 직책별 평균월급

SELECT avg(salary), job_id FROM employees WHERE salary > 8000 GROUP BY job_id;

 

-- 연습1> 월급이 88천 달러 이상인 사원이 3명 이상인 부서만 출력

SELECT department_id FROM employees WHERE salary >= 8000 GROUP BY department_id HAVING count(*) >= 3;