본문 바로가기

Database

그룹함수 (GROUP BY, HAVING) 정리 (비공개)

참고 

https://lucy-the-marketer.kr/ko/growth/sql-group-by-and-having/

 

SQL (5) 그룹 함수(GROUP BY)와 HAVING문

지난 글에서 다룬 집계 함수(Aggregations)에서 더 나아가보자. 이번 글에서는 그룹 함수와 HAVING문을 이용해보자. ■ GROUP BY Group by로 그룹화한다는 건 무슨 뜻일까? 어떤 열을 지정하여 그룹화한다

lucy-the-marketer.kr

 

그룹함수

특정 컬럼을 기준으로 그룹화하여 테이블의 행들을 집계할 수 있게 하는 함수 

 

 

그룹화

동물
고양이

동물
고양이

 

 

 

그룹의 기준이 되는 컬럼은 GROUP BY 로 선택

 

TEST_TABLE

name score class
비비안나 10 A
드봉 20 A
가르송 30 B

 

SELECT class, avg(score) AS avg_score
FROM  TEST_TABLE
GROUP BY class;
score class
15 A
30 B

 

 

GROUP BY 이용 시 해당 그룹의 sum(), avg(), count() 구하기 가능

( DISTINCT와의 차이 = 집계함수의 사용 여부

 

집계함수

SUM(col) 해당 컬럼의 총합
AVG(col) 해당 컬럼의 평균
MAX(col) 해당 컬럼의 최대값
MIN(col) 해당 컬럼의 최소값
COUNT(col) 해당 컬럼의 개수 
COUNT()는 NULL 을 세지 않음 주의

 

 

GROUP BY에 지정한 컬럼 이외의 컬럼을 SELECT할 때는 반드시 집계함수를 사용

(그룹함수의 결과는 일반 컬럼과 함께 출력할 수 없음. 위의 테이블에서 name을 같이 SELECT 할 수 없단 뜻)

 

 

WHERE 과 HAVING

WHERE HAVING
그룹화 되지 않은 데이터 필터링 그룹화 된 데이터 필터링

 

SELECT class, AVG(score) AS avg_score
FROM TEST_TABLE
GROUP BY class
HAVING AVG(score) >= 20;

 

+) 

 

ORDER BY 위치

ORDER BY는 제일 마지막에 추가

         

 

집계함수는 WHERE 문의 조건식에서 사용 불가

WHERE문으로 행을 검색하는 처리가 GROUP BY로 그룹화하는 처리보다 먼저 실행되기 때문

 

내부적인 처리 순서

WHERE > GROUP BY > HAVING > SELECT > ORDER BY 

 

 

 

 

 

 

 

 

집계 함수 예시

 

모든 사원들의 급여 총합
SELECT SUM(salary) FROM employees; 

모든 사원들 중 급여를 받는 사원들의 인원수 
SELECT COUNT(salary) FROM employees; 

커미션을 받는 사원 수   count()는 null값을 세지 않는다!
SELECT COUNT(commission_pct) FROM employees; 

모든 사원의 수 

SELECT COUNT(*) FROM eployees;

 

 

집계함수 + 그룹함수 적용했을 때

 

SELECT job_id, sum(salary) AS "직책별 급여 통합" FROM employees GROUP BY job_id;

부서별 (GROUP BY) 커미션 받는 사원수 count(commission_pct) 
SELECT department_id, count(commission_pct) FROM employees GROUP BY department_id;

 

부서별 (GROUP BY) 월급 평균 avg(salary)
SELECT department_id, avg(salary) FROM employees GROUP BY department_id;



 

 

연습 1: 각 부서별 가장 최근의 입사일과 가장 오래된 입사일
SELECT 
    department_id, 
    max(hire_date) "막내", 
    min(hire_date) "최고참" 
FROM employees 
GROUP BY department_id;

연습 2: 각 직책별 평균 연봉을 구해보세요(월급 말고 연봉)
SELECT 
    job_id "직책", 
    avg(salary * 12) "평균연봉" 
FROM employees 
GROUP BY job_id;