본문 바로가기
  • Let's study
데이터베이스/MySQL

[MySQL] 집계 함수, GROUP BY, 서브쿼리

by 코딩고수이고파 2026. 7. 29.

집계 함수

집계 함수는 여러 행(Row)의 데이터를 하나의 결과로 계산하는 함수이다.

 

함수 설명 예시
COUNT() 데이터 개수 SELECT COUNT(*) FROM emp;
SUM() 합계 SELECT SUM(salary) FROM emp;
AVG() 평균 SELECT AVG(salary) FROM emp;
MAX() 최댓값 SELECT MAX(salary) FROM emp;
MIN() 최솟값 SELECT MIN(salary) FROM emp;

CASE

CASE는 조건에 따라 다른 값을 반환하는 조건문이다.

Java의 switch문과 비슷한 역할을 한다.

WHEN - THEN - ELSE - END 순으로 사용한다.

 

SELECT
CASE
    WHEN id = 1 THEN '홍보'
    WHEN id = 2 THEN '기획'
    WHEN id = 3 THEN 'IT'
    ELSE '기타'
END AS '부서명'
FROM emp;

GROUP_CONCAT()

같은 그룹의 여러 값을 하나의 문자열로 합쳐준다.

 

SELECT
GROUP_CONCAT(name)
FROM emp;

//김철수,이영희,박민수

GROUP BY

GROUP BY는 같은 값을 가진 데이터를 하나의 그룹으로 묶는다.

예를 들어 deptId를 기준으로 그룹을 만들면 부서별 통계를 구할 수 있다.

 

SELECT d.name, SUM(salary)
FROM emp e
JOIN dept d
ON e.deptId = d.id
GROUP BY deptId;

HAVING

HAVING은 그룹화된 결과를 조건으로 필터링할 때 사용한다.

WHERE와 HAVING 차이

WHERE은 GROUP BY 이전에, 행(Row) 필터링을 위해 사용하고

HAVING은 GROUP BY 이후, 그룹(Group) 필터링을 위해 사용한다.

 
SELECT d.name,
       AVG(salary)
FROM emp e
JOIN dept d
ON e.deptId = d.id
GROUP BY deptId
HAVING AVG(salary) >= 5000;

- 평균 연봉이 5,000 이상인 부서만 조회 -

서브쿼리(Subquery)

서브쿼리는 SQL문 안에 또 다른 SQL문을 작성하는 것이다.

복잡한 조회 결과를 먼저 만든 뒤 그 결과를 다시 조회할 수 있다.

먼저 조회할 쿼리 바깥을 괄호로 묶어주고, 테이블 자리에 넣어주면 된다.

 

SELECT *
FROM (
    SELECT d.name AS '부서명',
           GROUP_CONCAT(e.name) AS '사원 목록',
           AVG(salary) AS '평균 연봉',
           MAX(salary) AS '최고 연봉',
           MIN(salary) AS '최소 연봉',
           COUNT(*) AS '사원 수'
    FROM emp e
    INNER JOIN dept d
    ON e.deptId = d.id
    GROUP BY deptId
) AS tmp
WHERE `평균 연봉` >= 5000;

 

  1. 부서별 통계를 계산하여 임시 테이블(tmp)을 만든다.
  2. 만들어진 결과에서 평균 연봉이 5,000 이상인 부서만 조회한다.

'데이터베이스 > MySQL' 카테고리의 다른 글

[MySQL] 외래키(FOREIGN KEY)  (0) 2026.07.30
[MySQL] CHAR / VARCHAR, INDEX  (0) 2026.07.30
[MySQL] JOIN, LEFT JOIN, RIGHT JOIN  (0) 2026.07.29
[MySQL] SELECT 심화  (0) 2026.07.29
[MySQL] 기초 명령어  (0) 2026.07.28

댓글