GROUP BY
는 쿼리 결과를 특정 열을 기준으로 그룹화하여, 각 그룹에 대해 집계 연산을 수행할 수 있게 합니다.COUNT()
, SUM()
, AVG()
, MAX()
, MIN()
등의 집계 함수와 함께 사용됩니다.예를 들어, 부서별 직원 수나 부서별 급여 합계를 구할 때 GROUP BY
구문이 유용합니다.
가장 기본적인 사용법은 단일 열을 기준으로 데이터를 그룹화하는 것입니다.
예제 1: 부서별 직원 수 구하기
SELECT deptno, COUNT(*) AS 직원_수
FROM emp
GROUP BY deptno;
실행 결과:
+--------+-----------+
| deptno | 직원_수 |
+--------+-----------+
| 10 | 3 |
| 20 | 5 |
| 30 | 6 |
+--------+-----------+
여러 열을 조합하여 그룹을 만들 수도 있습니다. 예를 들어, 부서와 직책을 기준으로 그룹화할 수 있습니다.
예제 2: 부서별, 직책별 직원 수 구하기
SELECT deptno, job, COUNT(*) AS 직원_수
FROM emp
GROUP BY deptno, job;
deptno
와 job
열을 기준으로 그룹화하여, 각 부서 및 직책별 직원 수를 구합니다.실행 결과:
+--------+-----------+------------+
| 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 |
+--------+-----------+------------+
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()
함수는 그룹별 평균을 구하는 집계 함수입니다.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;