그룹화

Hyun-jin Won·2021년 10월 18일
0

MySQL로 SQL 시작하기

목록 보기
19/24
post-thumbnail

특정 항목으로 데이터를 묶어보자

앞전 집계합수를 통해서 데이터의 갯수를 특정할 수 있었다. 그렇다면 이번에는 데이터의 그룹에 따라 개수를 구하는 것은 가능할까? 각 지역별 인구수나, 남학생-여학생의 학생 수 등을 구할 때 처럼 말이다. GROUP BY는 이러한 상황에서 도움이 된다.

SELECT 
    c1, c2,..., cn, 집계함수(ci)
FROM
    table
WHERE
    where_conditions
GROUP BY c1 , c2,...,cn;

해당 처럼 GROUP BY는 WHERE 문장 뒤에 오게 되며, 여러개의 컬럼을 지정할 수도 있다.
해당 GROUP BY에 지정된 컬럼들로 집합을 만들어 데이터를 반환하며, 집계 함수 등을 사용하지 않고 단순히 컬럼 하나만 넣게 된다면 중복을 제거하게 되는 DISTINCT와 동일하게 작동된다.

HAVING

집계함수는 WHERE문에서 사용이 불가능하다. WHERE => GROUP BY => SELECT(집계함수) 순으로 동작하기 때문이다. 이러한 이유로 집계함수나 GROUP BY에 의해 생성된 컬럼이나 데이터는 HAVING을 통해서 조건을 처리해야 한다.

SELECT 
    c1, c2,..., cn, 집계함수(ci)
FROM
    table
WHERE
    where_conditions
GROUP BY 
	c1 , c2,...,cn
HAVING having_conditions

실제 처리 방식은 WHERE => GROUP BY => HAVING => SELECT => ORDER BY로 동작하기 때문에 GROUP BY에서 생성된 데이터는 HAVING에서 사용 가능하다.

DISTINCT vs GROUP BY

특정 조건 하에 DISTINCT GROUP BY 모두 중복된 데이터를 삭제한다는 점에서 동일한 기능을 가진다. 재미있는 점은 실제로 간단한 예제로 쿼리계획을 실행해보면 동일한 작업을 실행하게 된다는 점이다. 단 차이점이 있다면 목적의 용도가 다르며, DISTINCT는 정렬 작업을 신경쓰지 않는다는 점이다. 그러므로 만약 단순히 중복제거를 위한 용도라면 성능상이든, 목적상이든 DISTINCT가 올바른 선택이고, 그렇지 않고 그룹화과 목적이라면 GROUP BY가 올바른 선택이 될 것이다.

profile
삽질을 주체하지 못하는 잉간

0개의 댓글