- 0
- 186 단어
GROUP BY는 SQL에서 특정 컬럼의 값이 같은 데이터를 하나의 그룹으로 묶어 조회할 때 사용하는 구문입니다. 단순히 데이터를 조회하거나 정렬하는 것과 달리 여러 데이터를 기준에 따라 묶은 뒤 그룹별 개수, 합계, 평균, 최댓값, 최솟값 등을 확인할 수 있습니다. 따라서 매출 현황이나 회원 통계처럼 데이터를 집계하고 분석해야 하는 상황에서 자주 사용됩니다.
GROUP BY의 기본 개념
데이터베이스에는 같은 값을 가진 데이터가 여러 개 존재하는 경우가 많습니다. 예를 들어 회원 테이블에 지역 정보가 저장되어 있다면 서울, 부산, 대구 등 동일한 지역에 여러 명의 회원이 존재할 수 있습니다.
이때 전체 회원 데이터를 단순하게 조회하는 것이 아니라 지역별로 몇 명의 회원이 있는지 확인하려면 GROUP BY를 사용할 수 있습니다.
SELECT city
FROM member
GROUP BY city;
위 쿼리는 member 테이블의 city 컬럼을 기준으로 데이터를 그룹화합니다. 같은 지역에 해당하는 데이터는 하나의 그룹으로 묶이므로 결과에는 중복되지 않는 지역이 표시됩니다.
GROUP BY는 일반적으로 집계 함수와 함께 사용할 때 더욱 유용합니다. 대표적인 집계 함수에는 COUNT(), SUM(), AVG(), MAX(), MIN() 등이 있습니다.
예를 들어 지역별 회원 수를 확인하려면 다음과 같이 작성할 수 있습니다.
SELECT city, COUNT(*)
FROM member
GROUP BY city;
이 쿼리는 회원 데이터를 지역별로 그룹화한 뒤 각 그룹에 포함된 데이터의 개수를 계산합니다. 따라서 단순히 회원 목록을 확인하는 것이 아니라 지역별 회원 수를 한눈에 확인할 수 있습니다.
GROUP BY에서 중요한 점은 데이터를 실제로 변경하거나 합치는 것이 아니라 조회 과정에서 같은 값을 가진 행을 논리적인 그룹으로 묶는 것이라는 점입니다.
집계 함수와 함께 사용하기
GROUP BY는 집계 함수와 함께 사용할 때 가장 많이 사용됩니다. 집계 함수는 여러 행의 데이터를 계산하여 하나의 결과값으로 만들어주는 함수입니다.
COUNT()는 데이터의 개수를 계산합니다.
SELECT city, COUNT(*) AS member_count
FROM member
GROUP BY city;
SUM()은 숫자 데이터의 합계를 계산할 때 사용합니다. 예를 들어 주문 테이블에서 지역별 판매 금액을 확인할 수 있습니다.
SELECT city, SUM(price) AS total_price
FROM orders
GROUP BY city;
이 쿼리는 같은 지역의 주문을 하나의 그룹으로 묶고 해당 지역의 주문 금액을 모두 더합니다.
AVG()는 평균을 계산할 때 사용합니다.
SELECT city, AVG(price) AS average_price
FROM orders
GROUP BY city;
이렇게 하면 지역별 평균 주문 금액을 확인할 수 있습니다.
MAX()와 MIN()을 이용하면 각 그룹에서 가장 큰 값과 가장 작은 값을 확인할 수 있습니다.
SELECT city, MAX(price) AS max_price, MIN(price) AS min_price
FROM orders
GROUP BY city;
위 쿼리는 지역별로 가장 비싼 주문과 가장 저렴한 주문 금액을 조회합니다.
이처럼 GROUP BY는 특정 기준으로 데이터를 묶고 집계 함수를 적용하여 그룹별 통계를 만드는 데 사용됩니다. 실제 쇼핑몰이나 기업의 데이터 분석에서도 지역별 매출, 상품별 판매량, 부서별 직원 수 등 다양한 형태로 활용할 수 있습니다.
WHERE와 ORDER BY와 함께 사용하기
GROUP BY는 앞에서 배운 WHERE와 ORDER BY와 함께 사용할 수도 있습니다. 각각의 역할을 구분하면 SQL의 실행 흐름을 이해하기 쉽습니다.
WHERE는 그룹을 만들기 전에 조회할 데이터를 먼저 제한하는 역할을 합니다. 예를 들어 2026년에 발생한 주문만 대상으로 지역별 매출을 계산하려면 다음과 같이 작성할 수 있습니다.
SELECT city, SUM(price) AS total_price
FROM orders
WHERE order_date >= '2026-01-01'
GROUP BY city;
이 경우 2026년 1월 1일 이후의 주문만 대상으로 지역별 매출을 계산합니다. 즉, WHERE 조건에 맞는 데이터가 먼저 선택되고 선택된 데이터가 GROUP BY에 의해 그룹으로 묶입니다.
GROUP BY를 사용한 결과를 다시 정렬하고 싶다면 ORDER BY를 사용할 수 있습니다.
SELECT city, SUM(price) AS total_price
FROM orders
GROUP BY city
ORDER BY total_price DESC;
위 쿼리는 지역별 매출을 계산한 뒤 매출이 높은 지역부터 정렬합니다.
여기서 GROUP BY와 ORDER BY의 차이를 구분하는 것이 중요합니다. GROUP BY는 데이터를 특정 기준으로 묶는 역할을 하고, ORDER BY는 만들어진 조회 결과를 원하는 순서로 정렬하는 역할을 합니다.
또한 여러 컬럼을 기준으로 그룹화하는 것도 가능합니다.
SELECT city, product_name, COUNT(*) AS order_count
FROM orders
GROUP BY city, product_name;
이 경우 단순히 지역별로 묶는 것이 아니라 지역과 상품명을 함께 기준으로 그룹을 만듭니다. 따라서 같은 지역에서 같은 상품이 주문된 데이터를 하나의 그룹으로 묶어 주문 건수를 계산할 수 있습니다.
GROUP BY는 데이터가 많아질수록 더욱 중요한 역할을 합니다. 수천 개 또는 수백만 개의 데이터를 하나씩 확인하는 대신 특정 기준으로 데이터를 그룹화하면 전체적인 현황을 빠르게 파악할 수 있기 때문입니다.
다만 GROUP BY는 단순히 중복된 데이터를 제거하기 위한 용도로 사용하는 구문은 아닙니다. 중복되지 않는 값을 확인하는 것이 목적이라면 DISTINCT를 사용할 수 있으며, GROUP BY는 일반적으로 집계 함수와 함께 사용하여 그룹별 통계나 분석 결과를 만드는 데 더 적합합니다.
결국 GROUP BY는 SQL에서 여러 행을 특정 기준에 따라 그룹으로 묶고, 각 그룹에 대한 개수나 합계, 평균 등의 통계 정보를 확인하기 위한 구문입니다. WHERE가 조회할 데이터를 제한하고 ORDER BY가 결과의 순서를 정한다면, GROUP BY는 데이터를 분석하기 위한 단위로 묶어주는 역할을 합니다. 이러한 차이를 이해하면 이후에 배우게 될 HAVING과 같은 그룹 조건 구문도 보다 쉽게 이해할 수 있습니다.