[Day 11 | DB] GROUP BY 데이터 그룹화 (집계함수, HAVING)

y♡ding·2024년 10월 28일
0

데브코스 TIL

목록 보기
65/163

1. GROUP BY 기본 개념 이해하기

  • 기능: GROUP BY는 쿼리 결과를 특정 열을 기준으로 그룹화하여, 각 그룹에 대해 집계 연산을 수행할 수 있게 합니다.
  • 주로 사용되는 함수: COUNT(), SUM(), AVG(), MAX(), MIN() 등의 집계 함수와 함께 사용됩니다.

예를 들어, 부서별 직원 수부서별 급여 합계를 구할 때 GROUP BY 구문이 유용합니다.


2. 단일 열을 기준으로 GROUP BY 사용하기

가장 기본적인 사용법은 단일 열을 기준으로 데이터를 그룹화하는 것입니다.

예제 1: 부서별 직원 수 구하기

SELECT deptno, COUNT(*) AS 직원_수
FROM emp
GROUP BY deptno;

실행 결과:

+--------+-----------+
| deptno | 직원_수     |
+--------+-----------+
|     10 |         3 |
|     20 |         5 |
|     30 |         6 |
+--------+-----------+

3. 여러 열을 기준으로 GROUP BY 사용하기

여러 열을 조합하여 그룹을 만들 수도 있습니다. 예를 들어, 부서와 직책을 기준으로 그룹화할 수 있습니다.

예제 2: 부서별, 직책별 직원 수 구하기

SELECT deptno, job, COUNT(*) AS 직원_수
FROM emp
GROUP BY deptno, job;
  • deptnojob 열을 기준으로 그룹화하여, 각 부서 및 직책별 직원 수를 구합니다.
  • 결과는 부서와 직책의 조합에 따른 직원 수를 보여줍니다.

실행 결과:

+--------+-----------+------------+
| deptno | job       | 직원_수      |
+--------+-----------+------------+
|     10 | CLERK     |          1 |
|     10 | MANAGER   |          1 |
|     10 | PRESIDENT |          1 |
|     20 | ANALYST   |          2 |
|     20 | CLERK     |          2 |
|     20 | MANAGER   |          1 |
|     30 | CLERK     |          1 |
|     30 | MANAGER   |          1 |
|     30 | SALESMAN  |          4 |
+--------+-----------+------------+

4. GROUP BY와 집계 함수 조합하기

GROUP BY집계 함수와 함께 사용할 때 가장 유용합니다. 각 그룹에 대해 요약 통계를 계산할 수 있습니다.

예제 3: 직업별 평균 급여 구하기

MariaDB [sample]> SELECT job, truncate(AVG(sal), 1) AS 평균_급여 FROM emp GROUP BY job;
+-----------+---------------+
| job       | 평균_급여     |
+-----------+---------------+
| ANALYST   |        3000.0 |
| CLERK     |        1037.5 |
| MANAGER   |        2758.3 |
| PRESIDENT |        5000.0 |
| SALESMAN  |        1400.0 |
+-----------+---------------+
  • job를 기준으로 각 직업의 평균 급여(AVG(sal))를 계산합니다.
  • AVG() 함수는 그룹별 평균을 구하는 집계 함수입니다.

5. HAVING 절로 그룹화된 결과 필터링하기

HAVING 절을 사용하여 그룹화된 결과에 조건을 걸 수 있습니다. HAVING그룹화 후 필터링할 때 사용되며, WHERE 절은 그룹화 전에 필터링할 때 사용됩니다.

SELECT deptno, COUNT(*) AS 직원_수
FROM emp
GROUP BY deptno
HAVING COUNT(*) >= 3;
  • deptno로 그룹화한 후, 직원 수가 3명 이상인 부서만 필터링합니다.

수업코드

-- 부서별 최고 급여를 출력
select deptno, max(sal) as 최고급여
from emp
group by deptno;

-- 부서별 최고 급여를 받는 사원을 출력
select deptno, ename, sal
from emp
where (deptno, sal) in (select deptno, max(sal) from emp group by deptno);

-- 직책별 평균 급여를 출력
select job, avg(sal) as 평균급여
from emp
group by job;

-- 부서, 직책별 급여 합계를 출력
select deptno, job, sum(sal) as 급여합계
from emp
group by deptno, job;

-- 각 부서(deptno)와 직무(job)별로 급여(sal)의 합계를 계산하고,
-- 급여 합계가 높은 순서대로 정렬하여 출력
select deptno, job, sum(sal)
from emp
group by deptno, job
order by 3 desc;    -- 셀렉트 순서의 세번째 컬럼 기준 정렬

-- 부서, 직책별 급여 합계를 출력 (단, 합계가 2000 이상인 경우만)
select deptno, job, sum(sal) as 급여합계
from emp
group by deptno, job
having sum(sal) >= 2000;

0개의 댓글

관련 채용 정보