이번 글에서는 그룹화와 관련된 group by, 그리고 이에 대한 조건절인 having에 대해 알아보겠습니다.


1. 그룹화

GROUP BY 명령어를 통해 특정 컬럼을 기준으로 그룹화 할 수 있습니다.

그룹화를 하면 조회된 데이터를 통계를 내기 위한 집계함수( avg, sum 등.. )를 사용하기에 용이해집니다.


위와 같은 테이블이 있을 때,

아래는 name 컬럼을 기준으로 그룹화 하여 집계함수( COUNT(name), SUM(quantity) )를 실행하는 예제입니다.

# SELECT name, COUNT(name), SUM(quantity) FROM test_table GROUP BY name;

그 결과는 다음과 같이 name으로 그룹화 한 후, 집계를 실행합니다.


GROUP BY로 그룹화 하지 않은 컬럼은 SELECT 해도 정확한 데이터가 나오지 않습니다.

즉, 그룹화 하지 않은 컬럼은 집계함수를 통해서만 조회하도록 해야 합니다.

아래는 그룹화 컬럼이 아닌 quantity 컬럼도 조회하는 경우의 예제입니다.

# SELECT name, quantity, COUNT(name), SUM(quantity) FROM test_table GROUP BY name;



다음은 GROUP BY 절과 정렬( ORDER BY )를 함께 실행한 예시입니다.

# SELECT name, COUNT(name), SUM(quantity) FROM test_table GROUP BY name ORDER BY SUM(quantity) DESC;
  • SELECT 쿼리 조회 순서에 따르면, ORDER BY는 GROUP BY보다 나중에 실행됩니다.
  • 수행 순서는 아래와 같습니다.
    1. FROM
    2. WHERE
    3. GROUP BY
    4. HAVING
    5. ORDER BY
    6. SELECT
    7. LIMIT


참고로 GROUP BY 명령어를 보면 그룹화된 컬럼이 유일하다는 것을 알 수 있습니다.

위 예에서, name 컬럼 값이 item1인 데이터가 2개 있지만, GROUP BY 명령어 실행 후, 1개 밖에 없습니다.

이렇게 중복을 제거하는 DISTINCT 명령어가 있는데, GROUP BY와 사용 용도가 다릅니다.

즉, 보신 바와 같이 GROUP BY는 집계를 위한 용도로 사용하는 것이 좋고, DISTINCT는 단순히 중복제거를 통한 조회를 하는데 사용하는 것이 좋습니다.





2. HAVING

GROUP BY 절에서 조건을 주려면 WHERE가 아닌, HAVING 절을 사용해야 합니다.

SELECT 실행 순서를 보면, WHERE 절이 GROUP BY 보다 먼저 실행되기 때문에, GROUP BY에 대응되는 HAVING절이 있습니다.


HAVING 은 GROUP BY 뒤에 작성하며, WHERE와 동일한 형식으로 조건절을 작성할 수 있습니다.

아래는 name 컬럼을 기준으로 그룹화 하는데, 그룹화한 항목의 개수가 1인 데이터들만 조회하는 예제입니다.

# SELECT name, COUNT(name) FROM test_table GROUP BY name HAVING COUNT(name) = 1;




이상으로 그룹화를 하는 GROUP BY, 그리고 그룹에 대한 조건절을 사용하는 HAVING에 대해 알아보았습니다.