
GROUP BY절이란
여러 행의 데이터를 집계할 때, 하나 이상의 컬럼을 기준으로 그룹화할 때 사용.
동일한 값을 가진 행들을 묶어 중복을 제거한다.
집계함수와 함께 사용하여 어떤 통계치를 낼 때 사용한다.
SELECT 컬럼명1, 컬럼명2, ...., 집계함수(컬럼명)
FROM 테이블명
GROUP BY (컬럼명1, 컬럼명2,...);
여기서 유의해야할 규칙은,
SELECT에 명시된 컬럼들 중
집계함수 (MAX, COUNT, AVG 등)안에 들어가지 않는 컬럼명은 전부 GROUP BY절에 명시해야 한다는 것이다.
집계하지 않을 컬럼을 SELECT에 명시해놓고 GROUP BY로 묶지 않는다면,
MySQL 입장에서는 헷갈리기 떄문이다.
예를 들어 부서 별 평균 연봉을 구하고자 하는데,
SELECT 부서, 성별, AVG(연봉)
FROM 직원테이블
GROUP BY 부서;
라고 성별을 추가해버리면,
중복된 부서를 전부 그룹화 했을 때 성별이 남자 여자 모두 합쳐졌을 것 아닌가.
그럼 MySQL은 남자라고 표시해야할 지 여자라고 표시해야할 지 헷갈릴 것이다.
그러니 올바른 쿼리문은 조건에 따라 아래 둘 중 하나이다.
-- 부서별, 성별별 평균 연봉을 구할 때
SELECT 부서, 성별, AVG(연봉)
FROM 직원테이블
GROUP BY 부서, 성별;
-- 부서별 평균 연봉을 구할 때
SELECT 부서, AVG(연봉)
FROM 직원테이블
GROUP BY 부서;
여기서 조건을 걸고 싶으면 (예를 들면 성별이 남자인 직원들의 부서별 평균 연봉)
HAVING을 사용하면 된다.
-- 부서별, 성별별 평균 연봉을 구하되, 각 부서별 성별별 최소 연봉이 150보다 큰 그룹만 표시하도록.
SELECT 부서, 성별, AVG(연봉)
FROM 직원테이블
GROUP BY 부서, 성별
HAVING MIN(연봉)>150;